坦克大战—day 40

这篇博客介绍了如何在游戏开发中运用单例设计模式来管理关卡信息。`LevelInfo`类作为关卡信息的唯一实例,包含了关卡编号、敌人数量、通关时长等关键数据,并提供了获取随机敌人类型的方法。同时,展示了如何解析关卡配置文件,动态设置关卡参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置关卡单例类

在game包创建LevelInof

package map;

import util.MyUtil;

/**
 * 用来管理当前关卡信息
 * 单例设计模式:如果一个类只需要该类具有唯一的实例,那么可以使用
 * 单例设计模式设计该类
 */
public class LevelInof {
    //构造方法私有化
    private LevelInof(){

    }

    //定义静态的本类类型的变量,来指向唯一的实例
    private static LevelInof instance;

    //懒汉模式的单例,第一次使用该例的时候创建唯一的实例
    //所有访问该类的唯一实例都通过该方法
    //该方法具有安全隐患,多线程可能创建多个实例
    public static LevelInof getInstance(){
        if (instance == null){
            //创建唯一的实例
            instance = new LevelInof();
        }
        return instance;
    }

    //关卡的编号
    private int level;
    //敌人的数量
    private int enemyCount;
    //通关的最多的时长,-1 意味着不限时的
    private int crossTime = -1;
    //敌人的类型信息
    private  int[] enemyType;

    //游戏的难度  >=1 的值
    private int levelType;

    //活的敌人类型数组中的随机的一个元素
    //获得一个随机的敌人的类型
    public int getRandonEnemyType(){
        int index = MyUtil.getRandomNumber(0,enemyType.length);
        return enemyType[index];
    }


    public void setLevelType(int levelType) {
        this.levelType = levelType;
    }

    public int getLevelType() {
        return levelType <= 0 ? 1 : levelType;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public int getEnemyCount() {
        return enemyCount;
    }

    public void setEnemyCount(int enemyCount) {
        this.enemyCount = enemyCount;
    }

    public int getCrossTime() {
        return crossTime;
    }

    public void setCrossTime(int crossTime) {
        this.crossTime = crossTime;
    }

    public void setEnemyType(int[] enemyType) {
        this.enemyType = enemyType;
    }

    public int[] getEnemyType() {
        return enemyType;
    }
}


    /**
     * 解析关卡信息
     * @param level
     */
    private void loadLeveal(int level) throws Exception{
        //或得关卡信息类的唯一实例对象
        LevelInof levelInof = LevelInof.getInstance();
        //设置第几关
        levelInof.setLevel(level);

        Properties prop = new Properties();
        prop.load(new FileInputStream("level/lv_"+level));

        //将所有的地图信息都加载进来
        int enemyCount = Integer.parseInt(prop.getProperty("enemyCount"));
        //设置敌人数量
        levelInof.setEnemyCount(enemyCount);

        //关卡的难度
        //如果没有设游戏难度,那么就是默认的游戏难度
        String levelType = prop.getProperty("levelType");
        levelInof.setLevelType(Integer.parseInt(levelType==null ? "1" : levelType));

        //0,1  对敌人类型解析
        String[] enemyType = prop.getProperty("enemyType").split(",");
        //对敌人类型解析
        int[] type = new int[enemyType.length];
        for (int i = 0; i < type.length; i++) {
            type[i] = Integer.parseInt(enemyType[i]);
        }
        //设置敌人类型
        levelInof.setEnemyType(type);
        //关卡难度
        String leveType = prop.getProperty("levelType");
        levelInof.setLevelType(Integer.parseInt(levelType==null?"1":levelType));

        String methodName = prop.getProperty("method");
        int invokeCount = Integer.parseInt(prop.getProperty("invokeCount"));

        //把实参传入数组中来
        String[] params = new String[invokeCount];
        for (int i = 1; i <= invokeCount; i++) {
            params[i-1] = prop.getProperty("param"+i);
        }
        //将读取到的参数调用对应的方法
        invokeMethod(methodName,params);
    }