• PUDN用户
    了解作者
  • Java
    开发工具
  • 95KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 6
    下载次数
  • 2013-12-11 15:41
    上传日期
java坦克大战,支持八个方向,超级炮弹,简单版!!
TankWar.zip
内容介绍
package xunpoit.tankwar; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.KeyEvent; import java.util.List; import java.util.Random; public class Tank { // x,y的值用来控制坦克的坐标 private int x; private int y; private int oldX; private int oldY; // 用来控制坦克的方向,8个,使用枚举类型 private Direction dir = Direction.stop; // 代表炮筒的方向 private Direction ptDir = Direction.d; // 代表方向按键的四个方向,使用true和false表示 private boolean bl, bu, br, bd; // 步长 public static final int STEP = 5; private TankWarMain tankWarMain; // 定义Tank类的构造方法 public static final int WIDTH = 35, HEIGHT = 35; // 加入good变量,控制坦克属于哪种类型,true表示我方坦克,false表示地方坦克 private boolean good; private boolean live = true; private int stepCount = 0; private int life=100; private static Toolkit tk = Toolkit.getDefaultToolkit(); private static Image[] images = { tk.getImage(Tank.class.getClassLoader().getResource("images/tankL.gif")), tk.getImage(Tank.class.getClassLoader().getResource("images/tankR.gif")), tk.getImage(Tank.class.getClassLoader().getResource("images/tankU.gif")), tk.getImage(Tank.class.getClassLoader().getResource("images/tankD.gif")), tk.getImage(Tank.class.getClassLoader().getResource("images/tankLU.gif")), tk.getImage(Tank.class.getClassLoader().getResource("images/tankLD.gif")), tk.getImage(Tank.class.getClassLoader().getResource("images/tankRU.gif")), tk.getImage(Tank.class.getClassLoader().getResource("images/tankRD.gif")) }; public int getLife() { return life; } public void setLife(int life) { this.life = life; } public int getOldX() { return oldX; } public int getOldY() { return oldY; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public boolean getGood() { return good; } public void setGood(boolean good) { this.good = good; } public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } public Tank(int x, int y, TankWarMain tankWarMain, boolean good) { this.x = x; this.y = y; this.tankWarMain = tankWarMain; this.good = good; } public Tank(int x, int y, TankWarMain tankWarMain, boolean good, Direction dir) { this.x = x; this.y = y; this.tankWarMain = tankWarMain; this.good = good; this.ptDir = dir; } // 画坦克的方法 public void paint(Graphics g) { if (!this.live) return; switch (ptDir) { case l: g.drawImage(images[0], x, y , null); break; case u: g.drawImage(images[2], x, y, null); break; case r: g.drawImage(images[1], x, y, null); break; case d: g.drawImage(images[3], x, y, null); break; case lu: g.drawImage(images[4], x, y, null); break; case ld: g.drawImage(images[5], x, y, null); break; case ru: g.drawImage(images[6], x, y, null); break; case rd: g.drawImage(images[7], x, y, null); break; } // 再次将画笔的颜色调节到原来的值 move(); } // 处理按键的方法 public void keyPressed(KeyEvent e) { // 根据键值来判断方向,确定x、y值得改变 switch (e.getKeyCode()) { 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; case KeyEvent.VK_CONTROL: if (live) { Missile mi = fire(); this.tankWarMain.getMissList().add(mi); } break; case KeyEvent.VK_A: if (live) superFire(); break; } // 没处理一次按键事件,就执行一次direction() direction(); } // 处理按键释放的方法 public void keyReleased(KeyEvent e) { // 根据键值来判断方向,确定x、y值得改变 switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: bl = false; break; case KeyEvent.VK_UP: bu = false; break; case KeyEvent.VK_RIGHT: br = false; break; case KeyEvent.VK_DOWN: bd = false; break; } // 没处理一次按键事件,就执行一次direction() direction(); } // 定义direction方法确定坦克的方向 public void direction() { if (bl && !bu && !br && !bd) dir = Direction.l; if (!bl && bu && !br && !bd) dir = Direction.u; if (!bl && !bu && br && !bd) dir = Direction.r; if (!bl && !bu && !br && bd) dir = Direction.d; if (bl && bu && !br && !bd) dir = Direction.lu; if (bl && !bu && !br && bd) dir = Direction.ld; if (!bl && bu && br && !bd) dir = Direction.ru; if (!bl && !bu && br && bd) dir = Direction.rd; if (!bl && !bu && !br && !bd) dir = Direction.stop; } // 坦克移动控制,通过改变x,y的值 public void move() { oldX = x; oldY = y; switch (dir) { case l: x -= STEP; break; case u: y -= STEP; break; case r: x += STEP; break; case d: y += STEP; break; case lu: x -= STEP; y -= STEP; break; case ld: x -= STEP; y += STEP; break; case ru: x += STEP; y -= STEP; break; case rd: x += STEP; y += STEP; break; default: break; } if (good == false) { stepCount--; if (stepCount <= 0) { // 设置沿某个方向移动的步数 stepCount = new Random().nextInt(20) + 1; // 通过随机数来设置方向 Direction[] randir = Direction.values(); dir = randir[new Random().nextInt(randir.length)]; } if (new Random().nextInt(30) > 25) { Missile missile = fire(); this.tankWarMain.getMissList().add(missile); } } // 确定子弹和炮筒的方向 if (dir != Direction.stop) ptDir = dir; // 判断坦克越界问题 if (x < 2) x = 2; if (y < 24) y = 24; if (x > TankWarMain.WIDTH - Tank.WIDTH - 3) x = TankWarMain.WIDTH - Tank.WIDTH - 3; if (y > TankWarMain.HEIGHT - Tank.HEIGHT - 3) y = TankWarMain.HEIGHT - Tank.HEIGHT - 3; } // 发射子弹的方法,返回一个子弹对象 public Missile fire() { int mx = x + (Tank.WIDTH - Missile.WIDTH) / 2; int my = y + (Tank.HEIGHT - Missile.HEIGHT) / 2; return new Missile(mx, my, ptDir, this.tankWarMain, good); } public void superFire() { Direction[] dirs = Direction.values(); int mx = x + (Tank.WIDTH - Missile.WIDTH) / 2; int my = y + (Tank.HEIGHT - Missile.HEIGHT) / 2; for (Direction dir : dirs) { if(dir==Direction.stop) break; Missile m = new Missile(mx, my, dir, this.tankWarMain, good); this.tankWarMain.getMissList().add(m); } } // 得到坦克对象的外接矩形 public Rectangle getRec() { return new Rectangle(x, y, WIDTH, HEIGHT); } public void collideWall(Wall wall) { if (wall == null) return; if (this.getRec().intersects(wall.getRec())) { this.x = oldX; this.y = oldY; } } public void collideWalls(List<Wall> wallList) { for (Wall wall : wallList) { collideWall(wall); } } public void collideTank(Tank tank) { if (tank == null) return; if (this.getRec().intersects(tank.getRec()) && this != tank) { this.x = oldX; this.y = oldY; tank.setX(tank.getOldX()); tank.setY(tank.getOldY()); } } public void collideTanks(List<Tank> tankList) { for (Tank tank : tankList) { collideTank(tank); } } }
评论
    相关推荐
    • Battle-City.rar
      java语言编写的坦克大战游戏源代码,坦克是在画板上绘制而成,有音效。
    • Tank.rar
      坦克大战小游戏,涉及多线程、键盘和鼠标响应,文件存储,游戏比较简易,但分层比较清晰,容易看懂,对初学者有益。
    • HTML5 CANVAS游戏开发实战(PDF和源代码)
      10.4 做一款多人在线的坦克大战 / 293 10.4.1 服务器 / 293 10.4.2 客户端 / 293 10.5 小结 / 307 第四部分 技能提高篇 第11章 提高效率的分析 / 310 11.1 绘图时使用小数的影响 / 310 11.2 drawimage和...
    • snowglobe-src-viewer-2.0.0-r0.tar.gz
      国外的开源游戏引擎,能够承载上千人,属于社交类的游戏
    • 彩球射手.rar
      该游戏适合于平时娱乐之用,娱乐时只需将大于等于三个的连在一块就得分,直到最地层触底为止.
    • 是男人就下一百层SHY.rar
      制作的第一款休闲类的手机游戏,适合初学者参考
    • Java拼图游戏源码.rar
      Java拼图游戏源码,挺经典是一个源码,内附解压密码
    • UnrealEngine3.tar.gz
      虚幻引擎3(UnrealEngine3)源代码,包含编辑器和引擎部分的源代码。比较完整。
    • Sudoku.zip
      数独题集 分上下册,上册为120道数独题,下册为答案 提高智力的最简单方式
    • Engine_v0.2.tar.gz
      一个巨cool的3D游戏引擎源代码。其0.3版本开始收费,卖10000美金,其功能有bsp/portal,particle system,physics,skelet-animation,energe unit,lod.四叉树/八叉树,shaders(glsl/hlsl)