Java 坦克大战单机版 源代码

openkk 12年前

玩法:

方向键:控制走动

Ctrl:控制发弹

A:超级子弹

X:八方向发弹

=:添加敌方坦克

F2:重新开始

其他功能:

在头上实时显示血条

吃到血块时能补血

自动积分

敌方坦克过少时自动添加

收获:

系统复习了J2SE的基本上所有内容

对软件工程的理解进一步加深

对面向对象的思想及其优点进一步加深

熟悉了eclipse的使用,包括打包发布以及Doc的生成Java 坦克大战单机版 源代码

Java 坦克大战单机版 源代码

 

源代码:

//TankClient.java    package edu.wkx;  import java.awt.Color;  import java.awt.Frame;  import java.awt.Graphics;  import java.awt.Image;  import java.awt.event.KeyAdapter;  import java.awt.event.KeyEvent;  import java.awt.event.MouseAdapter;  import java.awt.event.MouseEvent;  import java.awt.event.WindowAdapter;  import java.awt.event.WindowEvent;  import java.util.ArrayList;  import java.util.List;  import java.util.Random;    /**   * 坦克客户端主类   * @author Java_Bean 王凯旋   *   */    @SuppressWarnings("serial")  public class TankClient extends Frame {     static final int GAME_WIDTH = 800;   static final int GAME_HEIGHT = 600;   private int x = 50;   private int y = 50;   private int refreshTime = 16;   private int bloodTime = 500;   private int bloodStep = 0;   private int maxBloods = 10;   private int minTanks = 3;   private int maxTanks = 20;   private Image bufImg = null;   private Color bgColor = Color.GREEN;   private boolean hasGetdist = false;   private int disX = 0;   private int disY = 0;   private int enemyNum = 10;   private static Random rand = new Random();   private boolean start = false;   private int score = 0;   private int killPoint = 5;     private List explodes = new ArrayList();   private List tanks = new ArrayList();   private List missiles = new ArrayList();   private List walls = new ArrayList();   private List bloods = new ArrayList();     /**    * 启动窗口    */      public void launchFrame() {    this.setTitle("TankWar");    this.setLocation(300, 300);    this.setSize(GAME_WIDTH, GAME_HEIGHT);    this.setResizable(false);    this.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {      System.exit(0);     }      });    this.addMouseListener(new MouseAdapter() {       public void mouseReleased(MouseEvent e) {      hasGetdist = false;     }      });    this.addMouseMotionListener(new MouseAdapter() {       public void mouseDragged(MouseEvent e) {        if (!hasGetdist) {       disX = e.getX();       disY = e.getY();       hasGetdist = true;      }      setLocation(e.getXOnScreen() - disX, e.getYOnScreen() - disY);     }      });    this.setBackground(bgColor);    this.addKeyListener(new KeyMonitor());    this.setVisible(true);    gameInit();   }      private void gameInit() {    tanks.add(new Tank(x, y, true, this));    addTank(10);    walls.add(new Wall(300, 400, 300, 30));    walls.add(new Wall(400, 300, 10, 200));    score = 0;    start = true;   }     // 重写paint方法     private void addBlood() {    bloodStep++;    if (bloodStep >= bloodTime && bloods.size() < maxBloods) {     bloodStep = 0;     Blood blood = new Blood(x, y);     blood.setX(rand.nextInt(GAME_WIDTH - blood.getSize()));     blood.setY(rand.nextInt(GAME_HEIGHT - blood.getSize() - 25) + 25);     for (int i = 0; i < tanks.size(); i++)      if (blood.getRect().intersects(tanks.get(i).getRect()))       return;     for (int i = 0; i < walls.size(); i++)      if (blood.getRect().intersects(walls.get(i).getRect()))       return;     for (int i = 0; i < bloods.size(); i++)      if (blood.getRect().intersects(bloods.get(i).getRect()))       return;     bloods.add(blood);    }   }     /**    * 游戏对象绘制方法    */      public void paint(Graphics g) {    if (start) {     addBlood();     g.drawString("MissilesCount : " + missiles.size(), 10, 40);     g.drawString("ExplodeCount : " + explodes.size(), 10, 50);     g.drawString("TanksCount : " + (tanks.size()), 10, 60);     g.drawString("WallsCount : " + walls.size(), 10, 70);     g.drawString("BloodsCount : " + bloods.size(), 10, 80);     g.drawString("Score : " + score, 10, 100);     for (int i = 0; i < explodes.size(); i++)      explodes.get(i).draw(g);     for (int i = 0; i < missiles.size(); i++) {      Missile missile = missiles.get(i);      for (int j = 0; j < walls.size(); j++) {       Wall w = walls.get(j);       if (missile.hitWall(w))        missiles.remove(missile);      }      for (int k = 0; k < tanks.size(); k++) {       Tank tank = tanks.get(k);       if (missiles.contains(missile) && missile.hitTank(tank)) {        missiles.remove(missile);        int life = tank.getLife() - missile.getAttackHurt();        if (life <= 0) {         score += killPoint;         tanks.remove(tank);         explodes.add(new Explode(tank.getX()           + tank.getSize() / 2, tank.getY()           + tank.getSize() / 2, this));         if (tank.isGood())          gameOver();        } else {         tank.setLife(life);        }       }      }     }     for (int i = 0; i < tanks.size(); i++) {      Tank t = tanks.get(i);      t.draw(g);      if (t.isGood())       g.drawString("TankLife : " + t.getLife(), 10, 90);      for (int j = 0; j < bloods.size(); j++) {       Blood blood = bloods.get(j);       if (blood.getRect().intersects(t.getRect())) {        bloods.remove(blood);        t.setLife(t.getLife() + blood.getBlood());       }      }     }     for (int i = 0; i < missiles.size(); i++)      missiles.get(i).draw(g);     for (int i = 0; i < walls.size(); i++)      walls.get(i).draw(g);     for (int i = 0; i < bloods.size(); i++)      bloods.get(i).draw(g);     if(tanks.size()0){     boolean addAble=true;     Tank t = new Tank(x, y, false, TankClient.this);     t.setX(rand.nextInt(GAME_WIDTH - t.getSize()));     t.setY(rand.nextInt(GAME_HEIGHT - t.getSize() - 25) + 25);     for (int i = 0; i < tanks.size(); i++)      if (t.getRect().intersects(tanks.get(i).getRect())){       addAble=false;       break;      }     for (int i = 0; i < walls.size(); i++)      if (t.getRect().intersects(walls.get(i).getRect())){       addAble=false;       break;      }     if(addAble){      tanks.add(t);      tankNum--;      }    }   }     /**    * 主方法    * @param args 命令行参数    */     public static void main(String[] args) {    TankClient tc = new TankClient();    tc.launchFrame();    new Thread(tc.new PaintThread()).start();   }     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 int getRefreshTime() {    return refreshTime;   }     public void setRefreshTime(int refreshTime) {    this.refreshTime = refreshTime;   }     public Image getBufImg() {    return bufImg;   }     public void setBufImg(Image bufImg) {    this.bufImg = bufImg;   }     public Color getBgColor() {    return bgColor;   }     public void setBgColor(Color bgColor) {    this.bgColor = bgColor;   }     public boolean isHasGetdist() {    return hasGetdist;   }     public void setHasGetdist(boolean hasGetdist) {    this.hasGetdist = hasGetdist;   }     public int getDisX() {    return disX;   }     public void setDisX(int disX) {    this.disX = disX;   }     public int getDisY() {    return disY;   }     public void setDisY(int disY) {    this.disY = disY;   }     public List getExplodes() {    return explodes;   }     public void setExplodes(List explodes) {    this.explodes = explodes;   }     public List getTanks() {    return tanks;   }     public void setTanks(List tanks) {    this.tanks = tanks;   }     public List getMissiles() {    return missiles;   }     public void setMissiles(List missiles) {    this.missiles = missiles;   }     public int getEnemyNum() {    return enemyNum;   }     public void setEnemyNum(int enemyNum) {    this.enemyNum = enemyNum;   }   public List getWalls() {    return walls;   }     public void setWalls(List walls) {    this.walls = walls;   }      }

