首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java实战】Java实现坦克大战(韩顺平版)

【Java实战】Java实现坦克大战(韩顺平版)

作者头像
小皮侠
发布2024-04-08 20:37:04
发布2024-04-08 20:37:04
1.1K0
举报

    坦克大战 

       该坦克大战运用了JavaGUI图形库,多线程,文件IO,反射等Java高级编程中的知识,用来巩固Java语法非常合适。            我在韩老师原版的设计上做了一些改变,敌方坦克会永远保持三个,你每杀死一辆敌方坦克,并会在屏幕内随机生成一个敌方坦克以此来增加游戏乐趣,其他内容与原版无异。下面是展示图:

该项目总共九个类,包含近1000行代码。

编程过程中的一些注意事项:

  1. 坦克爆炸是通过反射实现的,而反射是Java程序在运行时实现的,所以图片应该放在项目的out文件夹下。
  2. 第一个爆炸图片加载不出来是因为线程刚加载的时候运行速度过快,可以把第一个图片的life放大。

这是我第一次分享项目,有其他问题或不足的欢迎大家在评论区讨论,也可以私聊问我哦。

图示

以上是基本的运行内容,下面是源代码实现:

1.方法入口(TankGame06)

代码语言:javascript
复制
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;

public class TankGame06 extends JFrame {
    static Scanner scanner=new Scanner(System.in);
    private Mypanel mp=null;
    public static void main(String[] args) {
      new TankGame06();
    }

    public TankGame06(){
        System.out.println("请输入你的选择>:");
        System.out.println("1. 开启新游戏        2. 继续上局游戏");
        String key=scanner.next();
        mp=new Mypanel(key);
        Thread thread=new Thread(mp);
        thread.start();
        this.add(mp);
        this.setSize(1300,800);
        this.addKeyListener(mp);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                Recorder.keepRecord();
                System.exit(0);
            }
        });
    }
}

2.坦克类父类(Tank)

代码语言:javascript
复制
public class Tank {
    private int x;
    private int y;
    private int direct;
    private int speed;
    boolean isLive=true;
    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public void moveUp(){
        direct=0;
        this.y=this.y-speed;
    }
    public void moveDown(){
        direct=2;
        y=y+speed;
    }
    public void moveLeft(){
        direct=3;
        x=x-speed;
    }
    public void moveRight(){
        direct=1;
        x=x+speed;
    }
    public Tank(int x, int y,int direct,int speed) {
        this.x = x;
        this.y = y;
        this.direct=direct;
        this.speed=speed;
    }


    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;
    }
}

3.射击类(Shot)

