韩顺平老师坦克大战项目总结

 

韩顺平老师讲的坦克大战项目,用代码进行了复现,有几个自己的总结
1 有个别功能没有实现,EnemyTank中敌人坦克向四周移动功能没有实现,只是实现了随机转向,但一直停在原地不动,没有找到bug所在。
2 读取历史记录的功能没有实现,选择继续上局游戏时不能读取历史的数据 具体的代码块在Record类中
3 对于static和构造器的理解,当定义为static是在整个项目的任意文件类都可以进行访问,若没有static修饰则需要新建类才能进行访问;关于构造器的理解,新建一个类相当于建了一个无参或有参构造器,均是通过构造器进行相应的操作。
MyPanel.clss
package com.hsp.tankgame06;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileOutputStream;
import java.security.Key;
import java.util.Vector;

//定义一个画板
public class MyPanel extends JPanel implements KeyListener ,Runnable{
    //定义我的坦克
    Hero hero = null;
    //定义敌人的坦克群
    Vector<EnemyTank> enemyTanks = new Vector<>();
    int enemytanksize = 8;
    //定义一个炸弹集合,当子弹击中坦克时添加一个bomb到bombs集合中
    Vector<Bomb> bombs = new Vector<>();
    //定义三张图片
    Image image1 = null;
    Image image2 = null;
    Image image3 = null;
    //初始化一个Record记录方法
    //注意这里能用Record直接访问,是因为在Record用static定义的成员变量和方法,不需要重新键新建类
    //Record record = new Record();
    Vector<Node> nodes = new Vector<>();//用于存放敌人坦克的坐标
    public MyPanel(String key){//构造器
        //判断记录文件是否存在
        //如果存在就正常执行 如果不存在就提示开启新游戏将key=1
       if (key == "2"){
           File file = new File(Record.getRecordfile());
           if (file.exists()){
               nodes = Record.getRecordinfo();
           }else {
               key = "1";
           }
       }
        //初始化坦克,就是设置自己坦克的初始值
        hero = new Hero(300,300);
        hero.setSpeed(6);
        //初始化敌人的坦克群
        switch (key){
            case "1"://开始新游戏
                for (int i = 0; i < enemytanksize; i++) {
                    EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 300);
                    enemyTank.setDirection(2);
                    //初始化的时候启动敌人坦克线程
                    new Thread(enemyTank).start();
                    //给enemyTank加入一颗子弹
                    Shot shot = new Shot(enemyTank.getX()+20,enemyTank.getY()+60,enemyTank.getDirection());
                    //加入enemyTank的Vector成员
                    enemyTank.shots.add(shot);
                    //启动shot对象
                    new Thread(shot).start();
                    enemyTanks.add(enemyTank);
                }
                //初始化EnemyTank类中的setEnemyTanks方法,将坦克集数据传递过去
                for (int i = 0; i < enemyTanks.size(); i++) {
                    EnemyTank enemyTank = enemyTanks.get(i);
                    enemyTank.setEnemyTanks(enemyTanks);
                }
                break;
            case" 2"://继续上一局游戏
                for (int i = 0; i < nodes.size(); i++) {
                    Node node = nodes.get(i);
                    EnemyTank enemyTank = new EnemyTank(node.getX(), node.getY());
                    enemyTank.setDirection(node.getDirection());
                    //初始化的时候启动敌人坦克线程
                    new Thread(enemyTank).start();
                    //给enemyTank加入一颗子弹
                   Shot shot = new Shot(enemyTank.getX()+20,enemyTank.getY()+60,enemyTank.getDirection());
                    //加入enemyTank的Vector成员
                   enemyTank.shots.add(shot);
                    //启动shot对象
                   new Thread(shot).start();
                    enemyTanks.add(enemyTank);
                }
                //初始化EnemyTank类中的setEnemyTanks方法,将坦克集数据传递过去 防止坦克相互碰撞的方法
                for (int i = 0; i < enemyTanks.size(); i++) {
                    EnemyTank enemyTank = enemyTanks.get(i);
                    enemyTank.setEnemyTanks(enemyTanks);
                }
                break;
        }

