坦克大战报告.doc
JAVA程序开发课程设计课程大作业 专 业: 软 件 工 程 班 级: 14软工2 学 号: 1422130236 姓 名: 张敏慧 项目名称:坦克大战一、 需求分析:1. 基本功能:(1) 我方坦克能上下移动(2) 敌方坦克能自由移动(3) 我方坦克能开火(4) 敌方坦克能自由开火(5) 子弹打中我方,会减血,我方打中敌方,敌死。敌打敌不会受伤(6) 有血条,主界面2. 扩展功能(1) 用图形来表示坦克和炮弹(2) 用图形来表示中子弹后的爆炸效果(3) 地图上存在金属墙,我方坦克和子弹不能穿过(4) 地图上存在曹村,我方和敌方坦克能够自由穿过,子弹也一样(5) 地图上会随机出现加血包(6) 我方坦克遇到加血包,会增加生命(7) 游戏开始时,会启动背景音乐(8) 我方坦克死亡时,提示游戏结束二、系统设计: 1. BgMusic(1)主要功能:添加背景音乐TankMap类通过调用该类,并读取BgMusic包下面的背景音乐文件(2)成员属性:1)filename,用于记录读取到的文件名,并处理2)nBytesRead,这是缓存,用于读取音乐文件,缓存下来(3)成员方法: 1)run,播放背景音乐2) 构造方法BgMusic,将读取到的文件名,存储到成员属性filename中2. Blood(1)主要功能:地图中添加血包(2)成员属性:1)x,y,width,height,血包的位置以及宽高2)rpos_x,rpos_y,用于记录血包移动后的位置3)tm,调用TankMap类,并在地图中放血包4)live,血包的存活,被坦克吃了就消失5) blood,用于记录血包的存活6)step,血包的步长7)stepMove,血包走过总的步长(3)成员方法: 1)Blood,构造方法,将血包放到地图中2) draw,画血包3) move,血包的移动4) getRect,获取血包的位置3. Tank(1)主要功能:地图中添加我方坦克(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,坦克的宽高和x,y上的移动速度2)x,y,direction,我方坦克出现的初始位置和初始状态3)tm,调用TankMap类,并在地图中放坦克4)isLive,我方坦克是否存活5) isgood,坦克属于哪一方6) life,我方坦克的初始生命值7) step,使用Blood类,血包随机出现8)upimage,rightimage,downimage,leftimage,oldimage,存放坦克图片(3)成员方法: 1)draw,绘制坦克 2)move,根据移动方向,移动坦克,不允许坦克移除地图 3)checkDirection,确定用户单击的方向键,修正坦克即将移动方向 4)fire,发射子弹 5)getRec,返回坦克当前位置,便于判断是否与敌方坦克或子弹重叠 6)stay,坦克撞墙的处理 7)eat,我方坦克吃血包 4.EnemyTank(1)主要功能:地图中添加敌方坦克(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,坦克的宽高和x,y上的移动速度2)x,y,direction,我方坦克出现的初始位置和初始状态3)tm,调用TankMap类,并在地图中放坦克4)islive,我方坦克是否存活5)enemytank,存放坦克图片(3)成员方法: 1)draw,绘制坦克 2)move,根据移动方向,移动坦克,不允许坦克移除地图 3)fire,发射子弹 4.Explor(1)主要功能:子弹打中坦克,发生爆炸效果(2)成员属性:1)x,y,坦克出现的位置2)tm,调用TankMap类,并在地图中放爆炸3)islive,我方坦克是否存活 (3)成员方法: 1)draw,绘制爆炸 2)Explor,爆炸的构造方法 5.Help(1)主要功能:给用户游戏帮助(2)成员属性:1)help,将帮助的文字存放在字符串中 (3)成员方法: 1)getHelpDialog,调用帮助 6.Shell(1)主要功能:设计子弹(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,子弹的宽高和x,y上的移动速度2)x,y,direction,子弹出现的位置和方向3)tm,调用TankMap类,并在地图中放子弹4)isLive,子弹是否打中坦克5)isgood,是否是我方6)Image,加载子弹图片 (3)成员方法: 1)draw,绘制子弹 2)move,根据移动方向,移动坦克,得到子弹的移动 3)getRec,获取坦克的位置 4)hitTanks,子弹打坦克 5)hitWalls,子弹打墙 7.Wall(1)主要功能:给地图添加墙(2)成员属性:1)x,y,w,h,墙的位置和宽度高度2)tc,地图 (3)成员方法: 1)draw,画墙 2)getRect,获取墙的位置8.TankMap(1)主要功能:地图(2)成员属性:1)MAPWIDTH,MAPHEIGHT,地图的宽高2)t,我方坦克3)bufferImage,缓冲,用于解决闪屏4)forestimage,草丛5)shells,EnemyTank,Blood,Explors泛型6)enemyCount,敌方坦克数量7)w1,w2,不可穿过的墙 (3)成员方法: 1)init,初始化地图 2)paint,画血包,地图,坦克等 3)addBloods,加血 4)update,解决闪屏 三、功能实现:1. 功能1:我方,敌方坦克上下移动并开火(1) 操作说明 游戏启动时,按上下左右键可以是我方坦克移动,按F键可以开火 (2)关键代码/绘制坦克public void draw(Graphics g)/根据不同方向加载不同图片,读取的时候需要处理异常tryswitch(direction)case STOP:case UP:upimage=ImageIO.read(new File("src/images/up.gif");oldimage=upimage;g.drawImage(upimage, x, y, null);break;case RIGHT:rightimage=ImageIO.read(new File("src/images/right.gif");oldimage=rightimage;g.drawImage(rightimage, x, y, null);break;case DOWN:downimage=ImageIO.read(new File("src/images/down.gif");oldimage=downimage;g.drawImage(downimage, x, y, null);break;case LEFT:leftimage=ImageIO.read(new File("src/images/left.gif");oldimage=leftimage;g.drawImage(leftimage, x, y, null);break;catch (IOException e) ;g.drawImage(oldimage, x, y, null);move(direction);/根据移动方向,移动坦克,不允许坦克移出地图public void move(Direction d)/* 记录坦克原来的位置,撞墙可以回到原位置*/oldX=x;/记录坦克原来的位置,撞墙可以回到原位置oldY=y;if(d = Direction.STOP)else if(d = Direction.UP)y-=yspeed;if(y<=HEIGHT)y=HEIGHT;else if(d=Direction.RIGHT)x+=xspeed;if(x>=800-WIDTH)x=800-WIDTH;else if(d=Direction.DOWN)y+=yspeed;if(y>=600-HEIGHT)y=600-HEIGHT;else if(d=Direction.LEFT)x-=xspeed;2. 功能2:我方开火,敌方会爆炸,然后死亡。我方中弹,会爆炸再扣血(1)操作说明 通过我方坦克的移动和开火,杀死敌方坦克(2)关键代码public boolean hitTank(Tank t)if(this.isLive&&t.isLive&&this.getRec().intersects(t.getRec()t.setLife(t.getLife()-20);if(t.getLife()<0)t.setLive(false);t.direction=Direction.STOP;JOptionPane.showMessageDialog(tm,"Game Over!");System.exit(0);this.isLive=false;Explor e=new Explor(x-3,y-3,this.tm);tm.explors.add(e);return true;return false;public boolean hitTanks(List<EnemyTank>enemyTanks)EnemyTank e;for(int i=0;i<enemyTanks.size();i+)e=enemyTanks.get(i);if(this.getRec().intersects(e.getRec()System.out.print("hittanks");e.setLive(false);tm.enemys.remove(e);this.isLive=false;Explor ex=new Explor(x-3,y-3,this.tm);tm.explors.add(ex);return true;return false;3. 功能3:加血(1)操作说明 当我方坦克血不够时,会随机产生一到两个加血包,加血包碰到我方的,会加满血 (2) 关键代码 4. 功能4:(1)操作说明 游戏启动时,按上下左右键可以是我方坦克移动,按F键可以开火 (2) 关键代码public class Blood int x, y, width, height;int rpos_x, rpos_y;private TankMap tm;private boolean live = false;private boolean blood;private int step = 0;private int stepMove = 0;/* 补给移动位置点集合*/int pos = 50, 80, 60, 80, 70, 80, 80, 90, 90, 100, 100, 110, 110, 120, 120, 130,130, 140, 140, 150, 150, 160, 140, 170, 130, 180, 120, 180, 110, 170, 100, 160,90, 150, 80, 140, 70, 130, 60, 120, 60, 110, 60, 100, 60, 90;public Blood(TankMap tm) width = 20;height = 20;this.tm = tm;/* 画出补给* param g*/public void draw(Graphics g) stepMove +;if(!live) if(stepMove >= 400) rpos_x = Tank.random.nextInt(470);rpos_y = Tank.random.nextInt(480);blood = Tank.random.nextBoolean();live = true;step = 0;stepMove = -1;return;if(stepMove%5 = 0) move();Color c = g.getColor();/g.setColor(Color.MAGENTA);/g.fillRect(x - 3, y - 3, width + 6, height + 6);if(blood) g.setColor(Color.RED);g.fillRect(x, y, width, height);g.setColor(c);if(stepMove >= 300) live = false;tm.bloods.remove(this);stepMove = 0;/* 补给移动*/public void move() if(step = pos.length) step = 0;x = rpos_x + posstep0;y = rpos_y + posstep1;step +;public Rectangle getRect() return new Rectangle(x, y, width, height);public boolean isBlood() return blood;public boolean isLive() return live;public void setLive(boolean live) this.live = live;public void setStepMove(int stepMove) this.stepMove = stepMove;5. 功能5:金属墙和树林(1)操作说明 坦克可以穿过树林,但是穿不过金属墙,子弹也不能穿过金属墙 (2) 关键代码树林:/* 读取树林*/forestimage=ImageIO.read(new File("src/images/wall_forest.gif");穿不过金属墙:public class Wall /* x,y为墙的位置,w,h为宽度高度;*/int x,y,w,h;/* 持有引用*/TankMap tc;public Wall(int x, int y, int w, int h, TankMap tc) this.x = x;this.y = y;this.w = w;this.h = h;this.tc = tc;public void draw(Graphics g)Color c=g.getColor();g.setColor(Color.GRAY);g.fillRect(x,y,w,h);g.setColor(c);/* 得到墙的矩形区域;* return*/public Rectangle getRect()return new Rectangle(x,y,w,h);子弹不能穿过金属墙:/* 判断子弹是否撞墙* param w墙* returntrue,撞上,false,未撞上;*/public boolean hitsWall(Wall w)if(this.isLive&&this.getRec().intersects(w.getRect()isLive=false;return true;return false;6. 功能6:帮助界面(1)操作说明 键盘按下F1,显示一个窗口,会显示帮助 (2)关键代码public class Help private static String help = "上:方向键上n" +"下:方向键下n" +"左:方向键左n" +"右:方向键右n" +"开火: F" +"帮助: F1n" +"红块加满血"public static void getHelpDialog() Dialog h = new JOptionPane(help).createDialog("操作说明");h.setVisible(true);四、创新点:1能够放置树林,金属墙2子弹不能穿过金属墙3. 我方坦克不能穿过金属墙4.能够随机出现加血包,而且加血包会随机移动5.我方坦克吃到血包会加血6最后来个背景音乐五、总结:这次的坦克大战是我的第一个java程序。一开始,我就对游戏很感兴趣,很想了解游戏运行的原理。刚写程序的时候,什么都不懂什么都不会,认真地听着课,记着笔记,下课后认真复习上课所讲的。渐渐地,我学到了类与对象,属性,方法等1. 匿名对象的应用直接使用new+类的方式实现匿名对象。匿名对象只使用一次,这样就会产生垃圾,消耗内存,好在java提供了一个垃圾回收机制,简化了回收的操作。2. get和set方法 set和get方法分别是设置属性值,获取值。有了这两个方法,在类与类中可以相互调用,这就产生了现实中的人与其他物的关系等。3. ImageIO的使用 使用图片,需要在属性那边定义,然后在方法中读取图片六、软件说明书:键盘上下左右控制我方坦克移动,F表示开火,打敌方坦克F1提供帮助