我同意Pyrolistical的回答,并且我更喜欢他的处事方式(不过我只是略过了其他答案)。
巧合的是,我还使用了他的“ GamePhase”命名。基本上,在基于回合的棋盘游戏中,我要做的是让GameState类包含Pyrolistical提到的抽象GamePhase对象。
可以说游戏状态为:
- 滚
- 移动
- 买/不买
- 监狱
您可以为每个状态提供具体的派生类。至少具有以下虚拟功能:
StartPhase();
EndPhase();
Action();
在StartPhase()函数中,您可以设置状态的所有初始值,例如,禁用其他玩家的输入,依此类推。
调用roll.EndPhase()时,请确保将GamePhase指针设置为下一个状态。
phase = new MovePhase();
phase.StartPhase();
例如,在此MovePhase :: StartPhase()中,将活动玩家的剩余移动设置为上一阶段的滚动量。
现在,有了这种设计,您就可以在滚动阶段解决“ 3 x double = jail”的问题。RollPhase类可以处理自己的状态。例如
GameState state; //Set in constructor.
Die die; // Only relevant to the roll phase.
int doublesRemainingBeforeJail;
StartPhase()
{
die = new Die();
doublesRemainingBeforeJail = 3;
}
Action()
{
if(doublesRemainingBeforeJail<=0)
{
state.phase = new JailPhase(); // JailPhase::StartPhase(){set moves to 0};
state.phase.StartPhase();
return;
}
int die1 = die.Roll();
int die2 = die.Roll();
if(die1 == die2)
{
--doublesRemainingBeforeJail;
state.activePlayer.AddMovesRemaining(die1 + die2);
Action(); //Roll again.
}
state.activePlayer.AddMovesRemaining(die1 + die2);
this.EndPhase(); // Continue to moving phase. Player has X moves remaining.
}
我与《 Pyrolistical》的不同之处在于,应该为所有内容提供一个阶段,包括玩家何时落在社区胸前或什么地方。我将在MovePhase中处理所有这一切。这是因为如果您有太多的连续阶段,则播放器很可能会感到“被引导”。例如,如果有一个阶段,玩家只能购买财产,然后只能购买酒店,然后只能购买房屋,那就像没有自由一样。只需将所有这些零件放入一个BuyPhase中,就可以让玩家自由购买他想要的任何东西。BuyPhase类可以轻松地处理合法的购买。
最后,让我们来谈谈游戏板。尽管2D数组很好,但我还是建议您使用一个图块图(图块在板上的位置)。在垄断的情况下,它宁愿是双链表。然后每个磁贴都会有一个:
- previousTile
- nextTile
因此,执行以下操作会容易得多:
While(movesRemaining>0)
AdvanceTo(currentTile.nextTile);
AdvanceTo函数可以处理您的分步动画或任何您喜欢的动画。当然也会减少剩余的动作。
RS Conley针对GUI的观察者模式的建议很好。
我还没发布太多。希望这对某人有帮助。