        //初始化三张照片
        image1 = Toolkit.getDefaultToolkit().getImage("E:\\下载\\bomb1.jpeg");
        image2 = Toolkit.getDefaultToolkit().getImage("E:\\下载\\bomb2.jpeg");
        image3 = Toolkit.getDefaultToolkit().getImage("E:\\下载\\bomb3.jpeg");
        //添加背景音乐
       // new AePlayWave("C:\\Users\\86178\\IdeaProjects\\untitled17\\Tankgame\\practise\\src\\com\\hsp\\tankgame06\\Calmkuma,Ace - Monsters.mp3").start();
    }
    //画出页面的信息方法
    public void ShowInfo(Graphics g){
        g.setColor(Color.BLACK);
        Font font = new Font("宋体", Font.BOLD, 30);
        g.setFont(font);
        g.drawString("您击毁的敌方坦克数为:",1020,30);
        drawTank(1020,60,g,0,0);
        g.setColor(Color.BLACK);
        g.drawString(Record.getDestructiveEnemyTanknums()+"",1100,100);
        g.drawString("敌方击毁的我方坦克数为:",1020,160);
        drawTank(1020,170,g,0,1);
        g.setColor(Color.BLACK);
        g.drawString(Record.getDestructiveheroTanknums()+"",1100,210);
    }
    @Override
    public void paint(Graphics g) {

        super.paint(g);
        ShowInfo(g);
        g.fillRect(0,0,1000,750);//画出游戏区域,默认画笔颜色是灰
        //在画板上开始画自己的坦克,定义成一个方法
        if (hero != null&&hero.islive == true) {
            drawTank(hero.getX(), hero.getY(), g, hero.getDirection(), 1);
        }
        //在画板上开始画敌人的坦克群
        for (int i = 0; i < enemyTanks.size(); i++) {
            EnemyTank enemyTank = enemyTanks.get(i);
            if (enemyTank.islive == true){
                drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirection(),0);
                //画敌人坦克的子弹
                for (int j = 0; j < enemyTank.shots.size(); j++) {
                    Shot shot = enemyTank.shots.get(j);
                    if (shot.islive == true){
                        //画出子弹
                        g.fill3DRect(shot.x,shot.y,3,3,false);
                    }else {
                        enemyTank.shots.remove(shot);
                    }
                }
            }else if (enemyTank.islive == false){
                //当坦克被击中时从集合中移除坦克
                enemyTanks.remove(enemyTank);
            }
        }
        //将坦克集信息添加到Record中
        Record.setEnemyTanks(enemyTanks);
        //在画板上画hero发射出的子弹
        for (int i = 0; i < hero.shots.size(); i++) {
            Shot shot = hero.shots.get(i);
            if (shot != null&&shot.islive == true){
                g.draw3DRect(shot.x,shot.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&&bomb.life<6){
                //画第二张图片
                g.drawImage(image2,bomb.x,bomb.y,60,60,this);
            }else {
                //画第三张图片
                g.drawImage(image3,bomb.x,bomb.y,60,60,this);
            }
            bomb.lifedown();
            //如果bomb.life值为0,则移除bomb
            if (bomb.life == 0){
                bombs.remove(bomb);
            }
        }
    }
    //画坦克的方法
    public void drawTank(int x,int y,Graphics g,int direction,int type){
        switch (type){
            case 0:  //自己的坦克
                g.setColor(Color.cyan);
                break;
            case 1:  //敌人的坦克
                g.setColor(Color.YELLOW);
                break;
        }
        switch (direction){
            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+30,x+20,y);
                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;
        }
    }
    //子弹击中我方坦克的方法
    public void hitMyTank(Vector<EnemyTank> enemyTanks, Hero hero){
        //判断敌人坦克发出来的子弹和我的位置会不会有重合
        for (int i = 0; i < enemyTanks.size(); i++) {
            EnemyTank enemyTank = enemyTanks.get(i);
            if (enemyTank.islive== true){
                for (int j = 0; j < enemyTank.shots.size(); j++) {
                    Shot shot = enemyTank.shots.get(j);
                        if (hero != null&&hero.islive&&shot.islive&&shot != null) {
                            switch (hero.getDirection()) {
                                case 0:
                                case 2:
                                    if (shot.x > hero.getX() && shot.x < (hero.getX() + 40) && shot.y > hero.getY() && shot.y < (hero.getY() + 60)) {
                                        shot.islive = false;
                                        hero.islive = false;
                                        Record.mynums();
                                        enemyTank.shots.remove(shot);
                                        Bomb bomb = new Bomb(hero.getX(), hero.getY());
                                        bombs.add(bomb);
                                    }
                                    break;
                                case 1:
                                case 3:
                                    if (shot.x > hero.getX() && shot.x < (hero.getX() + 60) && shot.y > hero.getY() && shot.y < (hero.getY() + 40)) {
                                        shot.islive = false;
                                        hero.islive = false;
                                        Record.mynums();
                                        enemyTank.shots.remove(shot);
                                        Bomb bomb = new Bomb(hero.getX(), hero.getY());
                                        bombs.add(bomb);
                                    }
                                    break;
                            }
                        }
                }
            }
        }
    }
    //子弹击中敌人坦克的方法
    public void hitEnemyTank(Vector<Shot> shots, Vector<EnemyTank> enemyTanks){
        //判断子弹的xy坐标和坦克区域的坐标是否会重叠
        for (int i = 0; i < shots.size(); i++) {
            Shot shot = shots.get(i);
            if (shot!= null&&shot.islive) {
                for (int j = 0; j < enemyTanks.size(); j++) {
                    EnemyTank enemyTank = enemyTanks.get(j);
                    switch (enemyTank.getDirection()) {
                        case 0:
                        case 2:
                            if (shot.x > enemyTank.getX() && shot.x < (enemyTank.getX() + 40) && shot.y > enemyTank.getY() && shot.y < (enemyTank.getY() + 60)) {
                                enemyTank.islive = false;
                                enemyTanks.remove(enemyTank);
                                Record.nums();
                                shot.islive = false;
                                shots.remove(shot);
                                Bomb bomb = new Bomb(enemyTank.getX(), enemyTank.getY());
                                bombs.add(bomb);

                            }
                            break;
                        case 1:
                        case 3:
                            if (shot.x > enemyTank.getX() && shot.x < (enemyTank.getX() + 60) && shot.y > enemyTank.getY() && shot.y < (enemyTank.getY() + 40)) {
                                enemyTank.islive = false;
                                enemyTanks.remove(enemyTank);
                                Record.nums();
                                shot.islive = false;
                                shots.remove(shot);
                                Bomb bomb = new Bomb(enemyTank.getX(), enemyTank.getY());
                                bombs.add(bomb);
                            }
                            break;
                    }
                }
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W){
            //向上运动
            hero.setDirection(0);
            if (hero.getY()>0){
                hero.moveup();
            }
        }else if (e.getKeyCode() == KeyEvent.VK_S){
            //向下运动
            hero.setDirection(2);
            if (hero.getY()+60<750){
                hero.movedown();
            }
        }else if (e.getKeyCode() == KeyEvent.VK_A){
            //向左运动
            hero.setDirection(3);
            if (hero.getX() > 0) {
                hero.moveleft();
            }
        } else if (e.getKeyCode() == KeyEvent.VK_D) {
            //向右运动
            hero.setDirection(1);
            if (hero.getX()+60<1000){
                hero.moveright();
            }
        } else if (e.getKeyCode() == KeyEvent.VK_E) {
            //向右上运动
            hero.setDirection(0);
            hero.moverightup();
        }else if (e.getKeyCode() == KeyEvent.VK_C) {
            //向右下运动
            hero.setDirection(2);
            hero.moverightdown();
        }else if (e.getKeyCode() == KeyEvent.VK_Z) {
            //向左下运动
            hero.setDirection(2);
            hero.moveleftdown();
        }else if (e.getKeyCode() == KeyEvent.VK_Q) {
            //向左上运动
            hero.setDirection(0);
            hero.moveleftup();
        }else if (e.getKeyCode() == KeyEvent.VK_J){
            //发射子弹
                hero.shotEnemyTank();
        }

        this.repaint();//这个repaint方法是在按键的时候重写,下面的repaint方法是一直执行的重写
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            //判断子弹是否击中坦克
            //这个位置hero.shot!= null的原因是,当刚开始打开程序还没有按下J键的时候,hero.shot为null,这个地方会报错,所以界面上会卡住画不出
//            if (hero.shot!= null&&hero.shot.islive){
//                //遍历敌人的坦克
//                for (int i = 0; i < enemyTanks.size(); i++) {
//                    EnemyTank enemyTank = enemyTanks.get(i);
//                    hitEnemyTank(hero.shot,enemyTank);
//                }
//            }
            hitEnemyTank(hero.shots,enemyTanks);
            hitMyTank(enemyTanks,hero);
            this.repaint();
        }
    }
}

 TankGame.class

