坦克大战游戏设计1.课程设计的目的随着手机的日益普及,java功能在移动设备上的实现及java 应用程序产生的影响力,对丰富人们的生活内容,提供便捷的咨询起着不可忽视的作用。
本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。
游戏是在Eclipse3.2环境下编程。
本项目重点运用了图形化用户界面GUI,Thread多线程的有关知识,其中涉及了绘图工具的运用,事件处理操作以及图形的碰撞检测等知识点。
通过此课程设计,使学生巩固所学知识、培养学生动手能力,了解Java的面向对象的体系结构。
学生用Java语言设计一个完整的应用程序,综合应用所学知识完成软件的分析、设计、调试和总结,提高学生对Java语言的综合应用能力和解决问题的能力。
2.设计方案论证2.1设计思路本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。
游戏是在Eclipse3.2环境下编程。
一、游戏基本元素:坦克,炮管,子弹,墙壁,地雷二、它的主要功能:(1)能够朝四个方向移动:上、下、左、右键。
(2) 按下鼠标左键发射普通子弹;按下鼠标右键发射散弹;子弹爆炸的效果,普通子弹和炮弹的效果(3)敌人能够移动(4)能够模拟爆炸(5)能够产生障碍(6)能够增长生命玩家控制主坦克(上方有血条的)的移动以及炮弹的发射。
若玩家将敌方坦克全部打掉则玩家胜;若期间由玩家控制的主坦克被打掉则视为玩家失败。
游戏中只有普通墙作为障碍物,玩家无法穿越它们并且普通子弹不能将墙打穿;但是玩家可以用炮弹将普通墙打掉。
桃心可以将坦克的血加满。
2.2简要的设计流程:键盘监听器2.2设计方法2.2.1构建游戏主类在主类中构造一个主Frame框架,设置它的大小和位置,并将其显示。
在主类中编写一段代码,构造一个窗口。
并添加窗口关闭的处理事件,将窗口设置成打小不可变。
主要代码如下:this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});this.setResizable(false);2.2.2构建坦克类Tank构造主窗口中所需要的Tank类,并将坦克加到窗口中,实现坦克的四个方向的移动创建一个坦克类,用画图工具构造出简单的图形代表坦克,并将坦克加入到主窗口当中。
主要代码如下:abstract class Tank{boolean init=false; //第一次画时将图片载入内存static final Toolkit TLK=Toolkit.getDefaultToolkit(); //用来将图片读入Image数组public static Image[] turretImg={TLK.getImage(Tank.class.getClassLoader().getResource("I mage/Tank/turret1.png")),TLK.getImage(Tank.class.getClassLoader().getResource("I mage/Tank/turret2.png"))};BufferedImage bTurretImg=null;Graphics2D g2=null;AffineTransform trans=new AffineTransform();public static final int SHOTSCOUNT=5; //同时可发射的子弹数int shotsCount=0; //已经发射的子弹数public static final int TANKSPEED=5; //Tank移动速度public static final int TANKWIDTH=36; //Tank的尺寸public static final int TANKHEIGHT=38;public static enum TANK_DIR {U,D,L,R,STOP};TANK_DIR tankDir; //Tank主体的方向TANK_DIR moveDir; //Tank的运动方向boolean camp; //Tank的阵营boolean isNPC; //是否是有电脑控制的机器人Tankboolean isLive=true; //Tank是否存活int x,y; //Tank主体的中心点坐标int oldx,oldy; //存储Tank前一步的坐标int turretDirx, turretDiry; //大炮端点的坐标public static final int TURRETLENGTH=30; //炮筒的长度double oldAngel=0;double nowAngel;double turnAngel;TankClient tc=null; //主界面类的引用Bomb tankBomb=null;HitPoint tankHitPoint; //Tank的生命值static Random rn=new Random(); //随机数发生器让坦克朝四个方向运动起来,在主类TankClient中启用多线程机制,让系统不断的进行重画。
class RepaintThread implements Runnable //画面重画线程{public void run(){while(repaintFlag){try{repaint();ut.move(); //Tank定时移动Shot tcShots=null;for(int i=0;i<shotsList.size();i++) //界面上的子弹定时移动{tcShots=shotsList.get(i);tcShots.move();}Thread.sleep(33);} catch (InterruptedException e){e.printStackTrace();System.exit(-1);}}}}class RobotTanksThread implements Runnable //机器人Tank 的行动线程{TankClient tc;public RobotTanksThread(TankClient tc){this.tc=tc;}public void run(){Tank tcTanks=null;int count=-1;while(repaintFlag){if(0==count) //电脑Tank全灭后重新加几辆{//RobotTank.add(1,false,RobotTank.RTANKTYPE.BOSS,tc) ;RobotTank.add(2,false,RobotTank.RTANKTYPE.SPE,tc);}try{count=0;for(int i=0;i<tanksList.size();i++){tcTanks=tanksList.get(i);if(!tcTanks.camp) { count++; }if(!tcTanks.isNPC||!tcTanks.isLive) { continue; } //不控制玩家的Tank((RobotTank)tcTanks).autoAction(); //自主行动}Thread.sleep(38);} catch (InterruptedException e){e.printStackTrace();System.exit(-1);}}}}根据坦克类修改TankClient主类,在主类中注册事件监听器,并调用Tank类中的方法:class TankMoveLis extends KeyAdapter //玩家Tank按键监听者{public void keyPressed(KeyEvent e){if(ut.isLive){ut.keyDispose(e.getKeyCode(),true);}}public void keyReleased(KeyEvent e){if(ut.isLive){ut.keyDispose(e.getKeyCode(),false);}else{if(e.getKeyCode()==KeyEvent.VK_F2){ut.rebirth(); //复活}}}}class MouseMoveLis extends MouseMotionAdapter //鼠标移动监听者{public void mouseMoved(MouseEvent e){if(ut.isLive){mousePoint=e.getPoint();ut.setTurretDir(mousePoint); //根据鼠标位置更新炮筒方向}}}在Tank类当中添加的按键方法,代码如下public void keyDispose(int Key,boolean b) //对用户按键的处理{if(b) //有键按下{switch(Key){case KeyEvent.VK_UP:case KeyEvent.VK_W:{keyList.remove(TANK_DIR.U);keyList.add(TANK_DIR.U);}break;case KeyEvent.VK_DOWN:case KeyEvent.VK_S:{keyList.remove(TANK_DIR.D);keyList.add(TANK_DIR.D);}break;case KeyEvent.VK_LEFT:case KeyEvent.VK_A:{keyList.remove(TANK_DIR.L);keyList.add(TANK_DIR.L);}break;case KeyEvent.VK_RIGHT:case KeyEvent.VK_D:{keyList.remove(TANK_DIR.R);keyList.add(TANK_DIR.R);}break;case KeyEvent.VK_SPACE:{this.superFire();}break;default:break;}}else //有键抬起{switch(Key){case KeyEvent.VK_UP:caseKeyEvent.VK_W:{ keyList.remove(TANK_DIR.U); }break;case KeyEvent.VK_DOWN:caseKeyEvent.VK_S:{ keyList.remove(TANK_DIR.D); }break;case KeyEvent.VK_LEFT:caseKeyEvent.VK_A:{ keyList.remove(TANK_DIR.L); }break;case KeyEvent.VK_RIGHT:caseKeyEvent.VK_D:{ keyList.remove(TANK_DIR.R); }break;default:break;}}if(keyList.size()==0) { keyList.add(TANK_DIR.STOP); }super.setMoveDir(keyList.get(keyList.size()-1));}2.2.3添加炮弹Shot类在Shot类当中添加x,y,dir等属性以及常量。