//Tank.java    package edu.wkx;  import java.awt.Color;  import java.awt.Graphics;  import java.awt.Rectangle;  import java.awt.event.KeyEvent;  import java.util.Random;    /**   * 坦克类   * @author Java_Bean 王凯旋   *   */    public class Tank {   private int x;   private int y;   private int size = 50;   private int xSpeed = 10;   private int ySpeed = 10;   private boolean bU = false;   private boolean bD = false;   private boolean bL = false;   private boolean bR = false;   private Direction dir = Direction.STOP;   private Direction fireDir = Direction.R;   private boolean good = true;   private static Random rand = new Random();   private int moveStep = 0;   private int moveSpeed = 5;   private int fireStep = 0;   private int fireSpeed = 100;   private int turnStep = 0;   private int turnSpeed = 100;   private int oriX = 0;   private int oriY = 0;   private int superFireSize = 100;   private int totalLife = 100;   private int life = 0;   private int lifeBarLength = 7;   private int lifeBarWidth = 70;     private Color goodColor = Color.RED;   private Color enemyColor = Color.DARK_GRAY;   private Color fireColor = Color.BLUE;   private Color lifeBarColor = Color.BLUE;   private TankClient tc = null;     enum Direction {    U, D, L, R, LU, RU, LD, RD, STOP   };     /**    * 构造方法    * @param x 坦克出现位置的x坐标    * @param y 坦克出现位置的y坐标    * @param good 坦克的类别    */     public Tank(int x, int y, boolean good) {    this.x = x;    this.y = y;    this.good = good;    this.life = this.totalLife;   }     /**    * 构造方法    * @param x 坦克出现位置的x坐标    * @param y 坦克出现位置的y坐标    * @param good 坦克的类别    * @param tc 坦克所属主类的引用    */      public Tank(int x, int y, boolean good, TankClient tc) {    this(x, y, good);    this.tc = tc;    moveStep = rand.nextInt(moveSpeed);    fireStep = rand.nextInt(fireSpeed);    turnStep = rand.nextInt(turnSpeed);   }     /**    * 在屏幕上画出它自己    * @param g 图形类    */     public void draw(Graphics g) {    Color orgColor = g.getColor();    if (good)     g.setColor(goodColor);    else {     g.setColor(enemyColor);     turnStep++;     if (turnStep == turnSpeed) {      Direction[] dirs = Direction.values();      dir = dirs[rand.nextInt(dirs.length)];      if (dir != Direction.STOP)       fireDir = dir;      turnStep = 0;     }     moveStep++;     if (moveStep == moveSpeed) {      move();      moveStep = 0;     }     fireStep++;     if (fireStep == fireSpeed) {      fire();      fireStep = 0;     }    }    g.fillOval(x, y, size, size);      g.setColor(fireColor);    switch (fireDir) {    case U:     g.drawLine(x + size / 2, y + size / 2, x + size / 2, y);     break;    case D:     g.drawLine(x + size / 2, y + size / 2, x + size / 2, y + size);     break;    case L:     g.drawLine(x + size / 2, y + size / 2, x, y + size / 2);     break;    case R:     g.drawLine(x + size / 2, y + size / 2, x + size, y + size / 2);     break;    case LU:     g.drawLine(x + size / 2, y + size / 2, x, y);     break;    case RU:     g.drawLine(x + size / 2, y + size / 2, x + size, y);     break;    case LD:     g.drawLine(x + size / 2, y + size / 2, x, y + size);     break;    case RD:     g.drawLine(x + size / 2, y + size / 2, x + size, y + size);     break;    }      // lifeBarlifeBarLength    g.setColor(lifeBarColor);    g.drawRect(x + size / 2 - lifeBarWidth / 2, y - 5 - lifeBarLength,      lifeBarWidth, lifeBarLength);    g.setColor(Color.RED);    g.fillRect(      x + size / 2 - lifeBarWidth / 2 + 2,      y - 5 - lifeBarLength + 2,      (int) ((double) life / (double) totalLife * (double) (lifeBarWidth - 4)+1),      lifeBarLength - 3);      g.setColor(orgColor);   }     private void move() {    switch (dir) {    case U:     y -= ySpeed;     break;    case D:     y += ySpeed;     break;    case L:     x -= xSpeed;     break;    case R:     x += xSpeed;     break;    case LU:     x -= xSpeed;     y -= ySpeed;     break;    case RU:     x += xSpeed;     y -= ySpeed;     break;    case LD:     x -= xSpeed;     y += ySpeed;     break;    case RD:     x += xSpeed;     y += ySpeed;     break;    case STOP:     break;    }    boolean condition = x < 0 || x + size > TankClient.GAME_WIDTH      || y - 20 < 0 || y + size > TankClient.GAME_HEIGHT;    for (int i = 0; i < tc.getWalls().size(); i++) {     Wall wall = tc.getWalls().get(i);     if (this.getRect().intersects(wall.getRect()))      condition = true;    }    for (int i = 0; i < tc.getTanks().size(); i++) {     Tank t = tc.getTanks().get(i);     if (!this.equals(t) && this.getRect().intersects(t.getRect()))      condition = true;    }    if (condition) {     x = oriX;     y = oriY;     return;    }    oriX = x;    oriY = y;   }     /**    * 键盘按下的处理    * @param key 键位值    */     public void keyPressed(int key) {    if (good) {     switch (key) {     case KeyEvent.VK_UP:      bU = true;      makeDir();      move();      break;     case KeyEvent.VK_DOWN:      bD = true;      makeDir();      move();      break;     case KeyEvent.VK_LEFT:      bL = true;      makeDir();      move();      break;     case KeyEvent.VK_RIGHT:      bR = true;      makeDir();      move();      break;     case KeyEvent.VK_CONTROL:      fire();      break;     case KeyEvent.VK_A:      bigFire();      break;     case KeyEvent.VK_X:      xFire();      break;     }    }   }     private void fire() {    tc.getMissiles().add(      new Missile(x + size / 2, y + size / 2, fireDir, this, tc));   }     private void bigFire() {    tc.getMissiles().add(      new Missile(x + size / 2, y + size / 2, fireDir, this, tc,        superFireSize));   }     private void xFire() {    Direction[] dirs = Direction.values();    for (int i = 0; i < dirs.length - 1; i++)     tc.getMissiles().add(       new Missile(x + size / 2, y + size / 2, dirs[i], this, tc));   }     /**    * 按键释放的处理    * @param key 键位值    */     public void keyReleased(int key) {    if (good) {     switch (key) {     case KeyEvent.VK_UP:      bU = false;      makeDir();      break;     case KeyEvent.VK_DOWN:      bD = false;      makeDir();      break;     case KeyEvent.VK_LEFT:      bL = false;      makeDir();      break;     case KeyEvent.VK_RIGHT:      bR = false;      makeDir();      break;     }    }   }     private void makeDir() {    if (bU && !bD && !bL && !bR)     fireDir = dir = Direction.U;    if (!bU && bD && !bL && !bR)     fireDir = dir = Direction.D;    if (!bU && !bD && bL && !bR)     fireDir = dir = Direction.L;    if (!bU && !bD && !bL && bR)     fireDir = dir = Direction.R;    if (bU && !bD && bL && !bR)     fireDir = dir = Direction.LU;    if (bU && !bD && !bL && bR)     fireDir = dir = Direction.RU;    if (!bU && bD && bL && !bR)     fireDir = dir = Direction.LD;    if (!bU && bD && !bL && bR)     fireDir = dir = Direction.RD;   }     public Rectangle getRect() {    return new Rectangle(x, y, size, size);   }     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 int getSize() {    return size;   }     public void setSize(int size) {    this.size = size;   }     public int getxSpeed() {    return xSpeed;   }     public void setxSpeed(int xSpeed) {    this.xSpeed = xSpeed;   }     public int getySpeed() {    return ySpeed;   }     public void setySpeed(int ySpeed) {    this.ySpeed = ySpeed;   }     public boolean isbU() {    return bU;   }     public void setbU(boolean bU) {    this.bU = bU;   }     public boolean isbD() {    return bD;   }     public void setbD(boolean bD) {    this.bD = bD;   }     public boolean isbL() {    return bL;   }     public void setbL(boolean bL) {    this.bL = bL;   }     public boolean isbR() {    return bR;   }     public void setbR(boolean bR) {    this.bR = bR;   }     public Direction getDir() {    return dir;   }     public void setDir(Direction dir) {    this.dir = dir;   }     public Direction getFireDir() {    return fireDir;   }     public void setFireDir(Direction fireDir) {    this.fireDir = fireDir;   }     public boolean isGood() {    return good;   }     public void setGood(boolean good) {    this.good = good;   }     public Color getGoodColor() {    return goodColor;   }     public void setGoodColor(Color goodColor) {    this.goodColor = goodColor;   }     public Color getEnemyColor() {    return enemyColor;   }     public void setEnemyColor(Color enemyColor) {    this.enemyColor = enemyColor;   }     public Color getFireColor() {    return fireColor;   }     public void setFireColor(Color fireColor) {    this.fireColor = fireColor;   }     public TankClient getTc() {    return tc;   }     public void setTc(TankClient tc) {    this.tc = tc;   }     public static Random getRand() {    return rand;   }     public static void setRand(Random rand) {    Tank.rand = rand;   }     public int getMoveStep() {    return moveStep;   }     public void setMoveStep(int moveStep) {    this.moveStep = moveStep;   }     public int getMoveSpeed() {    return moveSpeed;   }     public void setMoveSpeed(int moveSpeed) {    this.moveSpeed = moveSpeed;   }     public int getFireStep() {    return fireStep;   }     public void setFireStep(int fireStep) {    this.fireStep = fireStep;   }     public int getFireSpeed() {    return fireSpeed;   }     public void setFireSpeed(int fireSpeed) {    this.fireSpeed = fireSpeed;   }     public int getTurnStep() {    return turnStep;   }     public void setTurnStep(int turnStep) {    this.turnStep = turnStep;   }     public int getTurnSpeed() {    return turnSpeed;   }     public void setTurnSpeed(int turnSpeed) {    this.turnSpeed = turnSpeed;   }     public int getOriX() {    return oriX;   }     public void setOriX(int oriX) {    this.oriX = oriX;   }     public int getOriY() {    return oriY;   }     public void setOriY(int oriY) {    this.oriY = oriY;   }     public int getSuperFireSize() {    return superFireSize;   }     public void setSuperFireSize(int superFireSize) {    this.superFireSize = superFireSize;   }     public int getTotalLife() {    return totalLife;   }     public void setTotalLife(int totalLife) {    this.totalLife = totalLife;   }     public int getLife() {    return life;   }     public void setLife(int life) {    if(life>this.totalLife)     life=this.totalLife;    if(life<0)     life=0;    this.life = life;   }  }

