我同意Pyrolistical的回答,我更喜欢他的做法(虽然我只是粗略地浏览了其他答案)。
巧合的是,我也使用了他的“GamePhase”命名。基本上,在回合制棋盘游戏的情况下,我会让你的GameState类包含一个由Pyrolistical提到的抽象GamePhase对象。
假设游戏状态如下:
1.掷骰子
2.移动
3.购买/不购买
4.监狱
你可以为每个状态创建具体的派生类。至少为以下内容创建虚函数:
StartPhase();
EndPhase();
Action();
在StartPhase()函数中,您可以设置状态的所有初始值,例如禁用其他玩家的输入等。
当调用roll.EndPhase()时,请确保将GamePhase指针设置为下一个状态。
phase = new MovePhase();
phase.StartPhase();
在MovePhase::StartPhase()中,你可以设置活动玩家剩余移动的次数为前一个阶段所摇到的点数。
现在有了这样的设计,你可以在Roll阶段解决“3次双倍=监狱”的问题。RollPhase类可以处理自己的状态。例如:
GameState state;
Die die;
int doublesRemainingBeforeJail;
StartPhase()
{
die = new Die();
doublesRemainingBeforeJail = 3;
}
Action()
{
if(doublesRemainingBeforeJail<=0)
{
state.phase = new JailPhase();
state.phase.StartPhase();
return;
}
int die1 = die.Roll();
int die2 = die.Roll();
if(die1 == die2)
{
--doublesRemainingBeforeJail;
state.activePlayer.AddMovesRemaining(die1 + die2);
Action();
}
state.activePlayer.AddMovesRemaining(die1 + die2);
this.EndPhase();
}
我与Pyrolistical的不同之处在于,每个阶段都应该有一个阶段,包括当玩家落在社区宝箱或其他地方时。我会在MovePhase中处理所有这些内容。这是因为如果有太多的连续阶段,玩家很可能会感到过于“引导”。例如,如果有一个阶段,玩家只能购买房产,然后只能购买酒店,然后只能购买房屋,就像没有自由一样。将所有这些部分都合并到一个BuyPhase中,并赋予玩家购买任何想要的东西的自由即可。BuyPhase类可以轻松处理哪些购买是合法的。
最后让我们来看看游戏板。虽然2D数组很好,但我建议使用瓷砖图(其中瓷砖是板上的位置)。在monoppoly的情况下,它将更像是一个双向链接列表。然后每个瓷砖都会有:
- previousTile
- nextTile
这样做起来会更容易,比如:
While(movesRemaining>0)
AdvanceTo(currentTile.nextTile)
AdvanceTo函数可以处理您的逐步动画或其他任何喜欢的内容。当然,还可以减少剩余的移动次数。
RS Conley在GUI上使用观察者模式的建议是很好的。
我以前没有发布过多少内容。希望这能帮到某个人。