收藏 分销(赏)

Java坦克大战游戏设计说明书.doc

上传人:二*** 文档编号:4516507 上传时间:2024-09-26 格式:DOC 页数:36 大小:439KB
下载 相关 举报
Java坦克大战游戏设计说明书.doc_第1页
第1页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、. . .北方民族大学大作业报告游戏程序设计 系部、中心 计算机科学与工程学院 姓 名 王鑫学 号 20122201 专 业 软件工程班 级 2012级 软件三 班 课程名称 Java语言程序设计作业题目名称 简易版坦克大战游戏程序设计 起止时间20XX4月21日20XX5 月21日 成 绩 指导教师签名 贾艳波 、林淑飞简易版坦克大战游戏程序设计一、游戏的基本规则坦克种类分为敌方坦克和我方坦克,敌方有n辆蓝色坦克n值可以自己设定,我方有一辆红色坦克,我方坦克发射子弹,击中敌人坦克后,敌方坦克消失,并产生爆炸效果,同理,敌方坦克击中我之后,我方坦克消失并爆炸。游戏结束。二、主要实现思想和算法g

2、ui图形界面显示:界面的显示是通过TankGame类继承了JFrame和MyPanel继承了JPanel类实现。其中,MyPanel重写了paint方法,利用画笔Graphics绘制活动区域、坦克和子弹。画坦克的思想:选择一个参考点,如右图,首先参照参考点,画出参考点左边的矩形,然后参照参考点分别画出中间的正方形,圆形,直线和右边的矩形。这些形状组合起来就形成了一辆坦克。然后将画坦克的步骤封装成一个方法。我的坦克发射子弹的思想:首先创建一个Shot类,他拥有坐标根据坦克的坐标换算得到、方向、速度和是否存活的属性,因为,子弹的坐标要不断的改变,所以将它做成一个线程。然后,在我的坦克里面定义了一个

3、vactor因为他是线程安全的类集框架存放我的坦克的子弹。然后在pannel的paint方法中绘制。让MyPanel实现KeyListener接口,将TankGame注册让MyPanel监听,这样的话我按下j键,就在vactor里面添加一个子弹,然后让Shot实现Runnable接口,然后重写run方法,在run方法中通过改变子弹的坐标实现子弹的运动。我的坦克移动的思想:让MyPanel实现KeyListener接口,将TankGame注册让MyPanel监听,这样我按下相应的键,就相应的改变坦克的坐标,利用repaint重新绘制坦克。敌人坦克移动的思想:将敌人的坦克做成一个线程,然后在run

4、方法中改变坦克坐标,重绘坦克。里随机数生成不同的方向,从而让敌人的坦克自主选择方向移动。实现动态画面的思想:将MyPanel做成一个线程,然后将repaint函数方将run函数中,这样repaint函数就会被不断的调用,从而不断地刷新画面,达到动态效果。判断子弹是否击中坦克的算法:获得子弹的坐标和坦克的坐标,如果子弹坐标进入坦克坐标范围,就判为击中。让已经死亡的坦克和子弹消失的方法:被击中的坦克的isLive和子弹isLive的设置为false,这样,在绘制的时候会首先判断要绘制对象的isLive的值,如果为true才绘制,这样死亡的坦克和子弹就消失了。让敌人坦克和子弹自动移动的思想:将敌人坦

5、克和子弹做成一个线程,然后分别在各自的run函数中添加一个修改坐标的程序段。然后在MyPanel中启动对应的线程。坐标不断的自动修改,另一方面,paint函数不断的重新绘制,从而让坦克和子弹自动的移动了起来。让坦克和子弹在规定的区域内移动的方法:通过比较坦克坐标和区域坐标范围,如果坦克坐标达到区域坐标范围边界,就不让坦克的坐标继续修改,从而将坦克控制在规定的范围。通过比较子弹坐标和区域坐标范围,如果子弹坐标超出区域坐标范围,就将子弹的isLive置为false,这样在paint函数中就不再绘制这个子弹了,从而超出区域的子弹就消失了。显示爆炸效果的方法:首先我准备了一张爆炸的图片,然后创建一个爆

