项目-坦克大战-设计报告_第1页
项目-坦克大战-设计报告_第2页
项目-坦克大战-设计报告_第3页
项目-坦克大战-设计报告_第4页
项目-坦克大战-设计报告_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

3、APWIDTH=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.stat

4、ic.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 Pain

6、tThread().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.draw(g);

7、 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+)Blood

8、 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.createImage(MA

9、PWIDTH,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.fillRect(65,5

10、5,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(); /内部类,键盘监听器class Di

11、rectionHandler 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 Direction direc

12、tion=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; /获取和设置生命值public int g

13、etLife() 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,null);e

14、lse 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(Etank_*ia

15、.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 -= yspeed

16、;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+=yspeed;zh

17、uan*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,this.WIDTH

18、,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 Shell(int

19、 *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.setColor(c)

20、; 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() retu

21、rn 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.showMessageDialog

22、(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().intersects(e.g

23、etRec() 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,12,6; in

24、t 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.getColor();

25、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*tInt(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 blood

温馨提示

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

最新文档

评论

0/150

提交评论