乐趣区

关于java:我所知道坦克大战网络版之上一版本问题指出使用配置文件添加灵活性

前言


后面咱们实现了坦克的大战的单机版,从本篇开始升级成网络版

在此之前咱们须要修改上一版有余的中央之处

一、修改方向枚举


咱们目前的方向采纳的是 Tank 类里的枚举,然而咱们的使用者不止有坦克,还有炮筒等等

既然如此咱们应该把该枚举晋升至一个级别,改为一个公共的枚举类

public enum Direction {

    // 定义方向
    L, LU, U, RU, R, RD, D, LD, STOP;

}

因而咱们能够将坦克里的 Direction 去掉,改为枚举类的方向

class Tank{

    // 将这个代码从 Tank 类中去掉
    enum Direction {L, LU, U, RU, R, RD, D, LD, STOP}
    // 省略其余关键性代码........
}

同时将子弹类里的 Tank.Direction 批改为 Direction 类即可

class Missle{

    // 将这个代码从 Missle 类中去掉
    Tank.Direction dir;

    // 应用枚举类作为子弹的方向枚举
    Direction dir;
    
    public Missle(int x, int y, Direction dir) {
        this.x = x;
        this.y = y;
        this.dir = dir;
    }
    
    public Missle(int x, int y,Direction dir, TankClient tc, boolean camp) {
        this.x = x;
        this.y = y;
        this.dir = dir;
        this.tc = tc;
        this.camp = camp;
    }
    
    // 省略其余关键性代码........
}

同时在 TankClient 类中也要将不正确的中央修改过去

public class TankClient extends Frame {

    // 将 Tank.Direction 代码去掉
    Tank mytank = new Tank(50,50,this,true,Tank.Direction.STOP);

    // 改为:Direction.STOP
    Tank mytank = new Tank(50,50,this,true,Direction.STOP);
    
    // 定义窗口办法
    public void lauchFrame() {
    
        // 营垒坏的坦克初始方向为:下
        for (int i = 0; i < 10;i++){
           // 将 Tank.Direction 代码去掉
           tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Tank.Direction.D));
           
           // 改为:Direction.D
           tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Direction.D));
        }
    }
    
    @Override
    public void paint(Graphics g) {
    
        // 如果寄存敌方坦克的容器里没有敌方坦克了
        if(tanklist.size() <=0){
            // 再次增加营垒为坏的坦克,并初始方向为:下
            for (int i = 0; i < 5;i++){
                //// 将 Tank.Direction 代码去掉
                tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Tank.Direction.D));
                
                //// 改为:Direction.D
                tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Direction.D));
            }
        }
    }
    // 省略其余关键性代码........
}

二、批改坦克击中反馈


目前当咱们的子弹方块与坦克方块进行碰撞检测的时候,发现是间接在碰撞检测的办法里进行坦克血量的扣除

这就感觉怪怪的,每个人应该只做每个人的事件

当坦克被击中时进行扣血,应该是调用坦克类里的被击中办法进行扣血

这是一个问题之处,稍后进行解决

三、应用配置文件增加灵活性


目前咱们参数都是在代码中实现,比如说初始化的坦克个数、游戏窗口大小等等

若咱们须要改变的中央比拟多,则须要改变源代码,

那么思考一下:能不能只改变一个中央,即能够影响别的中央援用即可

接下来咱们应用配置文件实现这些事件

首先创立咱们配置文件 tankConfig

咱们能够在配置文件里编写初始化坦克的个数

# 初始化坦克个数
initTankConunt = 10

这时咱们在 TankClient 类中对配置文件进行援用并且读取它

public class TankClient extends Frame {

    // 定义窗口办法
    public void lauchFrame() {Properties properties = new Properties();
        try {properties.load(this.getClass().getClassLoader().getResourceAsStream("tankConfig"));
        } catch (IOException e) {e.printStackTrace();
        }
        int initTankCount = Integer.parseInt(properties.getProperty("initTankConunt"));
        // 营垒坏的坦克初始方向为:下
        for (int i = 0; i < initTankCount;i++){tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Direction.D));
        }
        // 省略其余关键性代码........
    }
    // 省略其余关键性代码........
}

这样咱们就实现了初始化坦克数量在配置文件里读取并应用

但咱们还有坦克的宽度、高度、以及其余的属性都须要在配置文件里进行配置这可怎么办?

咱们这时能够创立一个配置文件的类进行治理这些 key 值

public class PropertyMgr {static Properties properties = new Properties();

    static {
        try {properties.load(PropertyMgr.class.getClassLoader().getResourceAsStream("tankConfig"));
        } catch (IOException e) {e.printStackTrace();
        }
    }
    
    private PropertyMgr(){}
    
    public static String getProperty(String key){return properties.getProperty(key);
    }
}

而当咱们应用的时候,则能够调用对应的办法获取对应的 key 值即可

public class TankClient extends Frame {
    

    // 定义窗口办法
    public void lauchFrame() {int initTankCount = Integer.parseInt(PropertyMgr.getProperty("initTankConunt"));
        
        // 营垒坏的坦克初始方向为:下
        for (int i = 0; i < initTankCount;i++){tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Direction.D));
        }
        // 省略其余关键性代码........
    }
    // 省略其余关键性代码........
}

参考资料


尚学堂:坦克大战(马士兵老师)

退出移动版