6、炸的类Bomb,它拥坐标属性,和生命值属性。还有减少生命的方法,当子弹击中坦克后,就坦克的坐标传递给Bomb,当做Bomb的坐标,然后开始绘制炸弹,同时让炸弹的生命不断减小,paint函数根据炸弹不同的生命值绘制不同大小的爆炸效果,不同的爆炸效果组合起来就形成了一个完整的爆炸。三、游戏软件系统的设计四、程序关键类的实现Tank类,拥有坐标X,Y和方向,速度属性,以及对应的set和get方法。还有判断坦克是否死亡的isLive属性。Hero类,继承了Tank类,有子弹属性,有shotEnemy方法,和上下左右移动的方法Shot类,实现了线程接口,run方法里面放置了修改子弹坐标和判断子弹是否处境

7、的算法。有坐标、速度、方向、和是否活着的属性。炸弹类,有坐标、生命值和是否存活的属性。有生命减少的方法。EenmyTank类,继承了Tank类,实现了线程接口,在run方法中添加了修改坦克坐标的程序段,从而让坦克自动移动。MyPanel类,是本游戏最主要的类,他继承了JPanel实现了keylistener和runnable接口,他的paint函数绘制了游戏中的坦克和子弹以及活动范围。keyPressed函数监听键盘输入,run函数里面放了repaint和比较是否击中坦克的代码。TankGame类,是本游戏的入口,其构造方法包含将面板添加到JFrame,设置窗口大小、可见性和默认的关闭方式。五

8、、游戏软件的主要界面截图六、程序代码:import javax.swing.*;publicclassTankGameextends JFrame /面板MyPanel mp = null;publicstaticvoid main /创建窗口TankGame tankegame = new TankGame;/构造函数public TankGame/创建面板对象mp = new MyPanel;/将面板添加到JFramethis.add;this.addKeyListener;/启动面板线程,让其paint方法不断调用,从而不断刷新,达到动态效果Thread t = new Thread;t

9、.start;/设置窗口大小this.setSize;/设置小图标this.setIconImagenew ImageIcon.getImage;this.setDefaultCloseOperation;this.setVisible;*publicclass Tank /坦克的很坐标intx;/坦克的纵坐标inty;/坦克的方向/0表示上,1右,2下,3表示左intdirect=0;/坦克的速度intspeed=4;/坦克的外观intcolor=0;/坦克是否死亡booleanisLive =true;publicint getColor returncolor;publicvoid se

10、tColor this.color = color;publicint getSpeed returnspeed;publicvoid setSpeed this.speed = speed;publicint getDirect returndirect;publicvoid setDirect this.direct = direct;public Tankthis.x = x;this.y = y;publicint getX returnx;publicvoid setX this.x = x;publicint getY returny;publicvoid setY this.y

11、= y;*import java.util.Vector;publicclass Hero extends Tank/放置子弹的类集框架Vector ss= new Vector;/子弹Shot s = null;public Hero super;/开火publicvoid shotEnemyswitch case 0:s = new Shot;ss.add;break;case 1:s = new Shot;ss.add;break;case 2:s = new Shot;ss.add;break;case 3:s = new Shot;ss.add;break;/启动子弹线程Thread

12、 t = new Thread;t.start;/坦克向上移动publicvoid moveUpy-=speed;/坦克向右移动publicvoid moveRigetx+=speed;/坦克向下移动publicvoid moveDowny+=speed;/坦克向左移动publicvoid moveLeftx-=speed;*import java.awt.*;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Vector;import javax.swing.*;publiccl

13、assMyPanelextends JPanel implements KeyListener,Runnable/定义一个我的坦克Hero hero = null;/定义敌人的坦克组,用Vector,因为他是线程安全的Vector ets = new Vector;/敌人坦克的初始量intenSize = 2;/定义炸弹集合Vector bombs = new Vector;/定义爆炸图片Image image1 = null;Image image2 = null;Image image3 = null;/定义背景图片Image imagebg = null;/MyPanel构造函数publ

14、ic MyPanel/初始化我的坦克hero = new Hero;/初始化敌人的坦克forint i = 0;iEnemyTank et = new EnemyTank*50,0;/设置颜色et.setColor;/设置方向et.setDirect;/启动敌人坦克Thread t = new Thread;t.start;/给敌人坦克添加子弹Shot s = new Shot;et.ss.add;Thread t2 = new Thread;t2.start;/加入类集框架ets.add;/初始化爆炸图片image1 = Toolkit.getDefaultToolkit.getImageP