代码语言:javascript
复制
public class Shot implements Runnable {
    int x;
    int y;
    int direct=0;
    int speed=5;
    boolean isLive =true;
    public Shot(int x,int y,int direct){
        this.x=x;
        this.y=y;
        this.direct=direct;
    }
    @Override
    public void run() {
      while(true){
          try {
              Thread.sleep(50);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          switch (direct){
              case 0:
                  y-=speed;
                  break;
              case 1:
                  x+=speed;
                  break;
              case 2:
                  y+=speed;
                  break;
              case 3:
                  x-=speed;
                  break;
          }
          System.out.println("子弹x="+x+"y="+y);
          if(!(x>=0&&x<=1000&&y>=0&&y<=750&&isLive)){
              isLive=false;
              break;
          }
      }
    }
}

4.文件记录类

代码语言:javascript
复制
import java.io.*;
import java.util.Vector;

public class Recorder {
    private static int allEnemyTankNum=0;
    private static BufferedWriter bw=null;
    private static BufferedReader br=null;
    private static String recordFile="src\\myRecord.txt";
    private static Vector<Enemy> enemyTanks =null;
    private static Hero hero=null;
    private static Vector<Node> nodes=new Vector<>();
    public static Vector<Node> getNodesAndEnemyTankRec(){
        try {
            br=new BufferedReader(new FileReader(recordFile));
                allEnemyTankNum = Integer.parseInt(br.readLine());
            String line=null;
            while ((line =br.readLine())!=null){
                String[] xyd=line.split(" ");
                if(xyd.length>=3){
                Node node=new Node(Integer.parseInt(xyd[0]),Integer.parseInt(xyd[1]),Integer.parseInt(xyd[2]));
                nodes.add(node);
                } else if (xyd.length==1) {
                    Node node=new Node(Integer.parseInt(xyd[0]));
                    nodes.add(node);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(br!=null){
                br.close();}
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return nodes;
    }

    public static void setEnemyTanks(Vector<Enemy> enemyTanks) {
        Recorder.enemyTanks = enemyTanks;
    }
    //当游戏退出时,保存击毁敌方坦克数以及敌人坦克的坐标和方向。
    public static void keepRecord() {
        try {
            bw=new BufferedWriter(new FileWriter(recordFile));
            bw.write(allEnemyTankNum+"\r\n");
            if(enemyTanks!=null){
            for(int i=0;i<enemyTanks.size();i++){
                Enemy enemyTank=enemyTanks.get(i);
                if(enemyTank.isLive){
                    String record=enemyTank.getX()+" "+enemyTank.getY()+" "+enemyTank.getDirect();
                    bw.write(record+"\r\n");
                }
            }
            }
            if(hero!=null){
                if(hero.isLive==true) {
                    String record = hero.getX() + " " + hero.getY() + " " + hero.getDirect();
                    bw.write(record + "\r\n");
                }else if(hero.isLive==false) {
                    bw.write("-1");
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                bw.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static int getAllEnemyTankNum() {
        return allEnemyTankNum;
    }

    public static void setAllEnemyTankNum(int allEnemyTankNum) {
        Recorder.allEnemyTankNum = allEnemyTankNum;
    }
    public static void addAllEnemyTankNum(){
        Recorder.allEnemyTankNum++;
    }

    public static Hero getHero() {
        return hero;
    }

    public static void setHero(Hero hero) {
        Recorder.hero = hero;
    }
}

5.记录坦克位置的类(Node)

代码语言:javascript
复制
public class Node {
    private int x;
    private int y;
    private int direct;
    private int button=0;
    public Node(int x,int y,int direct){
       this.x=x;
       this.y=y;
       this.direct=direct;
    }
    public Node(int button){
        this.button=button;
    }

    public int getButton() {
        return button;
    }

    public void setButton(int button) {
        this.button = button;
    }

    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 getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }
}

6.绘画类(Mypanel)

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

public class Mypanel extends JPanel implements KeyListener,Runnable {
    Hero hero=null;
    Vector<Enemy> vector=new Vector<>();
    Vector<Bomb> bombs=new Vector<>();
    Vector<Node> nodes=new Vector<>();
    int Enemysize=3;
    private Graphics g;
    Image image1=null;
    Image image2=null;
    Image image3=null;

    public Mypanel(String key){
        //初始化图片对象
        image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image1.png"));
        image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image2.png"));
        image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image3.png"));
        switch (key){
            case "1":
                for(int i=0;i<Enemysize;i++){
                    vector.add(new Enemy(100*(1+i),0,2,1));
                    Enemy enemytank=vector.get(i);
                    enemytank.setEnemytanks(vector);
                    Recorder.setEnemyTanks(vector);
                    new Thread(enemytank).start();
                    Shot shot=new Shot(enemytank.getX()+20,enemytank.getY()+60,enemytank.getDirect());
                    enemytank.shots.add(shot);
                    new Thread(shot).start();
                }
                hero=new Hero(750,600,0,10);
                Recorder.setHero(hero);
                break;
                //继续上局游戏
            case "2":
                nodes=Recorder.getNodesAndEnemyTankRec();
                Node nodebutton=nodes.get(3);
                if(nodebutton.getButton()==-1){
                    for(int i=0;i<Enemysize;i++){
                        vector.add(new Enemy(100*(1+i),0,2,1));
                        Enemy enemytank=vector.get(i);
                        enemytank.setEnemytanks(vector);
                        Recorder.setEnemyTanks(vector);
                        new Thread(enemytank).start();
                        Shot shot=new Shot(enemytank.getX()+20,enemytank.getY()+60,enemytank.getDirect());
                        enemytank.shots.add(shot);
                        new Thread(shot).start();
                    }
                    hero=new Hero(750,600,0,10);
                    Recorder.setHero(hero);
                    break;
                }
                for(int i=0;i<nodes.size()-1;i++) {
                    Node node = nodes.get(i);
                    vector.add(new Enemy(node.getX(), node.getY(), node.getDirect(), 1));
                    Enemy enemytank = vector.get(i);
                    enemytank.setEnemytanks(vector);
                    Recorder.setEnemyTanks(vector);
                    new Thread(enemytank).start();
                    Shot shot = new Shot(enemytank.getX() + 20, enemytank.getY() + 60, enemytank.getDirect());
                    enemytank.shots.add(shot);
                    new Thread(shot).start();
                }
                    Node nodehero = nodes.get(3);
                hero=new Hero(nodehero.getX(),nodehero.getY(),nodehero.getDirect(),10);
                Recorder.setHero(hero);
                break;
            default:
                System.out.println("输入数据不合法!");
        }
    }
   public void showInfo(Graphics g){
        g.setColor(Color.black);
        Font font=new Font("宋体",Font.BOLD,25);
        g.setFont(font);
        g.drawString("您累计击毁敌方坦克",1020,30);
        drawTank(1020,60,g,0,0);
        g.setColor(Color.black);
        g.drawString(Recorder.getAllEnemyTankNum()+"",1080,100);
   }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        showInfo(g);
        g.fillRect(0,0,1000,750);
        if(hero.isLive) {
            drawTank(hero.getX(), hero.getY(), g, 1, hero.getDirect());
        }
        for(int i=0;i<hero.shots.size();i++){
            g.draw3DRect(hero.shots.get(i).x,hero.shots.get(i).y,1,1,false);
        }

        for(int i=0;i<bombs.size();i++){
            Bomb bomb=bombs.get(i);
            if(bomb.life>6){
                g.drawImage(image1,bomb.x,bomb.y,60,60,this);
            }else if(bomb.life>3){
                g.drawImage(image2,bomb.x,bomb.y,60,60,this);
            } else {
                g.drawImage(image3,bomb.x,bomb.y,60,60,this);
            }
            bomb.lifeDown();
            if(bomb.life==0){
                bombs.remove(bomb);
            }
        }
        for(int i=0;i<vector.size();i++){
            if(vector.get(i).isLive){
            Enemy enemy=vector.get(i);
            drawTank(enemy.getX(),enemy.getY(),g,0,enemy.getDirect());
            for(int j=0;j<enemy.shots.size();j++){
            Shot shot=enemy.shots.get(j);
            if(shot.isLive){
            g.draw3DRect(shot.x,shot.y,2,2,false);
            }else {
                enemy.shots.remove(shot);
                  }
              }
            }
        }

    }
    public void drawTank(int x,int y,Graphics g,int type,int direct){
        switch (type){
            case 0:
                g.setColor(Color.cyan);
                break;
            case 1:
                g.setColor(Color.yellow);
                break;
        }
        switch (direct){
            case 0:
                g.fill3DRect(x, y,10,60,false);
                g.fill3DRect(x+30,y,10,60,false);
                g.fill3DRect(x+10,y+10,20,40,false);
                g.fillOval(x+10,y+20,20,20);
                g.drawLine(x+20,y,x+20,y+30);
                break;
            case 1:
                g.fill3DRect(x, y,60,10,false);
                g.fill3DRect(x,y+30,60,10,false);
                g.fill3DRect(x+10,y+10,40,20,false);
                g.fillOval(x+20,y+10,20,20);
                g.drawLine(x+30,y+20,x+60,y+20);
                break;
            case 2:
                g.fill3DRect(x, y,10,60,false);
                g.fill3DRect(x+30,y,10,60,false);
                g.fill3DRect(x+10,y+10,20,40,false);
                g.fillOval(x+10,y+20,20,20);
                g.drawLine(x+20,y+30,x+20,y+60);
                break;
            case 3:
                g.fill3DRect(x, y,60,10,false);
                g.fill3DRect(x,y+30,60,10,false);
                g.fill3DRect(x+10,y+10,40,20,false);
                g.fillOval(x+20,y+10,20,20);
                g.drawLine(x,y+20,x+30,y+20);
                break;
        }
    }

    //编写方法,判断我方坦克是否击中敌人坦克
    public void hiteTank(Shot s,Tank enemytank){
        switch (enemytank.getDirect()){
            case 0:
            case 2:
                if(s.x>enemytank.getX()&&s.x<enemytank.getX()+40 &&
                        s.y>enemytank.getY()&&s.y<enemytank.getY()+60&& enemytank.isLive){
                    s.isLive=false;
                    enemytank.isLive=false;
                    vector.remove(enemytank);
                    if(enemytank instanceof Enemy){
                        Recorder.addAllEnemyTankNum();
                        if(vector.size()<3){
                            vector.add(new Enemy((int)(Math.random()*900),(int)(Math.random()*700),2,1));
                            Enemy enemytank1=vector.get(2);
                            enemytank1.setEnemytanks(vector);
                            Recorder.setEnemyTanks(vector);
                            new Thread(enemytank1).start();
                            Shot shot=new Shot(enemytank1.getX()+20,enemytank1.getY()+60,enemytank1.getDirect());
                            enemytank1.shots.add(shot);
                            new Thread(shot).start();
                        }
                    }
                    if(enemytank instanceof Hero){
                        System.out.println("游戏结束,你累计击毁了"+Recorder.getAllEnemyTankNum()+"个坦克");
                        Recorder.setAllEnemyTankNum(0);
                        Recorder.keepRecord();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                        System.exit(0);
                    }
                    Bomb bomb=new Bomb(enemytank.getX(),enemytank.getY());
                    bombs.add(bomb);
                }
                break;
            case 1:
            case 3:
                if(s.x>enemytank.getX()&&s.x< enemytank.getX()+60&&
                  s.y>enemytank.getY()&&s.y<enemytank.getY()+40&&enemytank.isLive){
                    s.isLive=false;
                    enemytank.isLive=false;
                    vector.remove(enemytank);
                    if(enemytank instanceof Enemy){
                        Recorder.addAllEnemyTankNum();
                        if(vector.size()<3){
                            vector.add(new Enemy((int)(Math.random()*400)+100,(int)(Math.random()*200)+100,2,1));
                            Enemy enemytank1=vector.get(2);
                            enemytank1.setEnemytanks(vector);
                            Recorder.setEnemyTanks(vector);
                            new Thread(enemytank1).start();
                            Shot shot=new Shot(enemytank1.getX()+20,enemytank1.getY()+60,enemytank1.getDirect());
                            enemytank1.shots.add(shot);
                            new Thread(shot).start();
                        }
                    }
                    if(enemytank instanceof Hero){
                        System.out.println("游戏结束,你累计击毁了"+Recorder.getAllEnemyTankNum()+"个坦克");
                        Recorder.setAllEnemyTankNum(0);
                        Recorder.keepRecord();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                        System.exit(0);
                    }
                    Bomb bomb=new Bomb(enemytank.getX(),enemytank.getY());
                    bombs.add(bomb);
                }
                break;
        }
    }
    public void hiteEnemyTank(){
        //判断是否击中敌人坦克
        for(int i=0;i<hero.shots.size();i++){
            Shot shot=hero.shots.get(i);
            if(shot.isLive&&shot!=null){
                for(int j=0;j<vector.size();j++){
                    Enemy enemyTank=vector.get(j);
                    hiteTank(shot,enemyTank);
                }
            }else{
                hero.shots.remove(i);
            }
        }
    }

    public void hiteHeroTank(){
        for(int i=0;i<vector.size();i++){
            Enemy enemytank=vector.get(i);
            for (int j=0;j<enemytank.shots.size();j++){
                Shot shot=enemytank.shots.get(j);
                if(shot!=null&&shot.isLive){
                    hiteTank(shot,hero);
                }else {
                    enemytank.shots.remove(j);
                }
            }
        }
    }
    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
     if(e.getKeyCode()==KeyEvent.VK_W){
         if(hero.getY()>0){
         hero.moveUp();}
         this.repaint();
     } else if (e.getKeyCode()==KeyEvent.VK_D) {
         if(hero.getX()<940){
         hero.moveRight();}
         this.repaint();
     } else if (e.getKeyCode()==KeyEvent.VK_S) {
         if(hero.getY()<690){
         hero.moveDown();}
         this.repaint();
     } else if (e.getKeyCode()==KeyEvent.VK_A) {
         if(hero.getX()>0){
         hero.moveLeft();}
         this.repaint();
     }
     if(e.getKeyCode()==KeyEvent.VK_J){
         hero.shotEnemyTank();
     }
     this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            for(int l=0;l<vector.size();l++){
                Enemy enemytank=vector.get(l);
                if(!enemytank.isLive){
                    vector.remove(enemytank);
                }
            }
            hiteEnemyTank();
            hiteHeroTank();
            this.repaint();
        }
    }
}

7.我方坦克类(Hero)

代码语言:javascript
复制
import java.util.Vector;

public class Hero extends Tank {
    boolean islive=true;
    Shot shot=null;
    Vector<Shot> shots=new Vector<>();


    public Hero(int x, int y,int direct,int speed ) {
        super(x, y,direct,speed);
    }
    public void shotEnemyTank(){
        switch (getDirect()){
            case 0:
                if(shots.size()<5){
                shot=new Shot(getX()+20,getY(),0);
                    new Thread(shot).start();
                shots.add(shot);
                }
                break;
            case 1:
                if(shots.size()<5) {
                    shot = new Shot(getX() + 60, getY() + 20, 1);
                    new Thread(shot).start();
                    shots.add(shot);
                }
                break;
            case 2:
                if(shots.size()<5) {
                    shot = new Shot(getX() + 20, getY() + 60, 2);
                    new Thread(shot).start();
                shots.add(shot);
                }break;
            case 3:
                if(shots.size()<5){
                    shot=new Shot(getX(),getY()+20,3);
                    new Thread(shot).start();
                    shots.add(shot);
                }
                break;
        }
    }
}

8.敌方坦克类(Enemy)

代码语言:javascript
复制
import java.util.Vector;

public class Enemy extends Tank implements Runnable{
    Vector<Shot> shots=new Vector<>();

    Vector <Enemy> enemytanks=new Vector<>();

    public void setEnemytanks(Vector<Enemy> enemytanks) {
        this.enemytanks = enemytanks;
    }

    public boolean isTouchEnemyTank(){
        switch (this.getDirect()){
            case 0:
                for(int i=0;i<enemytanks.size();i++){
                    Enemy enemyTank=enemytanks.get(i);
                    if(enemyTank!=this){
                        if(enemyTank.getDirect()==0||enemyTank.getDirect()==2){
                          if(this.getX()>=enemyTank.getX()
                                  &&this.getX()<=enemyTank.getX()+40
                                  &&this.getY()>=enemyTank.getY()
                                  &&this.getY()<=enemyTank.getY()+60){
                              return true;
                          }
                          if(this.getX()+40>=enemyTank.getX()
                                    &&this.getX()+40<=enemyTank.getX()+40
                                    &&this.getY()>=enemyTank.getY()
                                    &&this.getY()<=enemyTank.getY()+60){
                                return true;
                          }
                        }
                        if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
                                if(this.getX()>=enemyTank.getX()
                                        &&this.getX()<=enemyTank.getX()+60
                                        &&this.getY()>=enemyTank.getY()
                                        &&this.getY()<=enemyTank.getY()+40){
                                    return true;
                                }
                                if(this.getX()+40>=enemyTank.getX()
                                        &&this.getX()+40<=enemyTank.getX()+60
                                        &&this.getY()>=enemyTank.getY()
                                        &&this.getY()<=enemyTank.getY()+40){
                                    return true;
                                }
                    }
                }
                }
                break;
            case 1:
                for(int i=0;i<enemytanks.size();i++){
                    Enemy enemyTank=enemytanks.get(i);
                    if(enemyTank!=this){
                        if(enemyTank.getDirect()==0||enemyTank.getDirect()==2){
                            if(this.getX()+60>=enemyTank.getX()
                                    &&this.getX()+60<=enemyTank.getX()+40
                                    &&this.getY()>=enemyTank.getY()
                                    &&this.getY()<=enemyTank.getY()+60){
                                return true;
                            }
                            if(this.getX()+60>=enemyTank.getX()
                                    &&this.getX()+60<=enemyTank.getX()+40
                                    &&this.getY()+40>=enemyTank.getY()
                                    &&this.getY()+40<=enemyTank.getY()+60){
                                return true;
                            }
                        }
                        if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
                                if(this.getX()+60>=enemyTank.getX()
                                        &&this.getX()+60<=enemyTank.getX()+60
                                        &&this.getY()>=enemyTank.getY()
                                        &&this.getY()<=enemyTank.getY()+40){
                                    return true;
                                }
                                if(this.getX()+60>=enemyTank.getX()
                                        &&this.getX()+60<=enemyTank.getX()+60
                                        &&this.getY()+40>=enemyTank.getY()
                                        &&this.getY()+40<=enemyTank.getY()+40){
                                    return true;
                                }
                            }
                        }
                }
                break;
            case 2:
                for(int i=0;i<enemytanks.size();i++){
                    Enemy enemyTank=enemytanks.get(i);
                    if(enemyTank!=this){
                        if(enemyTank.getDirect()==0||enemyTank.getDirect()==2){
                            if(this.getX()>=enemyTank.getX()
                                    &&this.getX()<=enemyTank.getX()+40
                                    &&this.getY()+60>=enemyTank.getY()
                                    &&this.getY()+60<=enemyTank.getY()+60){
                                return true;
                            }
                            if(this.getX()+40>=enemyTank.getX()
                                    &&this.getX()+40<=enemyTank.getX()+40
                                    &&this.getY()+60>=enemyTank.getY()
                                    &&this.getY()+60<=enemyTank.getY()+60){
                                return true;
                            }
                        }
                        if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
                                if(this.getX()>=enemyTank.getX()
                                        &&this.getX()<=enemyTank.getX()+60
                                        &&this.getY()+60>=enemyTank.getY()
                                        &&this.getY()+60<=enemyTank.getY()+40){
                                    return true;
                                }
                                if(this.getX()+40>=enemyTank.getX()
                                        &&this.getX()+40<=enemyTank.getX()+60
                                        &&this.getY()+60>=enemyTank.getY()
                                        &&this.getY()+60<=enemyTank.getY()+40){
                                    return true;
                                }
                            }
                        }
                }
                break;
            case 3:
                for(int i=0;i<enemytanks.size();i++){
                    Enemy enemyTank=enemytanks.get(i);
                    if(enemyTank!=this){
                        if(enemyTank.getDirect()==0||enemyTank.getDirect()==2){
                            if(this.getX()>=enemyTank.getX()
                                    &&this.getX()<=enemyTank.getX()+40
                                    &&this.getY()>=enemyTank.getY()
                                    &&this.getY()<=enemyTank.getY()+60){
                                return true;
                            }
                            if(this.getX()>=enemyTank.getX()
                                    &&this.getX()<=enemyTank.getX()+40
                                    &&this.getY()+40>=enemyTank.getY()
                                    &&this.getY()+40<=enemyTank.getY()+60){
                                return true;
                            }
                        }
                        if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
                                if(this.getX()>=enemyTank.getX()
                                        &&this.getX()<=enemyTank.getX()+60
                                        &&this.getY()>=enemyTank.getY()
                                        &&this.getY()<=enemyTank.getY()+40){
                                    return true;
                                }
                                if(this.getX()>=enemyTank.getX()
                                        &&this.getX()<=enemyTank.getX()+60
                                        &&this.getY()+40>=enemyTank.getY()
                                        &&this.getY()+40<=enemyTank.getY()+40){
                                    return true;
                                }
                            }
                    }
                }
                break;
        }
        return false;
    }
    public Enemy(int x, int y,int direct,int speed) {
        super(x, y,direct,speed);
    }

