坦克大战(java)

坦克大战

坦克大战游戏的界面如图所示:
在这里插入图片描述
本项目是在韩顺平java学习基础的指导下完成的,视频连接:韩顺平Java基础
该项目主要包括以下几个类:Bomb、EnemyTank、Hero、HspTankGame06、MyPanel、Node、Recoder、Shot、
Tank

该项目主要包括:多线程技术、面向对象编程技术、IO流技术

1、HspTankGame06

package com.hspedu.tankgame06;
import com.hspedu.tankgame06.MyPanel;
import com.hspedu.tankgame06.Recorder;
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
public class HspTankGame06 extends JFrame {
    static Scanner scanner = new Scanner(System.in);
//   定义MyPanel
    MyPanel mp = null;
    public static void main(String[] args) {
        HspTankGame06 hspTankGame01 = new HspTankGame06();
    }
    public HspTankGame06(){
        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,950);
     this.addKeyListener(mp);
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     this.setVisible(true);
     this.addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosing(WindowEvent e) {
            Recorder.keepRecorder();
             System.exit(0);
//             super.windowClosing(e);
         }
     });
    }
}

2、MyPanel

package com.hspedu.tankgame06;

import com.hspedu.tankgame06.*;
import com.sun.jdi.ShortType;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.Vector;
//为了让Panel不停的重绘子弹,需要将MyPanel 实现 Runnable,当做一个线程使用
public class MyPanel extends JPanel implements KeyListener ,Runnable {
//    定义我的坦克
//    定义一个Node对象的Vector,用于恢复敌人坦克的坐标
    Vector<Node> nodes = new Vector<>();
    Hero hero = null;

    Vector<EnemyTank> enemyTanks = new Vector<>();
//   定义一个vector,用于存放炸弹
    Vector<Bomb> bombs = new Vector<>();
//    当子弹击中坦克是,就加入一个Bomb对象到bombs中
    int enemyTankSize = 3;
//    定义三张炸弹图片用于显示爆炸
    Image image1 = null;
    Image image2 = null;
    Image image3 = null;
//    因为是多线程问题所以放在集合中
    public MyPanel(String key){
        File file = new File(Recorder.getRecordFile());
        if (file.exists()){
            nodes = Recorder.getNodesAndEnemyTankRec();
        }else {
            System.out.println("文件不存在只能开启新的游戏");
            key = "1";
        }

        //    将MyPanel对象的enemyTanks 设置给 Recorder 的 enemyTanks
        Recorder.setEnemyTanks(enemyTanks);
        hero = new Hero(500,100);
        switch (Integer.parseInt(key)){
            case 1:
                Recorder.setAllEnemyTankNum(0);
                for (int i = 0; i < enemyTankSize; i++) {
                    EnemyTank enemyTank1 = new EnemyTank(100 * (i + 1), 0);
                    enemyTank1.setEnemyTanks(enemyTanks);
                    enemyTank1.setDirect(2);
//            启动敌人tank线程,让其动起来
                    new Thread(enemyTank1).start();
//            给该enemyTank 加入一颗子弹
                    shot shot =  new shot(enemyTank1.getX()+20,enemyTank1.getY()+60,enemyTank1.getDirect());
                    enemyTank1.shots.add(shot);
                    new Thread(shot).start();

                    enemyTanks.add(enemyTank1);
                }
                break;
            case 2:
                for (int i = 0; i < nodes.size(); i++) {
                    Node node = nodes.get(i);
                    EnemyTank enemyTank1 = new EnemyTank(node.getX(),node.getY());
                    enemyTank1.setEnemyTanks(enemyTanks);
                    enemyTank1.setDirect(node.getDirect());
//            启动敌人tank线程,让其动起来
                    new Thread(enemyTank1).start();
//            给该enemyTank 加入一颗子弹
                    shot shot =  new shot(enemyTank1.getX()+20,enemyTank1.getY()+60,enemyTank1.getDirect());
                    enemyTank1.shots.add(shot);
                    new Thread(shot).start();

                    enemyTanks.add(enemyTank1);
                }
            default:
                System.out.println("输入有误");
        }
//        enemyTank = new EnemyTank(500,500);//初始化自己的tank

//        初始化图片对象
//        image1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
//        image2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
//        image3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
        hero.setSpeed(50);
    }
// 编写方法,显示我方击毁tank的信息
    public void showInfo(Graphics g){
//     画出玩家的总成绩
        g.setColor(Color.BLACK);
        Font font = new Font("宋体", Font.BOLD, 25);
        g.setFont(font);
        g.drawString("您累计击毁敌方坦克",1024,30);
        drawTank(1020,60,g,0,1);
        g.setColor(Color.BLACK);
        g.drawString(Recorder.getAllEnemyTankNum()+"",1080,100);
    }


    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形默认黑色
//        画出坦克
        showInfo(g);
        if (hero!=null&& hero.isLive){
            drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),0);
        }
