我正在制作一款游戏,您可以在游戏中对抗计算机或人类,每种设置都有多种(高级)设置,添加新设置时,各种可能的游戏会迅速变大。
我想编写干净的代码和我面临的问题是我需要编写很多"不必要的"检查所有可能的可选/互斥选项。不必要的是因为当游戏是使用特定设置创建的时候,它可能已经知道它的选项,因此哪些检查是多余的。我认为没有理由继续检查,例如如果游戏只有计算机,人类或两者兼而有之。
我知道 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语句。但是我想阻止这个。
如果您将程序视为决策树,您在某个特定时间点在程序中的特定时间点,那么您就知道一旦游戏以特定方式创建,您应该在哪里查看不要看。因为你在树的特定分支。例如,你创造一个只有人类的游戏,如果你知道只有人类玩家,那么如果一个玩家是人类的话,一个奇怪的事情就是继续检查每个回合,因为这是你在第一时间创建游戏的方式
我希望这能使我的观点更清楚。虽然没有编写完整的代码示例。
答案 0 :(得分:2)
不确定它是否是最好的方法,但我通过子类化和实现“钩子”避免了太多的检查。方法(我从Rails
钩子借来的一个想法,实际上)。
例如,假设您有一个ParentGame
班级和BlueToothGame
,OnlineGame
和SameDeviceGame
个孩子。您在ParentGame
中实现了所有常用逻辑,例如.-
public void mainLoop() {
startOfMainLoop();
// Some stuff
checkWinLoseCondition();
}
startOfMainLoop
和checkWinLoseCondition()
可以是在子类上实现的抽象方法。通过这种方式,您可以封装常用逻辑,并为每种游戏类型/配置实现特定行为,而不会在主游戏逻辑中对您的代码进行大量检查。
但是,只是一个想法,当然最好的方法取决于您当前的情况:)