使用不同的游戏模式和设置创建游戏,如何处理所有不同的设置?

时间:2015-04-26 13:12:41

标签: java android settings

我正在制作一款游戏,您可以在游戏中对抗计算机或人类,每种设置都有多种(高级)设置,添加新设置时,各种可能的游戏会迅速变大。

我想编写干净的代码和我面临的问题是我需要编写很多"不必要的"检查所有可能的可选/互斥选项。不必要的是因为当游戏是使用特定设置创建的时候,它可能已经知道它的选项,因此哪些检查是多余的。我认为没有理由继续检查,例如如果游戏只有计算机,人类或两者兼而有之。

我知道 Builder-pattern ,它可以解决将许多参数传递给构造函数的问题,其中许多构造函数是可选的。我可以在创建游戏时使用它。这解决了构建游戏困难的问题。但是,在游戏运行期间仍然需要进行大量检查,以查看设置了哪些设置,哪些设置没有。

有什么线索让我调查一下?

代码示例(仅图示)

    Mode mode;
    Vocabulary mVocabulary;
    Player[] mPlayers;
    GameLog mGameLog;
    String mCurrentString;
    int mMinimalWordLength = 3;
    int mIndexActivePlayer;
    int mNumberOfActivePlayers;
    boolean mComputers; //[Optional]
    int mNumberOfComputers; //[Required if mComputer is true]
    Difficulty mDifficulty; //[Required if mComputer is true]

    //One of these optionals are required
    boolean mBlueTooth; //[Optional]
    boolean online; //[Optional]
    boolean sameDevice; //[Optional]

    //Here I could use the builder pattern to set all the options
    public Game(Vocabulary vocabulary, int numberOfPlayers, int minimalWordLength, Player[] players) {
        this.mVocabulary = vocabulary;
        this.mMinimalWordLength = minimalWordLength;
        this.numberOfActivePlayers = numberOfPlayers;
        this.mPlayers = players;
    }
}

我正在制作一款游戏,需要mVocabulary个单词,一系列玩家mPlayers以及一些可选设置。每个游戏都是为计算机或人类创建的,或者是两者兼而有之。每个游戏都是onlineblue-tootsameDevice

基于这些选项,代码中会发生不同的事情,因此您可以在此代码后面的每个方法中编写几个if else语句。但是我想阻止这个。

如果您将程序视为决策树,您在某个特定时间点在程序中的特定时间点,那么您就知道一旦游戏以特定方式创建,您应该在哪里查看不要看。因为你在树的特定分支。例如,你创造一个只有人类的游戏,如果你知道只有人类玩家,那么如果一个玩家是人类的话,一个奇怪的事情就是继续检查每个回合,因为这是你在第一时间创建游戏的方式

我希望这能使我的观点更清楚。虽然没有编写完整的代码示例。

1 个答案:

答案 0 :(得分:2)

不确定它是否是最好的方法,但我通过子类化和实现“钩子”避​​免了太多的检查。方法(我从Rails钩子借来的一个想法,实际上)。

例如,假设您有一个ParentGame班级和BlueToothGameOnlineGameSameDeviceGame个孩子。您在ParentGame中实现了所有常用逻辑,例如.-

public void mainLoop() {
    startOfMainLoop();
    // Some stuff
    checkWinLoseCondition();
}

startOfMainLoopcheckWinLoseCondition()可以是在子类上实现的抽象方法。通过这种方式,您可以封装常用逻辑,并为每种游戏类型/配置实现特定行为,而不会在主游戏逻辑中对您的代码进行大量检查。

但是,只是一个想法,当然最好的方法取决于您当前的情况:)