//        画出hero射击的子弹
        for (int i = 0; i < hero.shots.size(); i++) {
              shot shot = hero.shots.get(i);
            if (shot !=null && shot.isLive != false){
//            g.fill3DRect(hero.shot.x,hero.shot.y,1,1,false);
                g.draw3DRect(shot.x,shot.y,6,6,false);;
            }else {//如果该shot对象已经无效,就从shots集合中拿掉
                hero.shots.remove(shot);
            }
        }
//        如果集合中有炸弹的就要画出来
//        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);
//            }
//        }
//        System.out.println("第一个坦克");
//        drawTank(hero.getX()+70,hero.getY(),g,hero.getDirect(),1);
        System.out.println("第二个坦克");
//        drawTank(hero.getX()+120,hero.getY(),g,hero.getDirect(),1);
//        drawTank(hero.getX()+150,hero.getY()+150,g,hero.getDirect(),1);
//        System.out.println("“”“”“");
//        画出敌人的坦克
//    编写方法画出坦克,遍历几何
//        System.out.println(enemyTankSize);
        for (int i = 0; i < enemyTanks.size(); i++) {
            EnemyTank enemyTank1 = enemyTanks.get(i);
            if (enemyTank1.isLive) {
                drawTank(enemyTank1.getX(), enemyTank1.getY(), g, enemyTank1.getDirect(), 1);
// 画出enemyTank所有子弹
                for (int j = 0; j < enemyTank1.shots.size(); j++) {
                    shot shot = enemyTank1.shots.get(j);
                    if (shot.isLive) {
//                    取出当前shot的x,y
                        g.draw3DRect(shot.x, shot.y, 6, 6, false);
                    } else {
//                    从vetor中移除
                        enemyTank1.shots.remove(shot);
                    }

                }

            }
        }
    }



    /**
 * **/
    public void drawTank(int x,int y,Graphics g ,int direct,int type){
//        根据不同类型的坦克,设置不同颜色
        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+30,y+20,x,y+20);
                break;
            default:
                System.out.println();
        }
    }
    public void hitEnemyTank(){
        for (int j = 0; j < hero.shots.size(); j++) {
             shot shot = hero.shots.get(j);
            if (shot != null && shot.isLive){
                for (int i = 0; i < enemyTanks.size(); i++) {
                    EnemyTank enemyTank = enemyTanks.get(i);
                    hitTank(shot,enemyTank);
                }
            }
        }
    }
    public void hitHeroTank(){
        for (int i = 0; i < enemyTanks.size(); i++) {
            EnemyTank enemyTank = enemyTanks.get(i);
            for (int j = 0; j < enemyTank.shots.size(); j++) {
                shot shot = enemyTank.shots.get(j);
                if (hero.isLive&&shot.isLive){
                    hitTank(shot,hero);
                }

            }

        }
    }
    public  void hitTank(shot shot ,Tank Tank){
        switch (Tank.getDirect()){
            case 0:
            case 2:
                if (shot.x>Tank.getX()&&shot.x<Tank.getX()+40 && shot.y>Tank.getY()
                        &&shot.y<Tank.getY()+60){
                    shot.isLive = false;
                    Tank.isLive = false;
//                    当自己的子弹击中敌人对象后,将enemytank从Vector中拿掉
                    enemyTanks.remove(Tank);
//                    判断删除的坦克是否是敌人坦克,若是加一
                    if(Tank instanceof EnemyTank){
                       Recorder.addallEnemyTankNum();
                    }
                    Bomb bomb = new Bomb(Tank.getX(),Tank.getY());
                    bombs.add(bomb);
                }
            case 1:
            case 3:
                if (shot.x>Tank.getX()&&shot.x<Tank.getX()+60 && shot.y>Tank.getY()
                        &&shot.y<Tank.getY()+40){
                    shot.isLive = false;
                    Tank.isLive = false;
                    enemyTanks.remove(Tank);
                    if(Tank instanceof EnemyTank){
                        Recorder.addallEnemyTankNum();
                    }
                    Bomb bomb = new Bomb(Tank.getX(),Tank.getY());
                    bombs.add(bomb);
                }
                break;
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    @Override
    public void keyPressed(KeyEvent e) {
        //处理WDSA键按下的情况
        if (e.getKeyCode()==KeyEvent.VK_W){//上
            hero.setDirect(0);
            if (hero.getY()>0) {
                hero.moveUp();
            }
//            drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
        }else if (e.getKeyCode()==KeyEvent.VK_D){//右
            hero.setDirect(1);
           if (hero.getX()+90<=1000){
               hero.moveRight();
           }
        }else if (e.getKeyCode()==KeyEvent.VK_S){//左移动
            hero.setDirect(2);
            if (hero.getY()+90<=750){hero.moveDown();}
        }else if (e.getKeyCode()==KeyEvent.VK_A){//下移动
            hero.setDirect(3);
           if(hero.getX()>0){
               hero.moveLeft();
           }
        }
   if (e.getKeyCode()==KeyEvent.VK_J){
//       弹壳子弹打中敌人坦克
//       if (hero.shot==null || !hero.shot.isLive) {
//           hero.shotEnemyTank();
//       }
//       多颗子弹打中敌人坦克
       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);
            }
            hitEnemyTank();
            hitHeroTank();
//            if (hero.shot.isLive){
//                for (int i = 0; i < enemyTanks.size(); i++) {
//                    EnemyTank enemyTank = enemyTanks.get(i);
//
//
//                }
//            }

            this.repaint();
        }
    }
}

