JAVA坦克游戏双人对战版

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (y + Tank.length> TankClient.Image_LENGTH) y = TankClient.ImageБайду номын сангаасLENGTH - Tank.length;// 子弹出界的
问题 2.产生敌人坦克: 为了区别坦克好坏,我们在 tank 里添加 good 属性,在 draw 方法里根据 good 选 不同的颜色,并在 TankClient 类里创建敌人坦克: for(inti=0;i<5;i++){
caseLD: x -= x_SPEED; y += y_SPEED; break;
caseSTOP:
break; default: 而在监听类中,先根据键盘读出上下左右(由 keypressed 方法完成),再判断 是否有两个方向同时被按下(locateDirections 方法完成): publicvoidkeyPressed(KeyEvent e) { intkey = e.getKeyCode(); switch (key) { case KeyEvent.VK_CONTROL:
this.tanks.add(new Tank(50+(i+1)*40,50,false,false,false,this)); 在 TankClient 类里面增加 tanks 集合永丰余存放坦克对象。 List<Tank>tanks=new ArrayList<Tank>();(注意这里用到了泛型)
坦克大战双人对战版
班级: 姓名:yangxixi 学号:任务:游戏设计,代码书写,调试 班级: 姓名: 学号:任务:代码调试,美工
一、游戏介绍: 本游戏实现坦克大战双人对战,添加了超级炮弹,增加友军数量,复活等选项。 目前是单机版,网络版代码目前已实现联网对战。 P1 玩家:WASD 控制移动方向,F 发射子弹,G 发射超级炮弹,Q 复活 E 增加 5 个 友军,B 清空; P2 玩家:上下左右方向键控制移动方向,Ctrl 发射子弹,I 发射超级炮弹,O 复活 P 增加 5 个友军,B 清空;
/** * 重写 run 方法 */ publicvoid run() {
while(sw){ repaint();
try { Thread.sleep(80);
} catch (InterruptedException e) {
e.printStackTrace(); } } 接下来让坦克听从我们的指挥移动,添加键盘监听器类 KeyMonitor,在 tank 类中添加 move 方法及方向属性,move 方法根据坦克方向改变坦克位置: caseL: x -= x_SPEED; break; caseLU: x -= x_SPEED; y -= y_SPEED; break; caseU: y -= y_SPEED; break; caseUR: x += x_SPEED; y -= y_SPEED; break; caseR: x += x_SPEED; break; caseRD: x += x_SPEED; y += y_SPEED; break; caseD: y += y_SPEED; break;
} 3.加入子弹: 添加子弹 Missile 类,其中包括子弹的位置,速度,等基本信息,有自己的构造 方法,draw 方法,在 TankClient 类里面添加;一个集合存放子弹: List<Missile>missiles=new ArrayList<Missile>();(注意这里用到了泛
型)
} 这样我们就实现流坦克根据键盘按键向八个方向移动。 补充一点,处理坦克出界问题,判断是否达到边界,若是,则改变坦克位置:
if (x< 0) x = 0;
if (y< 25) y = 25;
if (x + Tank.width> TankClient.Image_Width) x = TankClient.Image_Width - Tank.width;
* 这个方法画出游戏的主窗口
*/ publicvoid launchFrame() {
for(inti=0;i<5;i++){ this.tanks.add(new
Tank(50+(i+1)*40,50,false,false,false,this)); } this.setBounds(Startx, Starty,Image_Width,Image_LENGTH); this.setTitle("TankWar"); this.setBackground(Color.black); this.setVisible(true); this.setResizable(false); /** * 添加窗口关闭监听 */ this.addWindowListener(new WindowAdapter() {
paint(goffScreen); g.drawImage(offScreenImage, 0, 0, null);
}
接下来创建一个新的线程类,每隔 80ms 重画一次,当坦克的位置改变时,画面 中就会出现坦克的移动,repaint 方法会自动调用 paint 方法: publicclass PaintThread implements Runnable{
if (!bL&& !bU&& !bR&&bD) dir = Directions.D;
if (bL&& !bU&& !bR&&bD) dir = Directions.LD;
if (!bL&& !bU&& !bR&& !bD) dir = Directions.STOP;
TankCient 添加键盘监听器,针对不同的键改变坦克的位置,与重画线程结合 产生不同方向运动:
在 paint 方法里画出 missiles 集合里面的每一个对象。 接下来便是让坦克打出一发炮弹,于是在 tank 类里增加监听 Ctrl 键,并且增 加方法 fire,每当被按下时,便创建一个 missile 对象添加到集合里: publicvoidfire() {
if (this.live) tc.missiles.add(new Missile(x + width / 2 - Missile.width
publicvoid keyPressed(KeyEvent e) { myTank.keyPressed(e); yourTank.keyPressed1(e); addEnemTanks(e); addMyTanks(e); addMineTanks(e); cleanAll(e); superMissile(e);
offScreenImage=this.createImage(Image_Width,Image_LENGTH); } Graphics goffScreen=offScreenImage.getGraphics(); Color c=goffScreen.getColor();
goffScreen.setColor(new Color(139, 139, 0)); goffScreen.fillRect(0, 0, Image_Width,Image_LENGTH);
fire(); break; case KeyEvent.VK_LEFT: bL = true; break; case KeyEvent.VK_UP: bU = true; break; case KeyEvent.VK_RIGHT: bR = true; break; case KeyEvent.VK_DOWN: bD = true; break;
publicvoid windowClosing(WindowEvent e) { sw=false;
System.exit(0); } 重写 paint 方法,负责画出坦克,画出时只需调用坦克的 draw 方法(体现面向 对象思维),意味着新建 tank 类,用于封装坦克信息,暂时用实心圆表示坦克, 重写 update 方法,将坦克图像先画到一张图片上再画到屏幕上: myTank.draw(g); yourTank.draw(g); w1.draw(g); w2.draw(g); w3.draw(g); w4.draw(g); b.draw(g); publicvoid update(Graphics g) { if(offScreenImage==null){
dir = Directions.U; if (!bL&&bU&&bR&& !bD)
dir = Directions.UR; if (!bL&& !bU&&bR&& !bD)
dir = Directions.R;
if (!bL&& !bU&&bR&&bD) dir = Directions.RD;
三.关键代码 TankClient.java,Tank.java, Wall.java,Missile.java,Explode.java Blood.java 一共 6 个 java 文件,其他每个类都拿到一个 TankClient 类的引 用,方便对其变量,常量,方法的调用。 1.实现自己坦克八个方向的移动: 首先 TankClient 继承 Frame,新建一个窗口,添加窗口关闭事件处理信息,固 定窗口大小,: /**
二.设计思路: 1.画出主窗口,坦克,实现自己坦克八个方向的移动:通过对按键监听,判断出 坦克移动方向,再根据方向改变坦克位置,实现坦克的移动; 2.产生敌人坦克:改变坦克好坏变量,增加敌人坦克; 3.加入子弹,能够打击敌人:增加子弹类,封装所需信息,在合适位置创建子弹 类对象; 4.让敌人能够移动:用随机数产生器给坦克增加随机的方向,子弹; 5.加入爆炸:增加爆炸类,在合适的地方创建对象; 6.加入墙,解决碰撞问题:增加墙类,在合适的地方创建对象; 7.加入血块:增加血块类,在合适的地方创建对象; 加入血量显示:在我的坦克位置上方画出血量; 8.添加超级炮弹,加入键位控制。 9.加入图片:加入图片让游戏更加美观。 10.加入另一两主战坦克,实现双人对战:产生另一辆坦克,以 your 变量区分,增 加键盘控制;
/ 2, y + length / 2 - Missile.length / 2, good, ptdir, tc));
} 而在 tank 类里增加一个炮筒,炮筒的方向就是子弹的方向,炮筒用黑色直线画 出来:
if (dir != Directions.STOP) ptdir = dir;
switch (ptdir) { caseL: g.drawImage(imgs.get("L"), x, y, null); break; caseLU: g.drawImage(imgs.get("LU"), x, y, null); break; caseU: g.drawImage(imgs.get("U"), x, y, null); break; caseUR: g.drawImage(imgs.get("RU"), x, y, null); break; caseR: g.drawImage(imgs.get("R"), x, y, null); break; caseRD: g.drawImage(imgs.get("RD"), x, y, null); break; caseD: g.drawImage(imgs.get("D"), x, y, null); break; caseLD: g.drawImage(imgs.get("LD"), x, y, null); break; default: break; }
default: break;
} locateDirections(); publicvoidlocateDirections() { if (bL&& !bU&& !bR&& !bD)
dir = Directions.L; if (bL&&bU&& !bR&& !bD)
dir = Directions.LU; if (!bL&&bU&& !bR&& !bD)
相关文档
最新文档