【问题标题】:Creating game with different game modes and settings, how to handle all the different settings?创建具有不同游戏模式和设置的游戏,如何处理所有不同的设置?
【发布时间】:2015-04-26 13:12:41
【问题描述】:

我正在创建一个游戏,您可以在其中与计算机或人类对战,每种游戏都有多个(高级)设置,添加新设置时,可能的游戏种类会迅速增加。

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

我知道 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 和一些可选设置。每个游戏要么是为计算机创建的,要么是为人类创建的,或者两者兼而有之。每个游戏要么是online,要么是blue-toot,要么是sameDevice

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

如果您将您的程序视为一棵决策树,您在程序中的特定时间处于特定位置,那么您就会知道,一旦以特定方式创建游戏,您应该查看哪里以及在哪里查看不要看。因为您在树的特定分支中。例如,你创建了一个只有人类的游戏,如果你知道只有人类玩家,那么奇怪的事情就是继续检查每个回合是否有玩家是人类,因为这就是你最初创建游戏的方式.

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

【问题讨论】:

  • 这是一个非常非常抽象的要求。如果你提供一些例子来支持你的每一个陈述,那么提供一个最接近你正在寻找的答案将会非常有帮助。

标签: java android settings


【解决方案1】:

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

例如,假设您有一个ParentGame 类和BlueToothGameOnlineGameSameDeviceGame 孩子。您将在ParentGame 中实现所有常见逻辑,例如。-

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多