JAVA语言写的坦克大战详细说明书.docx
- 文档编号:6059441
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:11
- 大小:20.72KB
JAVA语言写的坦克大战详细说明书.docx
《JAVA语言写的坦克大战详细说明书.docx》由会员分享,可在线阅读,更多相关《JAVA语言写的坦克大战详细说明书.docx(11页珍藏版)》请在冰豆网上搜索。
JAVA语言写的坦克大战详细说明书
陕西国防学院
《Java语言》课程期末实训
题目坦克大战
学院电子信息学院
专业软件技术
班别软件3132班
学号3531323X
姓名小智
2015年3月6日
一、课程题目
坦克大战(Java版本)
实现一个java版本的坦克大战游戏
【功能提示】
1.游戏要有图形用户界面,界面能够反映游戏所有的细节。
2.界面中要有坦克,墙,树林,河流。
3.界面中要有一个“家”,“家”被攻击中则输了游戏。
4.坦克分两种,敌方和我方。
5.墙也分为两种,可以穿透的普通墙,不可以穿透的铁墙。
6.树和河流均只有一种,树林坦克可以通过。
7.坦克可以发射子弹,敌我方的子弹属性一样。
8.我方子弹可以杀死敌方坦克,敌方子弹也可以杀死我方坦克,但需要多枪子弹才可以杀死。
9.敌方之间不可以杀死对方。
10.子弹击中坦克要有爆炸,但击中墙不能爆炸。
11.我方可以吃血包增加生命。
12.游戏可以暂停,重新开始,游戏帮助等功能。
具体如下图:
二、题目分析与设计
需求分析
1.设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。
用户可以选择重新开始游戏,退出游戏,暂停游戏和查找游戏帮助。
2.界面中包含坦克,树,河流,阻挡墙和游戏用户所要保护的“家”。
3.坦克:
坦克分为两种,敌方坦克和用户控制的坦克。
用户方和敌方坦克均可以发射子弹,可以改变路径的行走,且在行走过程中遇到墙等阻碍物和游戏边界时要改变方向,而不能一直顶着障碍物不放。
坦克之间不能穿越,碰撞到后自动调换方向。
4.树:
界面中要包括树林,作为遮掩物体和修饰物体,以便增加游戏的元素,使得游戏更加贴切人性化。
树的数目不限,以游戏整体界面清晰美观来决定数目。
5.河流:
界面中要包括河流,河流作用与树林相同,同样河流的数目不限,以游戏界面整体美观度来决定数目。
6.墙:
墙体分为两种,普通的墙和铁墙,普通的墙在受到子弹袭击时会损坏,而铁墙可以阻碍子弹的穿越。
两方的坦克均不能穿越两种墙体,但都可以摧毁普通墙体。
普通墙体的数目配合其他元素合理安排,铁墙则不宜过多,不然游戏难度太低甚至因为坦克不能穿越铁墙而使得游戏无法进行下去。
7.“家”:
用户方除了有一辆自己的坦克外还有一个要保护的家,家由普通墙体包围,家受到子弹攻击后游戏立即结束,用户方则输了本局游戏。
8.子弹:
子弹可以由敌方和用户方发射,且发射出去的子弹可以直线移动,直到碰到障碍物就消失,子弹可以穿越树林和河流。
敌方坦克受到一颗子弹攻击会爆炸从而导致死亡,死亡后坦克消失。
用户方受到子弹攻击后会减少寿命,且受到四次攻击则死亡,此时如还有敌方坦克存在,则用户方输掉本次游戏。
9.爆炸:
当子弹射击到坦克身上时,要产生爆炸效果。
10.方向:
坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。
具体设计
以下的论述均根据上面需求分析的顺序来安排:
1.图形用户界面
图形用户界面要用到Java课程里的第六章的知识,需要用到抽象窗口工具集即AWT和Swing来设计实现,由于游戏需要有功能按键来控制游戏的重新开始,退出,暂停,帮助等,所以在实现过程中,设计菜单项。
坦克,河流,树,家,墙等都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。
界面的构造在程序中由TankClient类的构造方法来完成,即没构造一个用户类都会产生这样一个包含各种游戏元素在内的界面。
由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的普通墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。
在程序中,此部分功能也是由TankClient类里的update函数和framPaint函数共同实现,将“动”的元素进行重画,而不动的元素如菜单项就不用重画,所以这也是为什么把菜单项设计进TankClient类的构造方法中。
当然,图形用户界面中也包括对各种界面元素的大小,位置和颜色等设计,细节问题这里就不赘述。
2.界面中的元素
界面中的元素都是在构造界面的时候用界面实例对象的add方法加入进去的,且“动”的元素要不断更新重画。
3.坦克
坦克主要由Tank类来实现。
坦克的属性:
速度(有X轴和Y轴速度之分),坦克大小,坦克所在新的位置(X坐标和Y坐标),坦克是否还活着,行动方向等。
所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行。
在设计过程中,坦克出现的位置由坐标而定。
用户方之后的位置由键盘监听方向,按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。
敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题,这个功能由Tank类里的changToOldDir()方法实现。
坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。
Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到F,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。
由于坦克在碰到墙,界面边界和“家”等阻碍物时要改变方向,所以在Tank里面必须对于每一种阻碍物要设计一个方法来作为应对策略,当然解决方法是把下一步的位置调整到上一步的位置。
用户方Tank还可以吃红心来增加自己的生命值,得到一个红心,增加100生命值。
所以在程序中坦克必须要有一个方法来判断当坦克接触到红心时,生命值增加的方法。
程序中用eat()方法来实现“吃”红心并且增加生命值,当然,这其中要使得坦克的生命值不会超过自己生命的极限值200,所以判断的时候,当生命小于等于100时,直接加100生命值,但是当生命值大于100时,就只能使生命值加满到极限值200.当然,说到生命值,一定要在图形用户界面中显示出来,所以在Tank类里面一定要设计一个方法,来画出生命的增减过程,在Tank类里面是用DrawBloodbBar()来刻画。
4.树林
树林主要是用来做修饰物体的,具有不透明性。
由一个Tree类来描述,Tree有两个属性,位置和长宽。
树的类里有一个自己的构造方法,当然还有一个必不可少的draw()方法。
5.河流
河流的作用与树林类似,这里不再赘述。
6.墙体
墙体分为普通墙和铁墙。
普通墙可以被子弹损坏,而铁墙则不会。
普通墙
普通墙有以下几个属性:
墙的固定长度和宽度,墙的位置坐标,墙体是由图片加入到图形用户界面来表示的。
程序中用CommonWall类来描述普通墙,此类里有一个构造方法,用于传递参数,还有一个draw()方法,来画指定位置的墙,另外还有个getRect()方法来构造长方形实例。
金属墙
金属墙的参数和普通墙完全类似,只不过金属墙不能被子弹穿破,但这个属性在接下来讨论的子弹的属性里面,由于上面已经给出里普通墙的属性,所以这里将不再赘述金属墙的属性了。
7.家:
家是由Home类来抽象的,具体的属性有:
家的大小,家的位置,家的存活状态,与树林和河流一样,家还有draw()和自己的构造方法,作用也和前面的一样,但是家还有一些新的方法,因为可以在游戏中重新开始游戏,所以要有设置方法让家重新“活”起来,当然,有时候要判断家现在的存活状态,所以就必须要isLive()和setLive()两个方法了。
除此之外,还要有一个游戏结束界面的清理工作和提示工作,gameover()方法就是解决这个问题的。
8.子弹:
子弹的属性:
子弹前进的X轴和Y轴的速度——初始速度都为10,子弹的长度和宽度——初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。
由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。
如:
("L",bulletImages[0]);
类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。
darw()方法和move()方法来控制画子弹和移动子弹
接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接returntrue就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果。
具体代码:
publicbooleanhitTanks(List
=false;
ntersects())){
=false;
returntrue;
}
returnfalse;
}
修改后的代码段:
publicbooleanhitWall(MetalWallw){ntersects())){
=false;
returntrue;
}
returnfalse;
}
修改后的效果:
从下图可以看出,修改后金属墙也可以被摧毁!
1.血包效果图:
血包会随机的移动,以下是血包所在的两次不同位置:
所在位置1:
所在位置2:
2.坦克吃血包增加生命值测试;
没有吃血包前:
可以看出血包在用户方附近,当用户方去接近血包时,就可以增加生命值。
吃完血包后加满生命值:
3.当家被攻击后结束游戏:
游戏结束是调用gameover()方法,在方法里面会清除所有的页面元素。
4.快捷键的测试:
R键为重置游戏:
如下为重新开始后的页面:
提示:
由于上下左右和开火等快捷方式键都是动态的效果,所以这里不方便给出,用户可以自行测试!
5.坦克撞击边缘的效果:
撞击前:
撞击后:
提示:
这里只给出撞击边缘的效果,其他坦克撞击坦克,家,普通墙,金属墙等效果用户可以自行测试!
6.用户赢得游戏后的效果测试:
注释:
由于坦克大战的画面都是动态的,所以不可能全部截图来测试每一个功能,如有需要,用户可以自行测试。
下面改变程序中的一些典型的数据,看修改后的效果:
典型数据测试:
1.家的位置测试:
由于程序中的界面位置是严格嵌套设计的,即家是刚好落在它外面的一层保护墙能,当修改家原来的位置参数Homehome=newHome(373,545,this);后,会走出达不到预期的效果:
如下图:
图示为把373改为了450后的效果!
2.坦克全局静态速度的改变:
坦克的全局速度原来是x轴方向为6,y轴方向为6,修改后,坦克的前进速度会加快,当然这样一来可以加大游戏的难度,可以作为游戏的扩展功能来实现,由于坦克的速度是动态的,这里无法测试,用户可以在Tank类里修改speedX和speedY来测试。
子弹的速度的性质同坦克相同,这里不再赘述。
3.墙体的部分测试:
改变墙体的界面布局:
如改变普通墙的界面布局,是界面中没有普通墙,只要将程序中的如下代码屏蔽掉就可以了:
for(inti=0;i<32;i++){
if(i<16){
4.(newCommonWall(220+20*i,300,this));子弹撞击其他物体如坦克的改变:
当改变子弹射击坦克的方法时,如将子弹射击到坦克,不将坦克的生命结束,则游戏将永远打下去,谁都打不死谁.改变Bullets类里的hittank方法里的(false);语句,只要将这个语句中的false改为true就可以了,当然对于其他的hit*方法,也只要作相应的修改就可以了。
完善功能:
已完善的功能:
A.血包可以让我们知道还剩下多少生命值,但是有时候不是很直观,所以在界面中加入一行信息来实时更新用户坦克的生命值,让用户有直观的感觉。
修改后的效果如下图:
B.游戏级别的设置
游戏的级别只做了简单的级别设置,可以设置四个级别,级别1,级别2,级别3和级别4,默认进入游戏是级别1,当然可以在游戏的过程中切换级别。
级别的设置主要是把前面的Tank类和Bullets类的全局静态最终变量改成全局静态变量,利用监听来设置坦克的速度和子弹的速度来设置游戏的难度,从而形成了级别的设置。
修改后的画面效果为:
还可以进一步完善的功能:
A.可以为游戏加入声音,由于在尝试的时候失败了,所以程序中就没有来实现这些功能。
B.存储游戏结果。
C.联网功能等
三、附录:
项目名称:
TankWar
TankWar下的包和文件:
Images下的文件:
Src包下的文件:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 语言 坦克 大战 详细 说明书