项目-坦克大战-设计报告

上传人:沈*** 文档编号:94836526 上传时间:2022-05-23 格式:DOC 页数:26 大小:56.50KB
收藏 版权申诉 举报 下载
项目-坦克大战-设计报告_第1页
第1页 / 共26页
项目-坦克大战-设计报告_第2页
第2页 / 共26页
项目-坦克大战-设计报告_第3页
第3页 / 共26页
资源描述:

《项目-坦克大战-设计报告》由会员分享,可在线阅读,更多相关《项目-坦克大战-设计报告(26页珍藏版)》请在装配图网上搜索。

1、-JAVA程序开发课程设计项目设计项目名称:TankWar 软件专业: 软件工程班级:13软工1班 *:毛晨光*:1322120124一、 需求分析:基本功能:1.玩家控制的坦克能够四处移动并且打击敌方坦克;2.敌方坦克能够随机四处移动并且打击玩家控制的坦克;3.玩家控制的坦克拥有血量,而敌方坦克没有;4.坦克受到攻击时血条会缩短;5.敌方坦克被消灭完之后,提示游戏胜利;6.用户方坦克被消灭后提示游戏结束;特色功能:1. 坦克具有图片,不单单只是个圈圈。2. 增加了血包功能,地图上会随机出现一个血包,我方坦克开过会增加血量。二、系统设计:1.TankMap类:实现游戏界面地图的初始化。2.Pa

2、inTread类:绘制和重绘功能。3.DirectionHandler:监听用户的键盘输入。4.Tank类:实现坦克的初始化,绘制,移动,发射等功能。5.EnemyTank:实现敌方坦克的初始化,绘制,移动,发射等功能。6.Shell类:实现炮弹的初始化,绘制,移动,攻击功能。7.E*plor类:实现爆炸的初始化。绘制功能,爆炸效果由绘制半径从小到大再到小的圆实现 。8.Direction类:包含枚举。9.Blood类:用于实现血包的功能。三、功能实现。一绘制地图功能:public class TankMap e*tends Frame/定义地图的尺寸。public static final

3、int MAPWIDTH=800;public static final int MAPHEIGHT=600;/我方坦克Tank t=null;/定义随机出现的血包Random r=new Random();Image bufferImage=null;public static java.util.Listshells=new ArrayList();/地方坦克集合public static java.util.List-enemys=new ArrayList();public static java.util.List bloods=new ArrayList();/爆炸集合public

4、.static.java.util.Liste*plors=newjava.util.ArrayList();/敌方坦克数量默认10个public int enemyCount=5;/主方法public static void main(String args) TankMap tv=new TankMap();tv.init(); public void drawImage()/地图初始化方法public void init()/初始化地图this.setSize(MAPWIDTH,MAPHEIGHT);this.setTitle(TankWar);this.setVisible(true)