package com.hsp.tankgame06;

import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.Scanner;

//定义一个画框
public class TankGame07 extends JFrame {
    private MyPanel mp = null;
    Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        new TankGame07();
    }

    public TankGame07(){
        System.out.println("请您选择模式:1开启新游戏;2继续上局游戏");
        String key = sc.next();
        mp = new MyPanel(key);
        Thread thread = new Thread(mp);//把MyPanel包装成线程
        thread.start();
        this.add(mp);
        this.addKeyListener(mp);
        this.setSize(1400,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        //监听窗口关闭的方法
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                try {
                    Record.Recordinfo();//注意这里能用Record直接访问Recordinfo方法,是因为在Record用static定义的成员变量和方法
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
                System.exit(0);
            }
        });
    }
}

Tank.class

package com.hsp.tankgame06;
//定义父类坦克
public class Tank {
    private int x;
    private int y;
    private int direction;
    boolean islive = true;//代表坦克是否存活

    private int speed;

    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 void moveleftup(){
        x -= speed;
        y -= speed;
    }
    public void moverightup(){
        x += speed;
        y -= speed;
    }
    public void moveleftdown(){
        x -= speed;
        y += speed;
    }
    public void moverightdown(){
        x += speed;
        y += speed;
    }

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

    public Tank() {
    }

    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 getDirection() {
        return direction;
    }