3、Tank

package com.hspedu.tankgame06;
public class Tank {
    private int x;//坦克的横坐标
    private int y;//坦克的纵坐标
    private int direct;
    private int speed = 4;
    boolean isLive = true;
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }

    //上右下左移动
    public void moveUp(){
        y-= speed;
    }
    public void moveDown(){
        y+= speed;
    }
    public void moveLeft(){
        x-=speed;
    }
    public void moveRight(){
        x+=speed;
    }
    public int getDirect() {
        return direct;
    }
    public void setDirect(int direct) {
        this.direct = direct;
    }
    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX(){
        return x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}

4、EnemyTank

package com.hspedu.tankgame06;

import com.hspedu.tankgame06.Tank;
import com.hspedu.tankgame06.shot;

import java.util.Vector;

public class EnemyTank extends Tank implements Runnable{
    Vector<shot> shots = new Vector<>();
//    增加成员,EnemyTank可以得到敌人坦克的Vector
   Vector<EnemyTank> enemyTanks = new Vector<>();
    boolean isLive = true;
    public EnemyTank(int x, int y) {
        super(x, y);
    }
//添加一个方法可以将Mypanel成员的Vector<EnemyTank> = new Vector<>();
//    设置到EnemyTank 的成员 enemyTanks
//    编写方法,判断当前的坦克是否和enemyTanks中的其他坦克发生重叠或碰撞
   public boolean isTouchEnemyTank(){
//        判断当前敌人坦克的方向
       switch (this.getDirect()){
           case 0:
//               让当前敌人坦克和其他所有的敌人坦克比较
               for (int i = 0; i < enemyTanks.size(); i++) {
//                   取出一个坦克
                   EnemyTank 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++) {
//                   取出一个坦克
                   EnemyTank 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++) {
//                   取出一个坦克
                   EnemyTank 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++) {
//                   取出一个坦克
                   EnemyTank 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 void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
        this.enemyTanks = enemyTanks;
    }

    @Override
    public void run() {
        while(true){
//            如果
            if(isLive&&shots.size() <1){
                shot s = null;
                switch (getDirect()){
                    case 0:
                        s = new shot(getX()+20,getY(),0);
                    case 1:
                        s = new shot(getX()+60,getY()+20,1);
                    case 2:
                        s = new shot(getX()+20,getY()+60,2);
                    case 3:
                        s = new shot(getX(),getY()+20,3);
                }
                shots.add(s);
                new Thread(s).start();
            }
            switch (getDirect()){
                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;
            }
//            返回0到4但取不到4
            setDirect((int)(Math.random()*4));
            if(!isLive){
                break;
            }
        }
    }
}

5、Hero

package com.hspedu.tankgame06;

import com.hspedu.tankgame06.Tank;
import com.hspedu.tankgame06.shot;

import java.util.Vector;

public class Hero extends Tank {
//    定义一个shot对象,表示一个射击线程
    shot shot = null;
    Vector<shot> shots = new Vector<>();
    public Hero(int x, int y) {
        super(x, y);
    }
    public void shotEnemyTank(){
        if (shots.size() == 5){
            return;
        }
//        创建shot对象,根据当前Hero对象的位置和方向创建Shot
        switch (getDirect()){
            case 0:
                shot = new shot(getX()+20,getY(),0);
                break;
            case 1:
                shot = new shot(getX()+60,getY()+20,1);
                break;
            case 2:
                shot = new shot(getX()+20,getY()+60,2);
                break;
            case 3:
                shot = new shot(getX(),getY()+20,3);
                break;
        }
        shots.add(shot);
        new Thread(shot).start();
    }

}

6、Bomb

package com.hspedu.tankgame06;

public class Bomb {
    int x,y;
    int life =  9;//炸弹的生命周期
    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;
        }
    }
}