//Wall.java    package edu.wkx;  import java.awt.Color;  import java.awt.Graphics;  import java.awt.Rectangle;    /**   * 墙类   * @author Java_Bean 王凯旋   *   */    public class Wall {   private int x = 0;   private int y = 0;   private int width = 0;   private int height = 0;   private Color color = Color.BLACK;     /**    * 构造方法    * @param x 墙出现的x坐标    * @param y 墙出现的y坐标    * @param width 墙的宽度    * @param height 墙的高度    */      public Wall(int x, int y, int width, int height) {    this.x = x;    this.y = y;    this.width = width;    this.height = height;   }      /**    * 构造方法    * @param x 墙出现的x坐标    * @param y 墙出现的y坐标    * @param width 墙的宽度    * @param height 墙的高度    * @param color 墙的颜色    */      public Wall(int x, int y, int width, int height, Color color) {    this.x = x;    this.y = y;    this.width = width;    this.height = height;    this.color = color;   }     /**    * 在屏幕上画出它自己    * @param g 图形类    */      public void draw(Graphics g) {    Color orgColor = g.getColor();    g.setColor(color);    g.fillRect(x, y, width, height);    g.setColor(orgColor);   }      /**    * 得到代表所占范围的矩形    * @return 代表他所占范围的矩形    */     public Rectangle getRect() {    return new Rectangle(x, y, width, height);   }  }

