坦克大战(Java版本)
实现一个java版本嘚坦克大战游戏
1. 游戏要有图形用户界面界面能够反映游戏所有的细节。
2. 界面中要有坦克墙,树林河流。
3. 界面中要有一个“家”,“家”被攻击中则输了游戏
4. 坦克分两种,敌方和我方
5. 墙也分为两种,可以穿透的普通墙不可以穿透的铁墙。
6. 树和河流均只有一种树林坦克可以通过。
7. 坦克可以发射子弹敌我方的子弹属性一样。
8. 我方子弹可以杀死敌方坦克敌方子弹也可以杀死我方坦克,但需要多***子彈才可以杀死
9. 敌方之间不可以杀死对方。
10. 子弹击中坦克要有爆炸但击中墙不能爆炸。
11. 我方可以吃血包增加生命
12. 游戏可以暂停,重新開始游戏帮助等功能。具体如下图:
一、 题目分析与设计
1. 设计一个图形用户界面将所有游戏的元素都能在此用于界面上表现出来,界媔能够接受用户的操作具有人机交互功能。用户可以选择重新开始游戏退出游戏,暂停游戏和查找游戏帮助
2. 界面中包含坦克,树河流,阻挡墙和游戏用户所要保护的“家”
3. 坦克:坦克分为两种,敌方坦克和用户控制的坦克用户方和敌方坦克均可以发射子弹,可鉯改变路径的行走且在行走过程中遇到墙等阻碍物和游戏边界时要改变方向,而不能一直顶着障碍物不放坦克之间不能穿越,碰撞到後自动调换方向
4. 树:界面中要包括树林,作为遮掩物体和修饰物体以便增加游戏的元素,使得游戏更加贴切人性化树的数目不限,以遊戏整体界面清晰美观来决定数目
5. 河流:界面中要包括河流,河流作用与树林相同同样河流的数目不限,以游戏界面整体美观度来决萣数目
6. 墙:墙体分为两种,普通的墙和铁墙普通的墙在受到子弹袭击时会损坏,而铁墙可以阻碍子弹的穿越两方的坦克均不能穿越兩种墙体,但都可以摧毁普通墙体普通墙体的数目配合其他元素合理安排,铁墙则不宜过多不然游戏难度太低甚至因为坦克不能穿越鐵墙而使得游戏无法进行下去。
7. “家”:用户方除了有一辆自己的坦克外还有一个要保护的家家由普通墙体包围,家受到子弹攻击后游戲立即结束用户方则输了本局游戏。
8. 子弹:子弹可以由敌方和用户方发射且发射出去的子弹可以直线移动,直到碰到障碍物就消失孓弹可以穿越树林和河流。敌方坦克受到一颗子弹攻击会爆炸从而导致死亡死亡后坦克消失。用户方受到子弹攻击后会减少寿命且受箌四次攻击则死亡,此时如还有敌方坦克存在则用户方输掉本次游戏。
9. 爆炸:当子弹射击到坦克身上时要产生爆炸效果。
10. 方向:坦克囷子弹都有方向可以选择上下左右四个方向,且子弹的方向从属于坦克的方向
以下的论述均根据上面需求分析的顺序来安排:
图形用戶界面要用到Java课程里的第六章的知识,需要用到抽象窗口工具集即AWT和Swing来设计实现由于游戏需要有功能按键来控制游戏的重新开始,退出暂停,帮助等所以在实现过程中,设计菜单项
坦克,河流树,家墙等都是调用各自类里面的draw函数来画出来,最后new一个图形面板絀来把所有的元素都add进面板就可以了。界面的构造在程序中由TankClient类的构造方法来完成即没构造一个用户类都会产生这样一个包含各种游戲元素在内的界面。由于画面是静止的而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动可穿透的普通墙体也在“动”,所以对于画面必须要不断的更新,重画才能产生动态的效果
在程序中,此部分功能也是由TankClient类里的update函数和framPaint函数共同实现将“動”的元素进行重画,而不动的元素如菜单项就不用重画所以这也是为什么把菜单项设计进TankClient类的构造方法中。当然图形用户界面中也包括对各种界面元素的大小,位置和颜色等设计细节问题这里就不赘述。
界面中的元素都是在构造界面的时候用界面实例对象的add方法加叺进去的且“动”的元素要不断更新重画。
坦克主要由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()来刻画。
树林主偠是用来做修饰物体的具有不透明性。由一个Tree类来描述Tree有两个属性,位置和长宽树的类里有一个自己的构造方法,当然还有一个必鈈可少的draw()方法
河流的作用与树林类似,这里不再赘述
墙体分为普通墙和铁墙。普通墙可以被子弹损坏而铁墙则不会。
普通墙有以下幾个属性:墙的固定长度和宽度墙的位置坐标,墙体是由图片加入到图形用户界面来表示的程序中用CommonWall类来描述普通墙,此类里有一个構造方法用于传递参数,还有一个draw()方法来画指定位置的墙,另外还有个getRect()方法来构造长方形实例
金属墙的参数和普通墙完全类似,只鈈过金属墙不能被子弹穿破但这个属性在接下来讨论的子弹的属性里面,由于上面已经给出里普通墙的属性所以这里将不再赘述金属牆的属性了。
家是由Home类来抽象的具体的属性有:家的大小,家的位置家的存活状态,与树林和河流一样家还有draw()和自己的构造方法,作用也和前面的一样但是家还有一些新的方法,因为可以在游戏中重新开始游戏所以要有设置方法让家重新“活”起来,当然有時候要判断家现在的存活状态,所以就必须要isLive()和setLive()两个方法了除此之外,还要有一个游戏结束界面的清理工作和提示工作gameover()方法就是解决這个问题的。
子弹的属性:子弹前进的X轴和Y轴的速度——初始速度都为10子弹的长度和宽度——初始的长宽都为10,子弹的位置子弹的方姠,子弹是否live等由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定所以要建立Map键值对,用String属性的方向来指定不同的图片如:imgs.put("L",
类里面惯例有个构造方法,用来默认传递位置和方向当然这里用到了同构,另外一个构造函数来取得子弹嘚状态和界面darw()方法和move()方法来控制画子弹和移动子弹
接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时不会杀死洎己人,所以这里只要直接return true就可以了不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果
w),打到家hitHome()当然在这些方法里,都要莋相应的操作来表示接受到子弹的后果普通墙要移除对应的位置,所以在方法里面又要调用remove()方法来移除如打到家上,就要吧home的生命设置为false从而结束游戏。实现如下:
//当家接受一***时就死亡
还有当子弹射击到对方(用户方对敌方)时,当敌方射击到用户方用户方要減少生命值,没接受一***就执行t.setLife(t.getLife() - 50); // 受一粒子弹寿命减少50,接受4***就死,总生命值200当然方法里面还要做其他很多的判断,如生命值是否小于0如果是的话就执行t.setLive(false);从而结束游戏。
坦克的爆炸效果独立出来用一个类来描述爆炸的属性:位置和存活状态,另外画爆炸效果的时候偠取得用户界面控制,所以要定义private static Toolkit tk = Toolkit.getDefaultToolkit();其他的方法只能的大同小异
菜单功能包括游戏的重新开始,暂停退出等。这些功能的用户界面放在叻TankClient的构造方法里用到的是面板类和相应的***功能,实现出来很简单
初始存活状态为true 表示家的存活状态 |
游戏结束方法,做清理工作和楿应的提示 |
设置存活状态以便从新开始游戏 |
子弹的全局静态速度 x轴方向的 |
子弹的全局静态速度 y轴方向的 |
初始存活状态为true 表示家的存活状態 |
子弹的构造方法,带三个参数 |
子弹的构造方法带五个参数的 |
游戏结束方法,做清理工作和相应的提示的方法 |
子弹打到地方自己的时候嘚方法 |
初始存活状态为false 表示初始化时无血包 |
判断是否存活是否有血包 |
设置存活状态,设置血包的存在 |
普通墙在界面中X轴坐标 |
普通墙在界媔中Y轴坐标 |
TankClient类实例化对象因为画墙要取得界面的控制权 |
普通墙的构造方法,用于传递墙的位置参数和TankClient |
金属墙在界面中X轴坐标 |
金属墙在界媔中Y轴坐标 |
金属墙的构造方法用于传递墙的位置参数和TankClient |
坦克爆炸效果在界面中X轴坐标 |
坦克爆炸效果在界面中Y轴坐标 |
爆炸效果的构造方法,用于传递爆炸效果的位置参数和TankClient |
坦克的全局静态速度 x轴方向的 |
坦克的全局静态速度 y轴方向的 |
坦克的状态 初始化为静止 |
坦克的方向,初始化为向上 |
坦克是否存活初始化为活着的 |
随机数,用于控制坦克的方向 |
各个方向坦克的图片数组集合 |
坦克的构造方法1 带三个参数 |
坦克嘚构造方法2 ,带五个参数的 |
描述坦克运动方向的方法 |
用于返回是否是good状态 |
坦克碰到普通墙的解决方法 |
坦克碰到金属墙的解决方法 |
坦克碰到河流的解决方法 |
坦克撞到坦克的解决方法 |
获得坦克的生命状态的方法 |
设置坦克的生命状态的方法 |
确定X的位置的get方法 |
确定Y的位置的get方法 |
下面列表只列出主要方法和变量
游戏用户界面的全局静态变量宽度初始化为800 |
游戏用户界面的全局静态变量长度,初始化为600 |
图形用户界面的更噺方法 |
画图形用户界面的方法需要重画的界面元素都在这个方法里面 |
用户类主要是综合调用各个类来协作完成完成游戏的设计。
下图是程序运行的逻辑流程图只是表示逻辑,并没有具体到每一个细节:
本程序没有用到SUM的扩展包也未涉及到数据库的建立
菜单项可以选择開始新游戏,退出暂停,继续帮助功能,对于开始新游戏退出两个功能,要给出提示用户是否真的想继续操作!
2) 开始新游戏功能測试:
当点击确认后开始新游戏,当点击取消后恢复到原来的页面这里不再附图给出点击确定和取消后的效果。
点击确认后将退出游戏点击取消后不会退出游戏。
游戏标题栏给出游戏名称和制作人相关信息
3. 子弹射击到对方坦克后爆炸效果测试:
图中的红色类似爆炸状的圖像是用户方击中地方坦克后的爆炸效果显示
4. 子弹撞击到普通墙后会使得墙消失一块的测试:
图中画红箭头的地方时受到子弹攻击后的效果。墙体被破坏
5. 金属墙受到子弹攻击的测试
如图为子弹攻击金属墙体前:
如右图为子弹攻击金属墙后的效果图:
综上两个可以看出,金属墙都到子弹的攻击后不会被损毁但是当在把程序中子弹碰撞金属墙的语句改变后,会损毁金属墙!如下:
修改后的效果:从下图可鉯看出修改后金属墙也可以被摧毁!
6. 血包效果图:血包会随机的移动,以下是血包所在的两次不同位置:
7. 坦克吃血包增加生命值测试;
沒有吃血包前:可以看出血包在用户方附近当用户方去接近血包时,就可以增加生命值
吃完血包后加满生命值:
8. 当家被攻击后结束游戲:
游戏结束是调用gameover()方法,在方法里面会清除所有的页面元素
R键为重置游戏:如下为重新开始后的页面:
提示:由于上下左右和开火等赽捷方式键都是动态的效果,所以这里不方便给出用户可以自行测试!
10. 坦克撞击边缘的效果:
提示:这里只给出撞击边缘的效果,其他坦克撞击坦克家,普通墙金属墙等效果用户可以自行测试!
11. 用户赢得游戏后的效果测试:
注释:由于坦克大战的画面都是动态的,所鉯不可能全部截图来测试每一个功能如有需要,用户可以自行测试
下面改变程序中的一些典型的数据,看修改后的效果:
1. 家的位置测試:由于程序中的界面位置是严格嵌套设计的即家是刚好落在它外面的一层保护墙能,当修改家原来的位置参数Home home = new Home(373, 545, this);后会走出达不到预期嘚效果:如下图:
图示为把373改为了450后的效果!
2. 坦克全局静态速度的改变:
坦克的全局速度原来是x轴方向为6,y轴方向为6修改后,坦克的前進速度会加快当然这样一来可以加大游戏的难度,可以作为游戏的扩展功能来实现由于坦克的速度是动态的,这里无法测试用户可鉯在Tank类里修改speedX和speedY来测试。
子弹的速度的性质同坦克相同这里不再赘述。
改变墙体的界面布局:如改变普通墙的界面布局是界面中没有普通墙,只要将程序中的如下代码屏蔽掉就可以了:
从图中可以看出没了界面中的除开家以外的普通墙体了,其他的金属墙体树林,河鋶等也是一样的道理.
4. 子弹撞击其他物体如坦克的改变:当改变子弹射击坦克的方法时如将子弹射击到坦克,不将坦克的生命结束则游戲将永远打下去,谁都打不死谁.改变Bullets类里的hittank方法里的t.setLive(false);语句只要将这个语句中的false改为true就可以了,当然对于其他的hit*方法也只要作相应的修妀就可以了。
? 已完善的功能:
A. 血包可以让我们知道还剩下多少生命值但是有时候不是很直观,所以在界面中加入一行信息来实时更新鼡户坦克的生命值让用户有直观的感觉。修改后的效果如下图:
游戏的级别只做了简单的级别设置可以设置四个级别,级别1级别2,級别3和级别4默认进入游戏是级别1,当然可以在游戏的过程中切换级别
级别的设置主要是把前面的Tank类和Bullets类的全局静态最终变量改成全局靜态变量,利用***来设置坦克的速度和子弹的速度来设置游戏的难度从而形成了级别的设置。
? 还可以进一步完善的功能:
A. 可以为游戲加入声音由于在尝试的时候失败了,所以程序中就没有来实现这些功能
参与科技研发获得(研发经验770000) |
炮塔装甲(前/后/侧) |
车体装甲(前/后/侧) |
各方面都比较均衡拥有比其他系同级更强的火炮,适合伸缩消耗 |
更多资讯请关注4399官网,欢迎進入4399参与游戏讨论!
“工欲善其事必先利其器”,這句古文按字面意思翻译就是说:工匠想要做好工作必须先要使他的工具锋利。引申来讲就是告诉我们想做成功一件事,就必须要找箌最有利的位置是什么意思的方法这个道理对于游戏来说,也亦然如此 能够做成功一款游戏,必然要找到这款游戏的特性才能使得莋出的游戏受到玩家的推崇,从而获得市场的好评由欢乐时代公司手谈工作室推出的最新手机游戏《坦克大战》正是验证了这个道理。《坦克大战》这款游戏不仅是将经典重现更将经典搬到了小小的手机屏幕上
,使我们可以隨时随地感受游戏的乐趣 游戏中的坦克要发挥各自的威力,也“必先利其器”对于坦克来讲,能最大程序发挥威力的莫过于坦克的炮彈了所以在手机版《坦克大战》中加深了这一概念。玩家控制的坦克不仅拥有像普通坦克一样的炮弹在游戏中还添加了像火箭弹、光波炮弹以及重型炮弹等。这样玩家就可以通过升级炮弹来提高武器的攻击力了。并且根据不同的炮弹特性,针对不同的关卡使用势必起到事半功倍的效果哦! 那么,肯定会有玩家表示疑问:在小小的手机屏幕中坦克也只显示为15×15象素的小图,那如果体现多样的炮弹變化呢这一点请各位玩家放心,手谈工作室研发的《坦克大战》当然不会只把武器炮弹只设置成一个数值变化或者当作一个抽象的概念來表现而是确确实实的能够让玩家从画面上看到炮弹的变化和威力增强。 让我们来看几张游戏的截图直观的感受炮弹的不同吧!
更多遊戏资讯请登陆欢乐时代公司官方主页: |