编程语言
首页 > 编程语言> > java – 如何在减少重复代码的情况下为我的游戏添加Levels?

java – 如何在减少重复代码的情况下为我的游戏添加Levels?

作者:互联网

我正在设计一个多层次的游戏.我有一个安装类,它根据收到的参数设置电路板,它指示应该设置的电平.这是班级:

public class BoardState {
    public BoardState(InitialState state) {
        switch (state) {
            case EMPTY:
                setupEmptyState();
                break;
            case INTEGRATIONTEST:
                setupIntegrationTestState();
                break;
            case LEVEL_1:
                setupLevelOne();
                break;
            case LEVEL_2:
                setupLevelTwo();
                break;
            default:
                throw new Error("Invalid level selection");
        }
    }

    private void setupEmptyState() { }

    private void setupIntegrationTestState() { }

    private void setupLevelOne() { }

    private void setupLevelTwo() { }
}

这工作正常,但每次我添加一个新的级别时,我必须在三个地方添加代码:InitialState枚举,它定义了接受状态列表,构造函数中的switch语句,以及类的主体,我必须在添加一个方法来设置相关级别.

我想要保留的一件好事是,我的GUI会根据定义级别列表的枚举自动填充我添加的每个级别的新按钮.

如何重构此代码,以便减少与添加新级别相关的开销?

最佳答案:

通常,当您需要减少代码重复时,就会出现一个界面.这一次(根据您在OP中的评论),您似乎需要根据您所在的级别向棋盘添加不同的对象:

import java.util.List;

public interface LevelSettings {
    List<GameObject> startingObjects();
}

现在,BoardState看起来像那样(没有更多的setupX()方法)

import java.util.List;

public class BoardState {
    private final List<GameObject> gameObjects;

    public BoardState(LevelSettings settings) {
        this.gameObjects = settings.startingObjects();
    }
}

既然你也指定了一个很好的你有一个枚举动态创建GUI的按钮,你可以通过在枚举中实现接口来结合两全其美(界面和枚举)…

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public enum InitialState implements LevelSettings {
    EMPTY {
        @Override
        public List<GameObject> startingObjects() {
            return Collections.emptyList();
        }
    },
    INTEGRATIONTEST {
        @Override
        public List<GameObject> startingObjects() {
            GameObject g1 = new GameObject("dummy 1");
            GameObject g2 = new GameObject("dummy 2");
            return Arrays.asList(g1, g2);
        }
    },
    LEVEL_1 {
        @Override
        public List<GameObject> startingObjects() {
            //read a config file to get the starting objects informations
            //or also hardcoded (not preferred)
        }
    },
    LEVEL_2 {
        @Override
        public List<GameObject> startingObjects() {
            //read a config file to get the starting objects
            //or also hardcoded (not preferred)
        }
    };
}

这基本上就是这样.如果你需要添加LEVEL_3,请在InitialState中执行,一切都将随之而来.

更进一步

从这里开始,它超出了你的要求,如果你不相信,可以随意忽略这一部分.

作为一种好的做法,我只将这些配置存储在配置文件中,以减少更多的代码重复并获得灵活性:

import java.util.List;

public enum InitialState implements LevelSettings {
    EMPTY {
        @Override
        public List<GameObject> startingObjects() {
            return readFromFile("empty.level");
        }
    },
    INTEGRATIONTEST {
        @Override
        public List<GameObject> startingObjects() {
            return readFromFile("integration_test.level");
        }
    },
    LEVEL_1 {
        @Override
        public List<GameObject> startingObjects() {
            return readFromFile("1.level");
        }
    },
    LEVEL_2 {
        @Override
        public List<GameObject> startingObjects() {
            return readFromFile("2.level");
        }
    };

    private static List<GameObject> readFromFile(String filename) {
        //Open file
        //Serialize its content in GameObjects
        //return them as a list
    }
}

因此,当您决定添加新级别时,实际上只需要知道存储级别配置的文件名.

再向前迈进一步

您将看到的内容非常棘手,我建议您不要在生产代码中使用它(但它会减少代码重复)!

import java.util.List;

public enum InitialState implements LevelSettings {
    EMPTY, INTEGRATIONTEST, LEVEL_1, LEVEL_2;

    @Override
    public List<GameObject> startingObjects() {
        return readFromFile(this.name() + ".level");
    }

    private static List<GameObject> readFromFile(String filename) {
        //Open file
        //Serialize its content in GameObjects
        //return them as a list
    }
}

在这里,我们依靠枚举名称来找到相应的正确文件.此代码有效,因为它基于约定,即文件的名称相应于具有“.level”扩展名的枚举名称.当你需要添加一个新级别时,只需将它添加到枚举中就可以了……

标签:java,oop,design-patterns,code-duplication
来源: https://codeday.me/bug/20190516/1114519.html