15、anel.class.getResource;image2 = Toolkit.getDefaultToolkit.getImagePanel.class.getResource;image3 = Toolkit.getDefaultToolkit.getImagePanel.class.getResource;/初始化背景图片imagebg =Toolkit.getDefaultToolkit.getImagePanel.class.getResource;/重写paint必须的步骤publicvoid paintsuper.paint;/画一个活动区域g.drawImage;if/画我的坦

16、克this.drawTankhero.getX, hero.getY, g, this.hero.getDirect, this.hero.getColor;/从ss中取出每颗子弹,并绘制forint i = 0 ; i this.hero.ss.size ; i+Shot myShot = this.hero.ss.get;/画一颗子弹,要先判断是否为空,因为坦克刚创建的时候,没有按J的时候,子弹是空的,这个时候不能画,要不然会异常ifg.draw3DRect;/判断子弹是否死亡,如果死亡,就从Vocetor中移除ifhero.ss.remove;/画出敌人的坦克forint i = 0 ;

17、iets.size;i+EnemyTank et = ets.get;ifthis.drawTanket.getX, et.getY, g, et.getDirect, et.getColor;/画出敌人的子弹forint j = 0 ; j et.ss.size;j+/取出子弹Shot enemyShot = et.ss.get;/开始画ifg.draw3DRect;else/如果子弹死亡,就把子弹移除et.ss.remove;/画出炸弹forint i = 0 ; i bombs.size; i+/取出炸弹Bomb b = bombs.get;/画炸弹。根据不同的生命值爆炸不同的大小if6

18、g.drawImage;elseif3g.drawImage;elseg.drawImage;/减小炸弹的生命值b.lifeDown;/如果炸弹死亡,就移除数组ifbombs.remove;/判断敌人是否击中我publicvoid hitMe/取出每一个敌人forint i = 0 ; i this.ets.size ; i+/取出坦克EnemyTank et = ets.get;/取出每一辆坦克的子弹forint j = 0 ; j et.ss.size ; j+/取出子弹Shot enemyShot = et.ss.get;this.hitTank;/判断我的子弹是否击中敌人的坦克publ

19、icvoid hitEnemyTank/判断是否击中forint i = 0 ; i hero.ss.size ; i+/取出子弹Shot myShot = hero.ss.get;/判断子弹是否还活着if/遍历敌人坦克,判断子弹和坦克坐标forint j = 0 ; j ets.size;j+/取出坦克EnemyTank et = ets.get;ifthis.hitTank;/判断子弹是否碰撞到坦克的函数publicvoid hitTank/判断敌军坦克的方向switch/向上或者向下的情况下case 0:case 2:ifet.x&s.xet.y&s.y/击中/子弹死亡s.isLive

20、= false;/坦克死亡et.isLive = false;/创建一个炸弹,放入VectorBomb b = new Bomb;bombs.add;/向左或者向右的情况下case 1:case 3:ifet.x&s.xet.y&s.y/击中/子弹死亡s.isLive = false;/坦克死亡et.isLive = false;/创建一个炸弹,放入VectorBomb b = new Bomb;bombs.add;/画坦克的函数。四个参数分别为:起始画的坐标,方向,类型publicvoid drawTank/判断坦克的类型switchcase 0:g.setColor;/我的坦克break;

21、case 1:g.setColor;/敌军坦克break;switchcase 0:/炮筒向上/画坦克/第一步 画左边的那条履带g.fill3DRect;/四个参数分别表示起始点和大小/第二步 画出右边的那条履带g.fill3DRect;/第三部 画出中间的驾驶舱g.fill3DRect;/第四部 画出中间的炮塔g.fillOval;/第五步 画出炮筒g.drawLine;/四个参数分别表示起始点和终止点break;case 1:/炮筒向右/画坦克/第一步 画上边的那条履带g.fill3DRect;/四个参数分别表示起始点和大小/第二步 画出下边的那条履带g.fill3DRect;/第三部 画

22、出中间的驾驶舱g.fill3DRect;/第四部 画出中间的炮塔g.fillOval;/第五步 画出炮筒g.drawLine;/四个参数分别表示起始点和终止点break;case 2:/炮筒向下/第一步 画左边的那条履带g.fill3DRect;/四个参数分别表示起始点和大小/第二步 画出右边的那条履带g.fill3DRect;/第三部 画出中间的驾驶舱g.fill3DRect;/第四部 画出中间的炮塔g.fillOval;/第五步 画出炮筒g.drawLine;/四个参数分别表示起始点和终止点break;case 3:/炮筒向左/第一步 画上边的那条履带g.fill3DRect;/四个参数分