7、Shot

package com.hspedu.tankgame06;

public class shot implements Runnable{
   int x;
   int y;
   int direct = 0;
   boolean isLive = true;
   int speed = 2;

    public shot(int x, int y, int direct) {
        this.x = x;
        this.y = y;
        this.direct = direct;
    }

    @Override
    public void run() {
       while (true){
//           线程休眠50ms
           try {
               Thread.sleep(50);
           } catch (InterruptedException e) {
               throw new RuntimeException(e);
           }
           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;
           }
       }
    }

}

8、Node

package com.hspedu.tankgame06;
//一个Node对象表示一个敌人坦克信息
public class Node {
    private int x;
    private int y;
    private int direct;

    public Node(int x, int y, int direct) {
        this.x = x;
        this.y = y;
        this.direct = direct;
    }

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

9、Recoder

package com.hspedu.tankgame06;
import com.hspedu.tankgame06.EnemyTank;
import com.hspedu.tankgame06.Node;

import java.io.*;
import java.util.Vector;
public class Recorder {
//    设置变量,记录我方击毁敌人坦克数
      private static int allEnemyTankNum = 0;
//      定义IO对象
      private static FileWriter fw = null;
      private static BufferedWriter bw = null;
      private static BufferedReader br = null;
      private static String recordFile = "d:\\myRecord.txt";
//      定义一个vector,指向Mypanel对象的敌人坦克向量
      private static Vector<EnemyTank> enemyTanks = null;
      private static Vector<Node> nodes = new Vector<>();

      public static void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
        Recorder.enemyTanks = enemyTanks;
    }
//      定义一个Node的Vector,用于保存敌人的信息
      public static Vector<Node> getNodesAndEnemyTankRec(){
          try {
              br = new BufferedReader(new FileReader(recordFile));
              allEnemyTankNum = Integer.parseInt(br.readLine());
              String line = "";
              while ((line = br.readLine()) != null){
//                  生成信息数组
                  String[] xyz = line.split(" ");
                  Node node = new Node(Integer.parseInt(xyz[0]),Integer.parseInt(xyz[1]),Integer.parseInt( xyz[2]));
                  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 String getRecordFile() {
        return recordFile;
    }

    //增加一个方法,当游戏退出时,将allEnemyTankNum保存到文件
    public  static void keepRecorder() {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter(recordFile));
            bw.write(allEnemyTankNum +"\r\n");
            for (int i = 0; i < enemyTanks.size(); i++) {
                EnemyTank enemyTank = enemyTanks.get(i);
                if(enemyTank.isLive){
                    String record = enemyTank.getX() + " "
                            + enemyTank.getY() + " "
                            + enemyTank.getDirect();
                    bw.write(record+"\r\n");
                }

            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (bw != null){
                    bw.close();
            }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }
    }
    public static int getAllEnemyTankNum() {
        return allEnemyTankNum;
    }
    public static void setAllEnemyTankNum(int allEnemyTankNum) {
        Recorder.allEnemyTankNum = allEnemyTankNum;
    }
//当我方坦克击毁一个敌人坦克,就应当allEnemyTankNum++
    public static void addallEnemyTankNum(){
        Recorder.allEnemyTankNum = Recorder.allEnemyTankNum + 1;
    }
}

该项目中还存在待完善的部分如:坦克爆炸部分没有添加图片效果(没有找到相应的图片)、游戏开始时没有音乐,需要的可自行添加。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值