//Explode.java    package edu.wkx;  import java.awt.Color;  import java.awt.Graphics;    /**   * 爆炸类   * @author Java_Bean 王凯旋   *   */    public class Explode {   private int x = 0;   private int y = 0;   private Color color = Color.WHITE;   private int totalStep = 70;   private int speed = 8;   private int step = 0;   private TankClient tc = null;      /**    * 构造函数    * @param x 爆炸地点的x坐标    * @param y 爆炸地点的y坐标    * @param tc 所属主类的引用    */      public Explode(int x, int y, TankClient tc) {    this.x = x;    this.y = y;    this.tc = tc;   }      /**    * 在屏幕上能画出他自己    * @param g 图形类    */     public void draw(Graphics g) {    Color orgColor = g.getColor();    g.setColor(color);    g.fillOval(x - step / 2, y - step / 2, step, step);    step+=speed;    if (step >= totalStep) {     step = 0;     tc.getExplodes().remove(this);    }    g.setColor(orgColor);   }     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 Color getColor() {    return color;   }     public void setColor(Color color) {    this.color = color;   }     public int getTotalStep() {    return totalStep;   }     public void setTotalStep(int totalStep) {    this.totalStep = totalStep;   }     public int getStep() {    return step;   }     public void setStep(int step) {    this.step = step;   }     public TankClient getTc() {    return tc;   }     public void setTc(TankClient tc) {    this.tc = tc;   }      public int getSpeed() {    return speed;   }     public void setSpeed(int speed) {    this.speed = speed;   }      }

