import java.awt.*;
import java.awt.List;
import java.awt.event.*;
import java.util.*;public class tankclient extends Frame {
final static int width =600;
final static int height=600;
Image offScreenImage = null;
tank mytank=new tank(32,54,this,true);
ArrayList<tank> tanks = new ArrayList<tank>();
ArrayList<baozha>baozhas=new ArrayList<baozha>();
ArrayList<missile> missiles = new ArrayList<missile>();

public void lanchfame(){
this.setSize(width, height);
this.setVisible(true);
this.setBackground(Color.green);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(1);
}
});
new Thread(new repaint()).start();
this.addKeyListener(new kn());
for(int i=0;i<7;i++){
tanks.add(new tank(50+(i*80),170,this,false,tank.direction.D));
tanks.get(i).move();
}
}
public void paint(Graphics g) {
g.drawString("tanks    count:"  + tanks.size(), 10, 40);
g.drawString("missile    count:"  + missiles.size(), 10, 60);
g.drawString("explodes count:" + baozhas.size(), 10, 80);
mytank.draw(g);
for(int i=0;i<tanks.size();i++){
tanks.get(i).draw(g);
}
for(int i=0;i<baozhas.size();i++){
baozhas.get(i).draw(g);
}
for(int i=0;i<missiles.size();i++){
missile m=missiles.get(i);
m.zhodang(tanks);
m.draw(g);
}
}
      public static void main(String args[]){
       tankclient tc=new tankclient();
       tc.lanchfame();
      }
      class repaint implements Runnable {
       public void run(){
       while(true){
       repaint();
       try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
       }
       }
      }
      class kn extends KeyAdapter {
       public void keyPressed(KeyEvent e){
       mytank.keyPressed(e);
       }
   public void keyReleased(KeyEvent e) {
mytank.keyReleased(e);
}
      }
   public void update(Graphics g) {
if(offScreenImage == null) {
offScreenImage = this.createImage(width, height);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, width, height);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
}

