java实验报告.docx
《java实验报告.docx》由会员分享,可在线阅读,更多相关《java实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
java实验报告
Java上机实验报告
姓名:
班级:
学号:
日期:
指导老师:
-----------------------------------目录---------------------------------
1、实验目的------------------------------------------------------2
2、实验开发环境和工具--------------------------------------------2
3、实验内容------------------------------------------------------2
4、问题描述------------------------------------------------------3
5、需求和规格说明------------------------------------------------3
6、概要设计------------------------------------------------------3
7、详细设计流程图------------------------------------------------18
8、游戏截图------------------------------------------------------26
9、调试报告------------------------------------------------------29
10、讨论分析-----------------------------------------------------29
11、体会---------------------------------------------------------32
一、实验目的
1.了解和掌握Java基本概念和语法
2.了解和掌握Java图形界面编程的基本概念和用法
3.了解和掌握Java事件编程的基本概念和用法
4.了解和掌握JavaIO基本功能和用法
二、实验开发环境和工具
Windows操作系统开发环境,可使用集成开发环境Jcreator,使用Java语言,工具包使用JDK1.7。
三、实验内容
设计一个基于图形界面、事件编程、IO的小软件,实现一个具有图形界面和进度存盘功能的小游戏(例如字母游戏、俄罗斯方块、坦克大战等)或者具有图形界面和存储聊天记录功能的聊天软件。
也可以实现任意其他形式的小软件(但必须具备图形界面,能够响应用户事件,并且具有存盘功能,拓展所实现的小软件,增加网络通信的功能。
四、问题描述
设计一个窗口贪吃蛇游戏,实现一只人为操动的小蛇努力寻找猎物。
游戏设置关卡,当捕食到一定猎物之后,游戏难度增加,小蛇的移动速度加快,蛇的长度代表其捕食猎物的数量。
五、需求和规格说明
利用函数使蛇的移动速度加快,利用多线程的方法设计游戏,当游戏成功或者游戏失败时,出现弹窗提示游戏进程。
利用鼠标事件,键盘事件操控小蛇,在面板上绘出游戏框图。
六、概要设计
需要用到的类:
客户端:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.JOptionPane;
import.Socket;
importjavax.swing.JButton;
importjavax.swing.JFrame;
主类:
publicclassKingSnake
{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
newMyWindow();}}
用来辅助功能实现的类:
classabc{
staticinta=5,i=1;
staticlongb=100;
staticbooleangg=false;
staticbooleanbg=true;
}
自定义面板类,继承了键盘和线程接口,实现用键盘控制蛇,及游戏通关等进程
classMyPanelextendsPanelimplementsKeyListener,Runnable
{
abcqt=newabc();//再次声明辅助函数
Buttonsnake[];//定义蛇按钮
intshu=0;//蛇的节数
intfood[];//食物数组
Threadthread;//定义线程
staticintweix,weiy;//食物位置
intfangxiang=0;//蛇移动方向
intx=0,y=0;//蛇头位置
MyPanel()//定义蛇体和食物并为蛇头添加键盘监视器
{
setLayout(null);
snake=newButton[20];
food=newint[20];
thread=newThread(this);
for(intj=0;j<99;j++)
{
food[j]=(int)(Math.random()*20);//定义20个随机食物
}
weix=(int)(food[0]*0.1)*60;//十位*60为横坐标
weiy=(int)(food[0]%10)*40;//个位*40为纵坐标
for(inti=0;i<20;i++)
{
snake[i]=newButton();
}
add(snake[0]);
snake[0].setBackground(Color.black);
snake[0].addKeyListener(this);//为蛇头添加键盘监视器
snake[0].setBounds(0,0,10,10);
setBackground(Color.cyan);
}
publicvoidrun()//接收线程
{
while(t)
{
if(fangxiang==0)//向右
{
try
{
thread.sleep(qt.b);
x+=qt.a;
snake[0].setLocation(x,y);//设置蛇头位置
if(x==weix&&y==weiy)//蛇头位置与食物位置一样,吃到食物
{
shu++;
weix=(int)(food[shu]*0.1)*60;
weiy=(int)(food[shu]%10)*40;
repaint();//重绘下一个食物
add(snake[shu]);//增加蛇节数和位置
snake[shu].setBounds(snake[shu-1].getBounds());
}
thread.sleep(qt.b);//睡眠qt.bms
}
catch(Exceptione){}
}
elseif(fangxiang==1)//蛇头向左移动
{
try
{
thread.sleep(qt.b);
x-=qt.a;
snake[0].setLocation(x,y);
if(x==weix&&y==weiy)
{
shu++;
weix=(int)(food[shu]*0.1)*60;
weiy=(int)(food[shu]%10)*40;
repaint();
add(snake[shu]);
snake[shu].setBounds(snake[shu-1].getBounds());
}
thread.sleep(qt.b);
}
catch(Exceptione){}
}
elseif(fangxiang==2)//向上
{
try
{
thread.sleep(qt.b);
y-=qt.a;
snake[0].setLocation(x,y);
if(x==weix&&y==weiy)
{
shu++;
weix=(int)(food[shu]*0.1)*60;
weiy=(int)(food[shu]%10)*40;
repaint();
add(snake[shu]);
snake[shu].setBounds(snake[shu-1].getBounds());
}
thread.sleep(qt.b);
}
catch(Exceptione){}
}
elseif(fangxiang==3)//向下
{
try
{
thread.sleep(qt.b);
y+=qt.a;
snake[0].setLocation(x,y);
if(x==weix&&y==weiy)
{
shu++;
weix=(int)(food[shu]*0.1)*60;
weiy=(int)(food[shu]%10)*40;
repaint();
add(snake[shu]);
snake[shu].setBounds(snake[shu-1].getBounds());
}
thread.sleep(qt.b);
}
catch(Exceptione){}
}
intnum1=shu;
while(num1>1)
{
if(snake[num1].getBounds().x==snake[0].getBounds().x&&snake[num1].getBounds().y==snake[0].getBounds().y)//判断是否咬自己的尾巴
{
qt.bg=false;
}
num1--;
}
if(x<0||x>=this.getWidth()||y<0||y>=this.getHeight())//判断是否撞墙
{
t=false;
result=false;
qt.bg=false;
repaint();
}
intnum=shu;
while(num>0)//设置蛇节位置
{
snake[num].setBounds(snake[num-1].getBounds());
num--;
}
if(shu==7)//如果蛇节数等于7则胜利
{
t=false;
result=true;
qt.gg=true;
repaint();
}
}
}
publicvoidkeyPressed(KeyEvente)//按下键盘方向键
{
if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键
{
if(fangxiang!
=1)//如果先前方向不为左
fangxiang=0;
}
elseif(e.getKeyCode()==KeyEvent.VK_LEFT)
{if(fangxiang!
=0)
fangxiang=1;
}
elseif(e.getKeyCode()==KeyEvent.VK_UP)
{if(fangxiang!
=3)
fangxiang=2;
}
elseif(e.getKeyCode()==KeyEvent.VK_DOWN)
{if(fangxiang!
=2)
fangxiang=3;
}
}
publicvoidkeyTyped(KeyEvente)
{
}
publicvoidkeyReleased(KeyEvente)
{
}
publicvoidpaint(Graphicsg)//在面板上绘图
{
intx1=this.getWidth()-1;
inty1=this.getHeight()-1;
g.setColor(Color.red);
g.fillOval(weix,weiy,10,10);//食物
g.drawRect(0,0,x1,y1);//墙
if(qt.bg==false)
{g.drawString("游戏失败!
",250,200);//输出游戏失败
intoption=JOptionPane.showConfirmDialog(null,"游戏失败,是否继续","是否继续",JOptionPane.YES_NO_OPTION);//设置确认消息框
if(option==JOptionPane.YES_OPTION)//选择确认按钮
{
qt.bg=true;
newMyWindow();
}elseif(option==JOptionPane.NO_OPTION)//选择取消按钮
{
System.exit(0);//退出游戏
}
}
if(qt.gg==true)
{g.drawString("恭喜过关",250,200);//输出游戏成功
intoption=JOptionPane.showConfirmDialog(null,"恭喜过关","是否继进入下一关",JOptionPane.YES_NO_OPTION);
if(option==JOptionPane.YES_OPTION){
qt.gg=false;
qt.b=qt.b/4;
qt.i++;
newMyWindow();
}elseif(option==JOptionPane.NO_OPTION){
System.exit(0);
}}
}
}
自定义窗口类,控制程序启动
classMyWindowextendsFrameimplementsActionListener{
MyPanelmy;
Buttonbtn;
Panelpanel;
MyWindow()
{
super("KingSnake");
my=newMyPanel();
btn=newButton("begin");
panel=newPanel();
btn.addActionListener(this);
panel.add(newLabel("欢迎来到第关begin后请按Tab键选定蛇"));
panel.add(btn);
panel.add(newLabel("按上下左右键控制蛇行动"));
add(panel,BorderLayout.NORTH);
add(my,BorderLayout.CENTER);
setBounds(100,100,610,500);
setVisible(true);
validate();
addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
}
publicvoidactionPerformed(ActionEvente)//按下begin按钮
{
if(e.getSource()==btn)
{
try
{
my.thread.start();//开始线程
my.validate();
}
catch(Exceptionee){}
}
}}
实现通信功能代码:
classSnakeextendsJFrameimplementsActionListener{
privateJButtonbtConnect=newJButton("连接");
@SuppressWarnings("unused")
privateSocketsocket;
publicSnake(){
super("客户端aaa");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(btConnect,BorderLayout.NORTH);
btConnect.addActionListener(this);
this.setSize(300,100);
this.setVisible(true);
}
publicvoidactionPerformed(ActionEvente){
try{
socket=newSocket("127.0.0.1",9999);
this.setTitle("连接成功,您的分数为"+MyPanel.score);
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
服务器代码:
import.ServerSocket;
import.Socket;
importjavax.swing.JFrame;
@SuppressWarnings("serial")
publicclassServerextendsJFrame{
privateServerSocketss;
privateSocketsocket;
publicServer(){
super("服务器端,目前未见链接");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300,100);
this.setVisible(true);
try{
ss=newServerSocket(9999);
socket=ss.accept();
StringclienAddress=socket.getInetAddress().getHostAddress();
this.setTitle("客户"+clienAddress+"连接");
}catch(Exceptionex){
ex.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
newServer();
}
}
七、详细设计流程图
publicstaticvoidmain(String[]args){
newMyWindow();
}
----------------------------------------------------------------------------------------------------
if(x<0||x>=this.getWidth()||y<0||y>=this.getHeight())//判断是否撞墙
{
t=false;
result=false;
qt.bg=false;
repaint();
}
intnum=shu;
while(num>0)//设置蛇节位置
{
snake[num].setBounds(snake[num-1].getBounds());
num--;
}
if(shu==7)//如果蛇节数等于7则胜利
{
t=false;
result=true;
qt.gg=true;
repaint();
}
}
}
-----------------------------------------------------------------------------------------------------------------------
publicvoidkeyPressed(KeyEvente)//按下键盘方向键
{
if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键
{
if(fangxiang!
=1)//如果先前方向不为左
fangxiang=0;
}
elseif(e.getKeyCode()==KeyEvent.VK_LEFT)
{if(fangxiang!
=0)
fangxiang=1;
}
elseif(e.getKeyCode()==KeyEvent.VK_UP)
{if(fangxiang!
=3)
fangxiang=2;
}
elseif(e.getKeyCode()==KeyEvent.VK_DOWN)
{if(fangxiang!
=2)
fangxiang=3;
}
}
if(option==JOptionPane.YES_OPTION){
qt.bg=true;
newMyWindow();
}elseif(option==JOptionPane.NO_OPTION){
System.exit(0);
}
}
if(qt.gg==true)
{g.drawString("YOUWIN!
",250,200);//输出游戏成功
intoption=JOptionPane.showConfirmDialog(null,"恭喜过关","是否继进入下一关",JOptionPane.YES_NO_OPTION);
if(option==JOptionPane.YES_OPTION){
qt.gg=false;
qt.b=qt.b/4;
qt.i++;
newMyWindow();
}elseif(option==JOptionPane.NO_OPTION){
System.exit(0);
}}
}
publicvoidactionPerformed(ActionEvente)//按下begin按钮
{
if(e.getSource()==btn)
{
try
{
my.thread.start();//开始线程
my.validate();
}
catch(Exceptionee){}
}
}}
MyPanel()
{
setLayout(null);
snake=newButton[20];
food=newint[20];
thread=newThread(this);
for(intj=0;j<99;j++)
{
food[j]=(int)(Math.random()*99);//定义20个随机食物