23、别表示起始点和大小/第二步 画出下边的那条履带g.fill3DRect;/第三部 画出中间的驾驶舱g.fill3DRect;/第四部 画出中间的炮塔g.fillOval;/第五步 画出炮筒g.drawLine;/四个参数分别表示起始点和终止点Overridepublicvoid keyTyped / TODO Auto-generated method stub/本游戏用到这个方法,就来处理这个方法,其他的先不管/键按下/W表示向上,A表示向左,S表示向下,D表示向右publicvoidkeyPressed ife.getKeyCode=KeyEvent.VK_W/设置我的坦克的方向this.

24、hero.setDirect;if0this.hero.moveUp;elseife.getKeyCode=KeyEvent.VK_D/向右this.hero.setDirect;ifthis.hero.xthis.hero.moveRiget;elseife.getKeyCode=KeyEvent.VK_S/向下this.hero.setDirect;ifthis.hero.ythis.hero.moveDown;elseife.getKeyCode=KeyEvent.VK_A/向左this.hero.setDirect;if0this.hero.moveLeft;/判断是否玩家按下j开火i

25、fe.getKeyCode=KeyEvent.VK_J/开火/if语句控制屏幕上同时最多只有多少颗子弹ifthis.hero.ss.sizethis.hero.shotEnemy;this.repaint;Overridepublicvoid keyReleased / TODO Auto-generated method stubOverridepublicvoid run / TODO Auto-generated method stubwhiletry Thread.sleep; catch / TODO: handle exception/调用判断我的子弹是否击中敌人的函数this.h

26、itEnemyTank;/调用判断敌人子弹是否击中我的函数this.hitMe;/判断是否要加子弹forint i = 0 ;iets.size;i+EnemyTank et = ets.get;ififet.ss.sizeShot s =null;switchcase 0:s = new Shot;et.ss.add;break;case 1:s = new Shot;et.ss.add;break;case 2:s = new Shot;et.ss.add;break;case 3:s = new Shot;et.ss.add;break;/启动子弹线程Thread t = new Thr

27、ead;t.start;/重绘this.repaint;*import java.util.Random;import java.util.Vector;publicclass EnemyTank extends Tank implements Runnable/定义一个类集框架,存放敌人的子弹Vector ss = new Vector;public EnemyTank super;Overridepublicvoid run / TODO Auto-generated method stubwhiletry Thread.sleep; catch / TODO: handle except

28、ionswitch case 0:forint i = 0 ;i if0y= y-speed;try Thread.sleep; catch / TODO: handle exceptionbreak;case 1:forint i = 0 ;i ifxx= x+speed;try Thread.sleep; catch / TODO: handle exceptionbreak;case 2:forint i = 0 ;i ifyy= y+speed;try Thread.sleep; catch / TODO: handle exceptionbreak;case 3:forint i =

29、 0 ;i if0x= x-speed;try Thread.sleep; catch / TODO: handle exceptionbreak;/随机产生方向Random random = new Random;this.direct = random.nextInt;/判断是否死亡ifbreak;*publicclass Shot implements Runnable/子弹坐标intx;inty;/子弹发射方向intdirect;/子弹的速度intspeed = 6;/子弹是否生存booleanisLive = true;public Shotthis.x=x;this.y=y;thi

30、s.direct = direct;Overridepublicvoid run / TODO Auto-generated method stubwhile/线程休眠50毫秒,每隔50毫秒子弹坐标修改一次try Thread.sleep; catch / TODO: handle exceptionswitchcase 0 :/向上飞y=y-speed;break;case 1 :/向右飞x = x+speed;break;case 2 :/向下飞y = y+speed;break;case 3 :/向左飞x = x - speed;break;/子弹是否处境ifx400|y300this.isLive = false;break;*publicclass Bomb /坐标intx ,y ;/炸弹的生命intlife = 9 ;booleanisLive = true;public Bombthis.x = x ;this.y = y;publicvoid lifeDownif 0life-;elsethis.isLive = false;36 / 36

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服