//Missile.java    package edu.wkx;  import java.awt.Color;  import java.awt.Graphics;  import java.awt.Rectangle;    /**   * 子弹类   * @author Java_Bean 王凯旋   *   */    public class Missile {     private int x = 0;   private int y = 0;   private int size = 7;   private Color color = Color.BLACK;   private int xSpeed = 15;   private int ySpeed = 15;   private Tank.Direction dir = Tank.Direction.STOP;   private TankClient tc = null;   private Tank t = null;   private int attackHurt = 10;   private int bigAttackHurt = 100;     /**    * 构造函数    * @param x 子弹所在位置的x坐标    * @param y 子弹所在位置的y坐标    * @param dir 子弹飞出的方向    * @param t 发出子弹的坦克的引用    * @param tc 子弹所属主类的引用    */      public Missile(int x, int y, Tank.Direction dir, Tank t, TankClient tc) {    this.x = x - size / 2;    this.y = y - size / 2;    this.dir = dir;    this.tc = tc;    this.t = t;   }     /**    * 构造函数    * @param x 子弹所在位置的x坐标    * @param y 子弹所在位置的y坐标    * @param dir 子弹飞出的方向    * @param t 发出子弹的坦克的引用    * @param tc 子弹所属主类的引用    * @param size 子弹的大小    */      public Missile(int x, int y, Tank.Direction dir, Tank t, TankClient tc,     int size) {    this.size = size;    this.x = x - size / 2;    this.y = y - size / 2;    this.dir = dir;    this.tc = tc;    this.t = t;    this.attackHurt = bigAttackHurt;   }     /**    * 在屏幕上画出他自己    * @param g 图形类    */      public void draw(Graphics g) {    Color orgColor = g.getColor();    g.setColor(color);    g.fillOval(x, y, size, size);    g.setColor(orgColor);    move();   }      private void move() {    switch (dir) {    case U:     y -= ySpeed;     break;    case D:     y += ySpeed;     break;    case L:     x -= xSpeed;     break;    case R:     x += xSpeed;     break;    case LU:     x -= xSpeed;     y -= ySpeed;     break;    case RU:     x += xSpeed;     y -= ySpeed;     break;    case LD:     x -= xSpeed;     y += ySpeed;     break;    case RD:     x += xSpeed;     y += ySpeed;     break;    }    if (x + size / 2 < 0 || y + size / 2 < 0      || x + size / 2 > TankClient.GAME_WIDTH      || y + size / 2 > TankClient.GAME_HEIGHT)     tc.getMissiles().remove(this);   }      /**    * 判断是否撞到了坦克    * @param t 所要判断的坦克    * @return 是否撞到了坦克    */     public boolean hitTank(Tank t) {    if (this.getRect().intersects(t.getRect())) {     if ((this.t.isGood() && !t.isGood())       || (!this.t.isGood() && t.isGood()))      return true;    }    return false;   }     /**    * 判断是否撞到了墙    * @param w 所要判断的墙    * @return 是否撞到了墙    */      public boolean hitWall(Wall w) {    return this.getRect().intersects(w.getRect());   }     /**    * 得到表示子弹范围的矩形    * @return 表示子弹范围的矩形    */      public Rectangle getRect() {    return new Rectangle(x, y, size, size);   }     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 int getSize() {    return size;   }     public void setSize(int size) {    this.size = size;   }     public Color getColor() {    return color;   }     public void setColor(Color color) {    this.color = color;   }     public int getxSpeed() {    return xSpeed;   }     public void setxSpeed(int xSpeed) {    this.xSpeed = xSpeed;   }     public int getySpeed() {    return ySpeed;   }     public void setySpeed(int ySpeed) {    this.ySpeed = ySpeed;   }     public Tank.Direction getDir() {    return dir;   }     public void setDir(Tank.Direction dir) {    this.dir = dir;   }     public TankClient getTc() {    return tc;   }     public void setTc(TankClient tc) {    this.tc = tc;   }     public Tank getT() {    return t;   }     public void setT(Tank t) {    this.t = t;   }     public int getAttackHurt() {    return attackHurt;   }     public void setAttackHurt(int attackHurt) {    this.attackHurt = attackHurt;   }    }