    @Override
    public void run() {

        while(true){

            if(shots.size()<=3){
                Shot shot=null;
                switch (getDirect()){
                    case 0:
                        shot=new Shot(getX()+20,getY(),0);
                        shots.add(shot);
                        new Thread(shot).start();
                        break;
                    case 1:
                        shot=new Shot(getX()+60,getY()+20,1);
                        shots.add(shot);
                        new Thread(shot).start();
                        break;
                    case 2:
                        shot=new Shot(getX()+20,getY()+60,2);
                        shots.add(shot);
                        new Thread(shot).start();
                        break;
                    case 3:
                        shot=new Shot(getX(),getY()+20,3);
                        shots.add(shot);
                        new Thread(shot).start();
                        break;
                }
            }

            switch ((int)(Math.random()*4)){
                case 0:
                    for (int i=0;i<30;i++){
                        if(getY()>0&&!isTouchEnemyTank()){
                    moveUp();}
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    break;
                case 1:
                    for (int i=0;i<30;i++) {
                        if(getX()+60<1000&&!isTouchEnemyTank()){
                        moveRight();}
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    break;
                case 2:
                    for(int i=0;i<30;i++){
                        if(getY()+60<750&&!isTouchEnemyTank()){
                            moveDown();}
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    break;
                case 3:
                    for(int i=0;i<30;i++){
                        if(getX()>0&&!isTouchEnemyTank()){
                    moveLeft();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    break;
            }
            if(isLive==false){
                break;
            }
        }
    }
}

9.炸弹类(Bomb)

代码语言:javascript
复制
public class Bomb {
    int x,y;
    int life=18;
    boolean isLive=true;
    public Bomb(int x,int y){
        this.x=x;
        this.y=y;
    }
    public void lifeDown(){
        if(life >0){
            life--;
        }else{
            isLive=false;
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •     坦克大战 
    • 编程过程中的一些注意事项:
    • 图示
    • 1.方法入口(TankGame06)
    • 2.坦克类父类(Tank)
    • 3.射击类(Shot)
    • 4.文件记录类
    • 5.记录坦克位置的类(Node)
    • 6.绘画类(Mypanel)
    • 7.我方坦克类(Hero)
    • 8.敌方坦克类(Enemy)
    • 9.炸弹类(Bomb)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档