5、;/添加键盘监听器this.addKeyListener(new DirectionHandler();/添加穿口关闭监听器this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent arg0) System.e*it(0); );/初始化我方坦克t=new Tank(this);/初始化敌方坦克for(int i=0;ienemyCount;i+) enemys.add(new EnemyTank(40+30*i,80,Color.YELLOW); /启动绘制线程 new Thread(new

6、 PaintThread().start(); /Override public void paint(Graphics g) /画地图Color c=g.getColor(); g.setColor(Color.GREEN); g.fillRect(0,0,MAPWIDTH,MAPHEIGHT); g.setColor(Color.RED); g.drawString(当前炮弹数目:+shells.size(),20,40); g.drawString(生命值:,20,60); g.fillRect(65,55,t.getLife(),5); g.setColor(c);/画坦克 t.dra

7、w(g); if(r.ne*tInt(10)=9 & bloods.size()=0)bloods.add(new Blood();if(r.ne*tInt(60)=7 & bloods.size()=1)bloods.remove(0); for(int i=0;ienemys.size();i+) EnemyTank et=enemys.get(i); et.draw(g); /画爆炸for(int i=0;ie*plors.size();i+) E*plor e=e*plors.get(i); e.draw(g); /绘制血包 for(int i=0;ibloods.size();i+)

8、Blood b=bloods.get(i);b.bloodb(t);b.draw(g); /画炮弹for(int i=0;ishells.size();i+) Shell s=shells.get(i); if(s.islive&s.isgood) s.hitTanks(enemys); else if(s.islive&!s.isgood) s.hitTank(t); s.draw(g); /双缓冲,防止游戏地图“频闪” public void update(Graphics g) paint(g); if(bufferImage=null) bufferImage=this.createI

9、mage(MAPWIDTH,MAPHEIGHT); Graphics gbuffer=bufferImage.getGraphics(); Color c=gbuffer.getColor(); gbuffer.setColor(Color.GREEN); gbuffer.fillRect(0, 0, MAPWIDTH, MAPHEIGHT); gbuffer.setColor(Color.RED); gbuffer.drawString(当前炮弹数目:+shells.size(),20,40); gbuffer.drawString(生命值:, 20, 60); gbuffer.fillRe

10、ct(65,55,t.getLife(),5); gbuffer.setColor(c); paint(gbuffer); g.drawImage(bufferImage, 0, 0, null); /内部类,主要通过调用repaint方法,实现绘图功能class PaintThread implements Runnable Override public void run() while(true) repaint(); try Thread.sleep(260); catch(InterruptedE*ception e) e.printStackTrace(); /内部类,键盘监听器c

11、lass DirectionHandler e*tends KeyAdapter Override public void keyPressed(KeyEvent arg0) t.checkDirection(arg0); 二.绘制坦克功能:public class Tank /坦克的尺寸和移动速度public static final int WIDTH=50,HEIGHT=50,*speed=5,yspeed=5;/坦克的初始位置public int *=400,y=300;/坦克的初始化方向,STOP即停止,Direction是自定义的枚举常量,见枚举源代码public Directio

12、n direction=Direction.STOP;/地图TankMap tm;/坦克是否存活boolean isLive=true;/坦克属于哪一方,true为用户方,false为敌方boolean isgood=true;/坦克初始化生命值int life=100;/定义坦克的初始化方向,以便插图坦克的图片public int zhuan*iang=1;/获取和设置存活状况public boolean isLive() return isLive; public void setLive(boolean isLive) this.isLive=isLive; /获取和设置生命值publi

13、c int getLife() return life; public void setLife(int life) this.life=life; /构造方法 public Tank(); public Tank(TankMap t) tm=t; /绘制坦克/根据坦克的移动方向,插入不同的坦克的图片public void draw(Graphics g) if(zhuan*iang=1)ImageIcon icon=new ImageIcon(Etank_shang.gif);Image tankImage=icon.getImage();g.drawImage(tankImage,*,y,

14、null);else if(zhuan*iang=-2)ImageIcon icon=new ImageIcon(Etank_you.gif);Image tankImage=icon.getImage();g.drawImage(tankImage,*,y,null);else if(zhuan*iang=2)ImageIcon icon=new ImageIcon(Etank_zuo.gif);Image tankImage=icon.getImage();g.drawImage(tankImage,*,y,null);elseImageIcon icon=new ImageIcon(Et

15、ank_*ia.gif);Image tankImage=icon.getImage();g.drawImage(tankImage,*,y,null); /*Color c=g.getColor(); g.setColor(Color.RED); g.fillOval(*,y,WIDTH,HEIGHT); g.setColor(c);*/ move(direction); /根据方向,移动坦克,不允许坦克移出地图尺寸public void move(Direction d)if(d=Direction.STOP)else if(d=Direction.UP)zhuan*iang=1;y -=

16、 yspeed;if(y=800-WIDTH)*=800-WIDTH;else if(d=Direction.DOWN)zhuan*iang=-1;y+=yspeed;if(y=600-HEIGHT)y=600-HEIGHT;else if(d=Direction.LEFT)zhuan*iang=2;*-=*speed;if(*36)fire();/确定敌方的坦克的移动if(direction=Direction.UP)y-=yspeed;zhuan*iang=1;if(y=800-WIDTH)*=800-WIDTH;else if(direction=Direction.DOWN)y+=ys

17、peed;zhuan*iang=-1;if(y=600-HEIGHT)y=600-HEIGHT;else if(direction=Direction.LEFT)*-=*speed;zhuan*iang=2;if(*=0)*=0; Override public void fire() tm.shells.add(new Shell(this.*+WIDTH/2,this.y+HEIGHT/2,this.direction,tm,Color.BLUE,false); public Rectangle getRec() return new Rectangle(this.*,this.y,thi

18、s.WIDTH,this.HEIGHT); 四.炮弹绘制方法public class Shell /初始化炮弹的基本属性public final int WIDTH=5,HEIGHT=5,*speed=14,yspeed=14; public int *,y; Direction dir=Direction.STOP; public boolean islive=true; TankMap tm=null; Color color=Color.RED; boolean isgood=true; boolean isLive=true;/构造方法 public Shell() public Sh

19、ell(int *d,int yd,Direction d,TankMap t) *=*d; y=yd; dir=d; tm=t; public Shell(int *d,int yd,Direction d,TankMap t,Color c,boolean g) *=*d; y=yd; dir=d; tm=t; color=c; isgood=g; /绘制炮弹public void draw(Graphics g) if(islive) Color c=g.getColor(); g.setColor(color); g.fillOval(*,y,WIDTH,HEIGHT); g.setC

20、olor(c); move(dir); else tm.shells.remove(this); /炮弹的移动,如果炮弹移动出了地图尺寸,则设定炮弹死亡public void move(Direction d) if(d=Direction.UP) y-=yspeed; if(y=800)islive=false; else if(d=Direction.DOWN) y+=yspeed; if(y=600)islive=false; else if(d=Direction.LEFT) *-=*speed; if(*=0)islive=false; public Rectangle getRec

21、() return new Rectangle(this.*,this.y,this.WIDTH,this.HEIGHT); /打击坦克方法public boolean hitTank(Tank t) if(this.isLive&t.isLive&this.getRec().intersects(t.getRec()/用户坦克生命值减20t.setLife(t.getLife()-20);/如果用户坦克生命值=0,游戏结束if(t.getLife()=0) t.setLive(false); t.direction=Direction.STOP; JOptionPane.showMessag

22、eDialog(tm,Game Over!); System.e*it(0); /炮弹死亡this.isLive=false;/产生爆炸E*plor e=new E*plor(*-3,y-3,this.tm); tm.e*plors.add(e); return true; return false; /用户坦克打击敌方坦克的方法 public boolean hitTanks(ListenemyTanks) EnemyTank e; for(int i=0;ienemyTanks.size();i+) e=enemyTanks.get(i); if(this.getRec().interse

23、cts(e.getRec() System.out.println(hittanks); e.setLive(false); tm.enemys.remove(e); this.isLive=false; E*plor e*=new E*plor(*-3,y-3,this.tm); tm.e*plors.add(e*); return true; return true; 五.爆炸类源代码:public class E*plor /初始化爆炸属性int *,y; TankMap tm; boolean islive=true; int diameter=5,9,13,18,25,31,21,1

24、2,6; int step=0;/构造方法public E*plor() public E*plor(int *,int y,TankMap t) this.*=*; this.y=y; this.tm=t; /绘制爆炸 public void draw(Graphics g)/如果爆炸已经发生过,从地图的爆炸集合中移出该爆炸 if(!this.islive) tm.e*plors.remove(this); return; /判断爆炸是否发生完if(step=diameter.length) this.islive=false; step=0; return; Color c=g.getCo

25、lor(); g.setColor(Color.ORANGE); g.fillOval(*, y, diameterstep, diameterstep); step+; g.setColor(c); 六.枚举方向源代码package tank;/定义枚举public enum DirectionUP,RIGHT,DOWN,LEFT,STOP;七.随机血包产生的方法public class Bloodpublic final int WIDTH=30,HEIGHT=30;public int *= new Random().ne*tInt(800),y= new Random().ne*tIn

26、t(600);TankMap tm;public void draw(Graphics g)ImageIcon icon=new ImageIcon(blood.gif);Image tankImage=icon.getImage();g.drawImage(tankImage,*,y,null);public boolean bloodb(Tank t)if(t.isLive&this.getRec().intersects(t.getRec()if(t.getLife()=60)System.out.println(blood up);t.setLife(t.getLife()+40);t

27、m.bloods.remove(this); elseSystem.out.println(blood up);t.setLife(100);tm.bloods.remove(this);return false;public Rectangle getRec()returnnew Rectangle(this.*,this.y,this.WIDTH,this.HEIGHT);四、总结。 1.如何解决地图频闪的问题用双缓冲机制来画出屏幕,双缓冲机制是通过虚拟出一*图片,将屏幕画在这*虚拟的图片上,在将这*虚拟的图片呈现在屏幕上。2.如何确定炮弹击中坦克炮弹类和坦克类里都有一个getRec()方

28、法来获取炮弹和坦克的当前位置,当炮弹的getRec()与坦克的getRec()相交,则判定炮弹击中坦克。3.如何限制坦克在地区上行驶,不会跑出规定的区域当坦克移动超出地图大小,则立马让坦克返回到地图边缘加坦克大小的位置。4.如何自行设置发射炮弹的按键在坦克类中原本是监听f键,当f键按下后发射炮弹,只需要修改监听的键就可以改变发射炮弹的按键。5.如何处理多个炮弹的产生、消失炮弹类有个方法isLive(),当用户按下f键或者地方坦克随机数达到要求是isLive()为true,开始画炮弹,即炮弹产生。当炮弹的getRec()与普通墙、金属墙、坦克的getRec()相交,或者子弹移动出地图外,isLive()为faise,则立马从地图上remove炮弹,即炮弹消失。五、软件说明书 首先打开eclipse,然后将坦克大战的文件夹导入进去,然后运行程序,上下左右键控制坦克的移动,开火,己方坦克遇到敌方坦克的炮弹会扣血,当血量扣光是会跳出Game over字样,表示游戏结束。. z.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!