Java坦克大战设计报告.docx
《Java坦克大战设计报告.docx》由会员分享,可在线阅读,更多相关《Java坦克大战设计报告.docx(113页珍藏版)》请在冰豆网上搜索。
Java坦克大战设计报告
《程序语言综合课程设计》
设计报告
学 院:
信息工程学院
专业班级:
学 号:
3
姓 名:
指导老师:
完成时间:
2011年7月22日
题目一坦克大战
1.1题目简介
坦克大战是运用java高级编程语言使用MyEclipse8.6实现的一个游戏系统,它具有单人游戏和双人游戏的游戏界面以及对游戏的属性进行编辑的游戏设置对话框。
1.2设计的内容、要求和目标
1.2.1设计内容
本项目的内容包括技术和非技术两大部分:
技术上需要进行数据存储和图片的处理、整个窗口的布局、代码的编写及调试。
非技术部分包括:
人力资源的充分利用。
1.2.2设计要求
(1)设计GUI界面的坦克大战。
坦克大战中有我军坦克一辆,敌军坦克若干。
初始状态是我军坦克位于屏幕正下方,而敌军坦克分布屏幕正上方,敌军坦克可以自由移动并发射子弹,我军坦克可以按“A”,“S”,“D”,“W”键操作我军坦克向不同的四个方向前进,按“J”键可以发射子弹;
(2)程序要求用户在通过按下指定按钮来控制自己的坦克,敌人坦克是随机运动并发射子弹的;
(3)当然用户还可以点击文件菜单选择各种需要的操作;
(4)实现帮助功能,用户有不明白的地方可以查看帮助文档;
(5)实现与数据库的连接,用户使用时必须登录。
1.2.3设计目标
系统应该尽量做到以下的目标:
1)人力与设备费用的减少;
2)采用现代程序设计技术;
3)数据的处理速度提高;
4)管理信息服务的改进;
5)人员利用率尽可能提高;
1.3总体设计
1.3.1系统功能结构图
下面列出了本系统的整体功能结果图以及各个模块之间的彼此联系,见图1-1所示。
图1-1系统各个功能模块之间的联系
说明:
用户根据主界面,在菜单项里可以选择开始游戏,可以开始单人游戏,也可以开始双人游戏,在游戏中倘若你有其他事情要做,你可以选择暂停游戏,当然你还可以选择存盘退出,这样当你以后想再玩没玩完的游戏你就可以选择继续上局游戏,这样你可以接着上次玩的游戏,你还可以选择游戏设置,设置敌人的坦克数量和敌人坦克的速度,以及我军坦克速度,还有你可以设置娱乐方式,你可以选择使用背景音乐,和游戏音效。
1.3.2系统总体流程图
坦克大战的总体流程图见图1-2所示。
图1-2总体流程图
3.3系统所有类之间的关系
系统所有类之间的关系如图1-3所示
图1-3类之间的关系
设计一个系统的时候,把不同功能的具体实现放到不同的类里面,这样便于以后程序的扩展以及修改;类的名称最好是体现出这个类实现的功能,这样可以达到看类名就知道这个类的功能,方便以后程序的维护。
本系统的实现一共用到了以上的12个类,它们之间的关系见图1-3所示,箭头方向代表是被依赖的类,各个类实现了一些单独的功能。
1.4详细设计及实现
1.4.1界面及布局设计
系统的整体布局为:
BorderLayout布局,采用了菜单、按钮、面板…等组件,菜单主要包括选择开始新游戏,暂停游戏,继续上局游戏,存盘退出,退出游戏,游戏设置等功能。
1.4.2开机欢迎画面的实现方法
FirstPanel类是javax.swing包中JPanel容器的一个子类,它主要是重写了paint()方法,先从文本文件里读取数据,然后把数据通过画笔画在画板上,标明FirstPanel类的主要成员变量和方法以及和TankGames类之间组合关系的UML图如图1-4所示。
图1-4FirstPanel类的UML图
以下是UML图中有关数据和方法的详细说明。
1、成员变量
(1)word是WordMove型数据,它是用来改变文字的纵坐标的,使文字动态的画在画板上。
(2)fr是FileReader型数据,它是用来读取文本文件的。
(3)br是BufferedReader型数据,是缓冲输出流,用它来读取fr里面的数据。
(4)str是String型数据,接受读取到得文本文件。
(5)aa是Vector型数据,是类型为字符串类型的集合,用它来装一个个str。
(6)img是Image型数据,是图片类型数据,用来设置背景图片的。
(7)f,f1,f2都是Font类型的数据,用来确定动态显示字的字体。
2、方法
(1)FirstPanel()是构造方法,负责完成FirstPanel容器的初始化。
(2)容器调用paint(Graphicsg)方法可以在画板上把文本文件画出来,以便动态的显示出来。
(3)容器调用show()方法可以将画板上的文字显示出来。
(4)容器调用run()方法可以改变文字的纵坐标,使原本静态的文字运动起来。
综上所述,FirstPanel创建的容器效果如图1-5所示。
图1-5FirstPanel创建的容器
1.4.3单人游戏的实现方法
mypanel类是javax.swing包中JPamel类的子类,所创建的对象是一个面板,面板上有坦克大战的敌我双方坦克,和战场,以及我军消灭敌军数量的标识,标明mypanel类的主要成员变量、方法以及和TankGames类之间组合关系的UML如图1-6所示。
图1-6mypanel类的UML图
以下是UML图中有关数据和方法的详细说明。
1、成员变量
(1)isZanT、isSounds、isMusic都是boolean类型数据,分别确定是否游戏暂停,是否使用背景音乐,是否使用音效。
(2)word是WordMove类型数据,用于制造动态字。
(3)mt,en分别是mytank和enemyTank类型数据,用于在画板上定义敌我双方坦克。
(4)zd,zhd分别是ZDan和ZhaDan类型数据,在画板上定义子弹和炸弹。
(5)image1、imge2、imgae3都是Image类型数据,在击中坦克时,将这三幅图片画出来,制造爆炸效果。
(6)f是Font类型数据,用于定义游戏结束时动态字的字体。
2、方法
(1)mypanel()构造方法,初始化定义的成员变量。
(2)paint(Graphicsg)在画板上画坦克,画子弹,画炸弹等各种作战场面。
(3)addmytank()方法用来增加我军坦克,我军坦克的生命值是3,当我军生命值大于0时,每死一次就增加一辆我军坦克,直至我军坦克生命值为0。
(4)addEnemytank()方法是用来增加敌军坦克,敌军坦克默认情况下是20辆,而战场只允许敌军4辆坦克作战,所以每击毁敌军一辆坦克就会调用此方法增加一辆敌军坦克,直至敌军坦克数量小于或者等于4。
(5)zhanji()方法是用来记录我军击毁坦克数量。
(6)Bomp()方法是在击中坦克时画出爆炸效果。
(7)drawtank()用来在画板上画出敌我双方坦克。
(8)drawzd()用来在画板上画子弹。
(9)shotEnemytank()是在我军发射子弹时调用的,用户按下指定键就会激发此方法。
(10)shotmytank()是敌军发射子弹时调用此方法。
(11)isjizhong()是用来判断子弹是否击中坦克。
(12)GameOver()是在游戏结束时调用的,用来描述游戏结束。
因此mypanel创建的画板的效果如图1-7所示。
图1-7mypanel创建的画板的效果
爆炸效果如下图:
图1-8爆炸效果图
1.4.4添加背景音乐的方法
为了在应用程序中播放音乐,首先根据相应的音频文件创建一个File对象,例如:
Filefile=newFile(“十年.Wav”);
然后,file对象调用toURL()方法返回一个URL对象,例如:
URLurl=file.toURL();
最后,使用Applet类的静态方法返回一个音频对象,例如:
clip=Applet.newAudioClip(url);
1.4.5双人游戏实现的方法
SRen类是javax.swing包中JPamel类的子类,所创建的对象是一个面板,面板上有坦克大战的敌我双方坦克(此时我军坦克数量为2),和战场,以及我军消灭敌军数量的标识,标明SRen类的主要成员变量、方法以及和TankGames类之间组合关系的UML如图1-9所示。
图1-9SRen类的UML图
以下是UML图中有关数据和方法的详细说明。
1、成员变量
(1)isZanT、isSounds都是boolean类型数据,分别确定是否游戏暂停,是否使用音效。
(2)word是WordMove类型数据,用于制造动态字。
(3)myts0life、myts1life都是int类型的数据,分别用来记录我方两辆坦克的生命值。
(4)myts0XM、myts1XM都是int类型的数据,分别来记录我方两辆坦克消灭敌军坦克数量。
(5)zd,zhd分别是ZDan和ZhaDan类型数据,在画板上定义子弹和炸弹。
(6)image1、imge2、imgae3都是Image类型数据,在击中坦克时,将这三幅图片画出来,制造爆炸效果。
(7)f是Font类型数据,用于定义游戏结束时动态字的字体。
2、方法
(1)SRen()构造方法,初始化定义的成员变量。
(2)paint(Graphicsg)在画板上画坦克,画子弹,画炸弹等各种作战场面。
(3)addmytank()方法用来增加我军坦克,我军坦克的生命值是3,当我军生命值大于0时,每死一次就增加一辆我军坦克,直至我军坦克生命值为0。
(4)addEnemytank()方法是用来增加敌军坦克,敌军坦克默认情况下是20辆,而战场只允许敌军4辆坦克作战,所以每击毁敌军一辆坦克就会调用此方法增加一辆敌军坦克,直至敌军坦克数量小于或者等于4。
(5)zhanji()方法是用来记录我军击毁坦克数量。
(6)Bomp()方法是在击中坦克时画出爆炸效果。
(7)drawtank()用来在画板上画出敌我双方坦克。
(8)drawzd()用来在画板上画子弹。
(9)shotEnemytank()是在我军发射子弹时调用的,用户按下指定键就会激发此方法。
(10)shotmytank()是敌军发射子弹时调用此方法。
(11)isjizhong()是用来判断子弹是否击中坦克。
(12)GameOver()是在游戏结束时调用的,用来描述游戏结束。
因此mypanel创建的画板的效果如图1-10所示。
图1-10SRen创建的画板
1.4.6游戏设置方法
FirstDialog是java.swing包中Dialog类的子类,它创建的是一个对话框,此对话框里面主要有选择按钮,滚动条,还有两个按钮。
标明FirstDialog类的主要成员变量、方法以及和TankGames类之间组合关系的UML如图1-11所示。
图1-11SRen类的UML图
以下是UML图中有关数据和方法的详细说明。
1、成员变量
(1)jbl1,jbl2,jbl3,jbl4都是JLabel类型数据,用于提示标签。
(2)jck1,jck2是JCheck类型数据,用来控制音效和背景音乐。
(3)jsc1,jsc2,jsc3都是JScrollBox类型数据,分别用来控制敌军坦克数量,敌军坦克速度,我军坦克速度。
(4)box1,box2,box3,box4都是Box类型数据,用于整体布局。
(5)jp是JPanel类型数据,整体布局需要。
(6)jbt1,jbt2都是JButton数据类型。
2、方法
(1)FirstDialog()构造方法,初始化定义的成员变量。
(2)actionPerformed(Evente)方法用于出来监听事件。
(3)ItemStatechanged(Evente)方法用于处理选择框事件的处理。
因此FirstDialog创建的画板的效果如图1-12所示。
图1-12FirstDialog创建的对话框
1.4.7存盘退出实现方法
本程序是利用输出输入流将战场敌我双方坦克坐标保存到文本文件里面,详细请见下图。
图1-13存盘退出菜单
当点击存盘退出,程序就会在F盘下新建一个文本文件,如:
图1-14保存游戏信息的文本
这时当我们点击继续上局时,又回回到刚才玩的游戏,如:
图1-15继续上局菜单
继续上局后的效果图如下图:
图1-16继续上局效果图
1.4.8运行效果图
系统运行的主界面如图1-17所示
图1-17运行欢迎界面效果图
坦克大战单人游戏效果如图1-18所示
图1-18单人游戏效果图
双人游戏效果如图1-19所示
图1-19双人游戏效果图
菜单选择如图1-20所示
图1-20菜单选择
1.4.9源代码分析
1.开机欢迎界面实现的代码。
publicclassFirstPanelextendsJPanelimplementsRunnable{
publicWordMoveword=null;
FileReaderfr=null;
BufferedReaderbr=null;
Stringstr="";
Vectoraa=null;
Imageimg;
Fontf=newFont("华文姚体",Font.BOLD,25);
Fontf1=newFont("华文姚体",Font.BOLD,35);
Fontf2=newFont("华文彩云",Font.BOLD,150);
publicFirstPanel(){
word=newWordMove(30,340);
word.setHH(500);
word.b=true;
aa=newVector();
this.setBackground(Color.black);
show();
try{
img=ImageIO.read(newFile("123.jpg"));
}catch(IOExceptione){
e.printStackTrace();
}
}
publicvoidpaint(Graphicsg){
super.paint(g);
g.setColor(Color.yellow);
for(inti=0;iStringa=aa.get(i);
if(i==0){
g.setFont(f1);
}elseif(i==24){
g.setFont(f2);
}else{
g.setFont(f);
}
g.drawString(a,word.x,word.HH+(i+1)*50);//画出运动的文字
}
}
publicvoidshow(){
Threadt=newThread(word);
t.start();
try{
fr=newFileReader("Directions.txt");//读取文本文件里面的文字
br=newBufferedReader(fr);
str=br.readLine();
aa.add(str);
while((str=br.readLine())!
=null){
aa.add(str);
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
br.close();
fr.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
publicvoidrun(){
while(true){
try{
Thread.sleep(50);
}catch(InterruptedExceptione){
e.printStackTrace();
}
this.repaint();
}
}
}
2.单人游戏界面的实现代码
publicclassmypanelextendsJPanelimplementsRunnable,KeyListener{
//所有的成员变量
publicbooleanisZanT=false;
publicWordMoveword=null;
publicmytankmt=null;
publicenemyTanken=null;
publicZDanzd=null;
publicstaticbooleanisSounds=true;
publicstaticbooleanismusic=true;
publicZhaDanzhd=null;
intBZ=0;
Imageimage1=null,image2=null,image3=null;
publicVectorenemy=newVector();
publicVectormyt=newVector();
publicVectorZDs=newVector();
Stringstr="击毁敌军坦克数量";
Fontf=newFont("华文新魏",Font.BOLD,20);
publicinttan[]={0,150,300,450};
//构造方法
publicmypanel(Stringn){
Stringss=n;
//新游戏进这
if(ss.equals("First")){
for(inti=0;i<4;i++){
en=newenemyTank(i*150,0,0);
en.setDirect
(2);
Threadtt=newThread(en);
tt.start();
enemy.add(en);
enemyTank.enemy.add(en);
}
}else{
//继续上局进这
for(intj=0;jen=newenemyTank(Record.nodes.get(j).getX(),Record.nodes.get(j).getY(),Record.nodes.get(j).getDirect());
Threadtt=newThread(en);
tt.start();
enemy.add(en);
}
}
word=newWordMove(200,350);
mt=newmytank(200,350,1);
myt.add(mt);
try{
image1=ImageIO.read(newFile("bomb_1.gif"));
image2=ImageIO.read(newFile("bomb_2.gif"));
image3=ImageIO.read(newFile("bomb_3.gif"));
}catch(IOExceptione){
e.printStackTrace();
}
}
//画图
publicvoidpaint(Graphicsg){
super.paint(g);
g.fill3DRect(0,0,700,400,false);
g.setColor(Color.BLUE);
g.drawString("敌军坦克还有"+Record.enemyCount+"辆",600,20);
g.setFont(f);
g.setColor(Color.red);
g.drawString(str,702,30);
//对我军坦克进行处理
addmytank(g);
//显示销毁敌军坦克数
zhanji(g);
//处理敌军坦克
addEnemytank(g);
//炸弹爆炸
Bomp(g);
//游戏结束处理
GameOver(g);
}
//画我的坦克
publicvoidaddmytank(Graphicsg){
for(inti=0;imt=myt.get(i);
drawtank(mt.x,mt.y,1,mt.direct,g);
drawzd(mt,g);
shotEnemy(mt);
}
}
//记录我的成绩
publicvoidzhanji(Graphicsg){
drawtank(740,60,0,0,g);
g.setColor(Color.red);
g.drawString("X"+mt.record.getXMenemy(),800,80);
}
//画敌人的坦克及子弹
publicvoidaddEnemytank(Graphicsg){
for(intj=0;jenemyTankt=enemy.get(j);
if(t.isLive){
drawtank(t.x,t.y,0,t.direct,g);
}
if(t.zx!
=null){
drawzd(t,g);
}
shotmytank(t);
}
if(enemy.size()<4&&Record.enemyCount>=4){
inti=(int)(Math.random()*3);
enemyTankk=newenemyTank(tan[i]+10,0,0);
k.setDirect
(2);
if(!
enemyTank.isContact(k)){
Threadt=newThread(k);
t.start();
this.enemy.add(k);
enemyTank.enemy.add(k);
}
}
}
//爆炸效果
publicvoidBomp(Graphicsg){
for(inti=0;iZhaDanzh=ZDs.get(i);
if(zh.LifeTime>6){
g.drawImage(image1,zh.x