    public void setDirection(int direction) {
        this.direction = direction;
    }
}

EnemyTank.class

package com.hsp.tankgame06;

import java.util.Random;
import java.util.Vector;

public class EnemyTank extends Tank implements Runnable{
    public EnemyTank(int x, int y) {
        super(x, y);
    }
    Vector<Shot> shots = new Vector<>();//每个敌人坦克包括很多子弹
    Vector<EnemyTank> enemyTanks = new Vector<>();
    //新建一个方法,将MyPanel中的enemyTanks集合传入进来
    public void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
        this.enemyTanks = enemyTanks;
    }
    //定义一个碰撞方法
    public boolean isTouchEnemyTank(){

        for (int i = 0; i < enemyTanks.size(); i++) {
            EnemyTank enemyTank = enemyTanks.get(i);
            if (this != enemyTank){
            switch (this.getDirection()){
                case 0:
                    if (enemyTank.getDirection() == 0||enemyTank.getDirection()== 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.getDirection() == 1||enemyTank.getDirection()== 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:
                    if (enemyTank.getDirection() == 0||enemyTank.getDirection()== 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.getDirection() == 1||enemyTank.getDirection()== 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:
                    if (enemyTank.getDirection() == 0||enemyTank.getDirection()== 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.getDirection() == 1||enemyTank.getDirection()== 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:
                    if (enemyTank.getDirection() == 0||enemyTank.getDirection()== 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.getDirection() == 1||enemyTank.getDirection()== 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;
    }

    @Override
    public void run() {
        Random random = new Random();
        //给敌人的坦克子弹集增加多个子弹
        //判断如果坦克还存在并且坦克的子弹集里面的子弹数量少
        while (true) {
            if (this.islive==true&&shots.size()<100){
                Shot shot = null;
                switch (getDirection()){
                    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);
                shot.start();
            }

        //确定坦克移动的方向,让其按照方向移动
            switch (getDirection()){
                case 0://向上移动
                    for (int i = 0; i < 80; i++) {
                        if (this.getY()>=0&&!isTouchEnemyTank()){
                            this.moveup();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    break;
                case 1://向右移动
                    for (int i = 0; i < 80; i++) {
                        if (this.getX()+60<=1000&&!isTouchEnemyTank()){
                            this.moveright();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    break;
                case 2://向下移动
                    for (int i = 0; i < 80; i++) {
                        if (this.getY()+60<=750&&!isTouchEnemyTank()){
                            this.movedown();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    break;
                case 3://向左移动
                    for (int i = 0; i < 80; i++) {
                        if (this.getX()>=0&&!isTouchEnemyTank()){
                            this.moveleft();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    break;
            }
            //随机改变坦克的移动方向
            setDirection(random.nextInt(4));
            //如果坦克被击中,退出线程
            if (islive == false){
                break;
            }
        }

    }
}

Hero.class

package com.hsp.tankgame06;

import java.util.Vector;

//定义自己的坦克
public class Hero extends Tank {
    //这里子类没有用父类的构造器,而是用自己的构造器
    Shot shot = null;
    Vector<Shot> shots = new Vector<>();
    public Hero(int x, int y) {
    }

    //定义发射一颗子弹的方法
    public void shotEnemyTank(){
        switch (getDirection()){
            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);
        shot.start();
    }
}

Shot.class

package com.hsp.tankgame06;
//定义一颗子弹,将其定义为一个线程
public class Shot extends Thread{
    int x;
    int y;
    int direction=0;
    int speed = 8;
    boolean islive = true;//代表子弹是否存活

    public Shot(int x, int y, int direction) {
        this.x = x;
        this.y = y;
        this.direction = direction;
    }

    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            switch (direction){
                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);
           // System.out.println("y的坐标为"+y);
            if (!(x>=0&&x<=1000&&y>=0&&y<=750&&islive == true)){
                this.islive = false;
                break;
            }
        }
        System.out.println("有子弹线程退出");
    }
}

Bomb.class

package com.hsp.tankgame06;
//定义爆炸效果
public class Bomb {
    int x;
    int y;
    int life = 9;
    boolean islive = true;
    //生成构造器,后面可通过构造器创建Bomb类对象
    public Bomb(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public void lifedown(){
        if (life>0){
            life--;
        }else {
            islive = false;
        }
    }
}

Record.class

package com.hsp.tankgame06;

import java.io.*;
import java.util.Vector;

//记录数据
public class Record {
    private static int DestructiveEnemyTanknums = 0;
    private static int DestructiveheroTanknums = 0;
    private static BufferedWriter bw = null;
    private static BufferedReader br = null;
    private static String recordfile = "D:\\recordfiles.txt";
    //建立一个Node集合用来存放读取的信息
    private static Vector<Node> nodes = new Vector<>();

    //定义一个坦克集用来接收MyPanel文件中的坦克集信息,之后在将这坦克的信息记录输出
    private static Vector<EnemyTank> enemyTanks = null;
    public static Vector<EnemyTank> getEnemyTanks() {
        return enemyTanks;
    }
    //让MyPanel中判断Recordfile是否存在时能够拿到Recordfile文件
    public static String getRecordfile() {
        return recordfile;
    }
    public static void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
        Record.enemyTanks = enemyTanks;
    }
    //定义一个方法将记录的数据读取



    public static Vector<Node> getRecordinfo(){
        try {
            br = new BufferedReader(new FileReader(recordfile));
            DestructiveEnemyTanknums = Integer.parseInt(br.readLine());
            DestructiveheroTanknums = Integer.parseInt(br.readLine());
            //循环读取
            String line = "";
            while ((line = br.readLine()) != null){
                String[] xyd = line.split(" ");//按空格对字符串进行分割
                Node node = new Node(Integer.parseInt(xyd[0]),Integer.parseInt(xyd[1]),Integer.parseInt(xyd[2]));
                nodes.add(node);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (br != null){
                    br.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return nodes;
    }
    //定义一个方法将记录的数据输出
    public static void Recordinfo() throws IOException {
        try {
            bw = new BufferedWriter(new FileWriter(recordfile));
            bw.write(DestructiveEnemyTanknums+"");
            bw.newLine();
            bw.write(DestructiveheroTanknums+"");
            bw.newLine();
            for (int i = 0; i < enemyTanks.size(); i++) {
                EnemyTank enemyTank = enemyTanks.get(i);
                if (enemyTank.islive) {
                    bw.write(enemyTank.getX() + " " + enemyTank.getY() + " " + enemyTank.getDirection());
                    bw.newLine();
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (bw != null){
                bw.close();
            }
        }
    }

    public static int getDestructiveheroTanknums() {
        return DestructiveheroTanknums;
    }

    public void setDestructiveheroTanknums(int destructiveheroTanknums) {
        DestructiveheroTanknums = destructiveheroTanknums;
    }

    public static int getDestructiveEnemyTanknums() {
        return DestructiveEnemyTanknums;
    }

    public void setDestructiveEnemyTanknums(int destructiveEnemyTanknums) {
        DestructiveEnemyTanknums = destructiveEnemyTanknums;
    }

    //记录我方击毁的坦克数量
    public static void nums(){
        DestructiveEnemyTanknums ++;
    }
    //记录击毁我方的坦克数量
    public static void mynums(){
        DestructiveheroTanknums ++;
    }


}

Node.class

package com.hsp.tankgame06;

public class Node {
    private int x;
    private int y;
    private int direction;

    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 getDirection() {
        return direction;
    }

    public void setDirection(int direction) {
        this.direction = direction;
    }

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

}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值