解决方案 »

  1.   

    import java.awt.*;
    import java.util.ArrayList;
    public class missile {
        final static int width=5;
        final static int height=5;
        tank.direction paoto;
        int x;
        int y;
        tankclient tc;
        boolean islive=true;
        boolean begood=true;
        
        public missile(int x, int y,tank.direction paoto,tankclient tc,boolean begood) {
            this.x=x;
            this.y=y;
            this.paoto=paoto;
            this.tc=tc;
            this.begood=begood;
    }
        public void draw(Graphics g){
         g.fillOval(x, y, width, height);
         move();
        }
    public Rectangle getRect() {
    return new Rectangle(x, y, width, height);
    }
        public void zhodang(ArrayList<tank> tanks){
         for(int i=0; i<tanks.size(); i++) {
         if(this.begood&&this.getRect().intersects(tanks.get(i).getRect())) {
         tanks.remove(i);
         tc.missiles.remove(this);
         tc.baozhas.add(new baozha(x,y,tc));}
         }
         }
    private void move() {
    final int XSPEED=10;
    final int YSPEED=10;
    switch(paoto) {
    case L:
    x -= XSPEED;
    break;
    case LU:
    x -= XSPEED;
    y -= YSPEED;
    break;
    case U:
    y -= YSPEED;
    break;
    case RU:
    x += XSPEED;
    y -= YSPEED;
    break;
    case R:
    x += XSPEED;
    break;
    case RD:
    x += XSPEED;
    y += YSPEED;
    break;
    case D:
    y += YSPEED;
    break;
    case LD:
    x -= XSPEED;
    y += YSPEED;
    break;
    }

    }
    }
    import java.awt.*;
    public class baozha {
         int x;int y;
         boolean belive=true;
         tankclient tc;
         int step=0;
         int banjing[]={4, 7, 12, 18, 26, 32, 49, 30, 14, 6};
         public baozha(int x,int y,tankclient tc){
          this.x=x;
          this.y=y;
          this.tc=tc;
         }
      public void draw(Graphics g) {
    if(!belive) {
    tc.baozhas.remove(this);
    return;
    }

    if(step ==banjing.length) {
    belive = false;
    step = 0;
    return;
    }

    Color c = g.getColor();
    g.setColor(Color.ORANGE);
    g.fillOval(x, y, banjing[step], banjing[step]);
    g.setColor(c);

    step ++;
    }
    }
      

  2.   

    import java.awt.*;
    import java.awt.event.*;
    import java.util.Random;
    public class tank {
         final static int width=30;
         final static int height=30;
         final static int XSPEED=5;
         final static int YSPEED=5;
         int oldX;
         int oldY;
         Random r=new Random();
         boolean belive=false;
         enum direction{L,D,U,R,LD,LU,RU,RD,STOP};
         private boolean bL=false, bU=false, bR=false, bD = false;
         direction dir=direction.STOP;
         direction tanksdir=null;
         private int step=r.nextInt(12)+3;
         boolean begood=true;
         int x,y;
         tankclient tc;
         direction paoto=direction.D;
         
         
      public Rectangle getRect() {
    return new Rectangle(x, y, width, height);
    }
      public void tanksmove(){
     
      }
         public void zhodang(){
          for(int i=0;i<tc.missiles.size();i++){
          if(tc.missiles.get(i).getRect().intersects(tc.tanks.get(i).getRect())){
          tc.tanks.remove(i);
          tc.missiles.remove(i);
          }
          }
         }
         public tank(int x,int y,tankclient tc,boolean begood){
          this.begood=begood;
          this.x=x;
          this.y=y;
          this.oldX=x;
          this.oldY=y;
          this.tc=tc;
         }
         public tank(int x,int y,tankclient tc,boolean begood,direction dir){
          this(x,y,tc,begood);
          this.dir=dir;
          
         }
    public void draw(Graphics g){
          Color c=g.getColor();
          if(begood) g.setColor(Color.RED);
          else g.setColor(Color.yellow);
          g.fillOval(x, y, width, height);
          paotofangxiang();
          g.setColor(Color.BLACK);
      switch(paoto) {
    case L:
    g.drawLine(x + tank.height/2, y + tank.height/2, x, y + tank.height/2);
    break;
    case LU:
    g.drawLine(x + tank.width/2, y + tank.height/2, x, y);
    break;
    case U:
    g.drawLine(x + tank.width/2, y + tank.height/2, x + tank.width/2, y);
    break;
    case RU:
    g.drawLine(x + tank.width/2, y + tank.height/2, x + tank.width, y);
    break;
    case R:
    g.drawLine(x + tank.width/2, y + tank.height/2, x + tank.width, y + tank.height/2);
    break;
    case RD:
    g.drawLine(x + tank.width/2, y + tank.height/2, x + tank.width, y + tank.height);
    break;
    case D:
    g.drawLine(x + tank.width/2, y + tank.height/2, x + tank.width/2, y + tank.height);
    break;
    case LD:
    g.drawLine(x + tank.width/2, y + tank.height/2, x, y + tank.height);
    break;
          }
          move();
         }
    void paotofangxiang(){
    locateDirection();
    switch(dir){
    case L:
    paoto=direction.L;
    break;
    case LU:
                paoto=direction.LU;
                break;
    case U:
    paoto=direction.U;
    break;
    case RU:
    paoto=direction.RU;
    break;
    case R:
    paoto=direction.R;
    break;
    case RD:
    paoto=direction.RD;
    break;
    case D:
    paoto=direction.D;
    break;
    case LD:
    paoto=direction.LD;
    break;
    case STOP:
    }
    if(x < 0) x = 0;
    if(y < 30) y = 30;
    if(x + tank.width> tankclient.width) x = tankclient.width - tank.width;
    if(y + tank.height > tankclient.height) y = tankclient.height - tank.height;
    }
    void move() {
    if(!begood){
    direction[] dirs ={direction.L,direction.D,direction.U,direction.R,direction.LD,direction.LU,direction.RU,direction.RD};
    if(step == 0) {
    step = r.nextInt(12)+3;
    int rn = r.nextInt(dirs.length);
    dir = dirs[rn];
    paoto=dir;
    }
    step --;
    if(dir==direction.D)x+=5;
    if(r.nextInt(40) > 38) tc.missiles.add(new missile((x+width/2)-(missile.height),y+(height/2)-(missile.height/2),paoto,tc,false));
    }
    switch(dir) {
    case L:
    x -= XSPEED;
    break;
    case LU:
    x -= XSPEED;
    y -= YSPEED;
    break;
    case U:
    y -= YSPEED;
    break;
    case RU:
    x += XSPEED;
    y -= YSPEED;
    break;
    case R:
    x += XSPEED;
    break;
    case RD:
    x += XSPEED;
    y += YSPEED;
    break;
    case D:
    y += YSPEED;
    break;
    case LD:
    x -= XSPEED;
    y += YSPEED;
    break;
    case STOP:
    break;
    }
    if(!begood){
    direction[] dirs ={direction.L,direction.D,direction.U,direction.R,direction.LD,direction.LU,direction.RU,direction.RD};
    if(step == 0) {
    step = r.nextInt(12)+3;
    int rn = r.nextInt(dirs.length);
    dir = dirs[rn];
    paoto=dir;
    }
    step --;
    if(r.nextInt(40) > 38) tc.missiles.add(new missile((x+width/2)-(missile.height),y+(height/2)-(missile.height/2),paoto,tc,false));
    }
    }

    public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    switch(key) {
    case KeyEvent.VK_CONTROL:
    tc.missiles.add(new missile((x+width/2)-(missile.height),y+(height/2)-(missile.height/2),paoto,tc,true));
    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;
    }
    locateDirection();
    }

    void locateDirection() {
    if(bL && !bU && !bR && !bD) dir = direction.L;
    else if(bL && bU && !bR && !bD) dir = direction.LU;
    else if(!bL && bU && !bR && !bD) dir = direction.U;
    else if(!bL && bU && bR && !bD) dir = direction.RU;
    else if(!bL && !bU && bR && !bD) dir = direction.R;
    else if(!bL && !bU && bR && bD) dir = direction.RD;
    else if(!bL && !bU && !bR && bD) dir = direction.D;
    else if(bL && !bU && !bR && bD) dir = direction.LD;
    else if(!bL && !bU && !bR && !bD) dir = direction.STOP;
    } public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    switch(key) {
    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;
    case KeyEvent.VK_A :
    superFire();
    break;
    }
    locateDirection();
    }
    private void superFire() {
    direction[] dirs = direction.values();
    for(int i=0; i<8; i++) {
    tc.missiles.add(new missile((x+width/2)-(missile.height),y+(height/2)-(missile.height/2),dirs[i],tc,true));
    }
    }
    private void stay() {
    x = oldX;
    y = oldY;
    }
     }
      

  3.   

    if(r.nextInt(40) > 38) tc.missiles.add(new missile((x+width/2)-(missile.height),y+(height/2)-(missile.height/2),paoto,tc,false));  这好像有问题。取(40)>38为了限制子弹发的速度,楼主怎么在这里new 敌人的坦克了 if(r.nextInt(40) > 38) superFire() //应该在这调用superFire()这个方法吧
      

  4.   

    if(r.nextInt(40) > 38)是用来让敌人坦克随机打出一发炮蛋的..大哥.....问题跟这地也没一点关系..这地方没错..
      

  5.   

    楼主大哥.......给个注释吧...看着累啊..
    如过是我的话...t=random.next(100)if(t<80)
     直走else 
     转换一个可以行进的方向这种最简单的方法....我曾经做过一个是50%..效果就不错..如果楼主想让坦克走的更自然些我想想。.咱交流交流吧..很少找到有相同兴趣的朋友..89631718可以的话加我QQ吧...大家一起研究
      

  6.   

    是看 www.bjsxt.com 的马士兵的坦克大战吧?
      

  7.   

    在tank类中把   paotofangxiang() 方法中的  locateDirection() 删除掉迷糊  把我快调试死
      

  8.   

    机器人 不按键盘
    void locateDirection() {
    if (bL && !bU && !bR && !bD)
    dir = direction.L;
    else if (bL && bU && !bR && !bD)
    dir = direction.LU;
    else if (!bL && bU && !bR && !bD)
    dir = direction.U;
    else if (!bL && bU && bR && !bD)
    dir = direction.RU;
    else if (!bL && !bU && bR && !bD)
    dir = direction.R;
    else if (!bL && !bU && bR && bD)
    dir = direction.RD;
    else if (!bL && !bU && !bR && bD)
    dir = direction.D;
    else if (bL && !bU && !bR && bD)
    dir = direction.LD;
    else if (!bL && !bU && !bR && !bD)
    dir = direction.STOP;
    }
    这有什么用
      

  9.   

    你每次draw(Graphics g)的时候调用
        paotofangxiang(); 
    而机器人 不按键盘  所以老是 dir = direction.STOP;