//Blood.java    package edu.wkx;  import java.awt.Color;  import java.awt.Graphics;  import java.awt.Rectangle;    /**   * 补血血块类   * @author Java_Bean 王凯旋   *   */    public class Blood {   private int x = 0;   private int y = 0;   private int blood = 15;   private int size = 10;     private Color color=Color.RED;     /**    * 构造方法    * @param x 血块出现的x坐标    * @param y 血块出现的y坐标    */      public Blood(int x, int y) {    this.x = x;    this.y = y;   }     /**    * 构造方法    * @param x 血块出现的x坐标    * @param y 血块出现的y坐标    * @param blood 一个血块回复的生命值    */      public Blood(int x, int y, int blood) {    this(x, y);    this.blood = blood;   }      /**    * 判断是否和坦克相撞    * @param t 与之相撞的坦克    * @return 是否相撞    */      public boolean hitTank(Tank t) {    return this.getRect().intersects(t.getRect());   }      /**    * 在屏幕上画出他自己    * @param g 图形类    */      void draw(Graphics g) {    Color orgColor = g.getColor();    g.setColor(color);    g.fillOval(x, y, size, size);    g.setColor(orgColor);   }      /**    * 得到血块所代表的矩形    * @return 血块代表的矩形    */      public Rectangle getRect() {    return new Rectangle(x, y, size, size);   }     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 int getBlood() {    return blood;   }     public void setBlood(int blood) {    this.blood = blood;   }      public int getSize() {    return size;   }     public void setSize(int size) {    this.size = size;   }  }

转自:http://blog.csdn.net/jack_wong2010/article/details/7664370