我如何最好地将回合制桌面游戏建模为Java中的状态机?



我承认,我的家庭作业是编写一个棋盘游戏(我们称之为MEDN)。我可以用简单愚蠢的方式来做,只要有nextPlayerTurn, winner,等等,但我真的很喜欢把它编程得尽可能好。然而,我一直未能想出如何实现这样一个状态机,以便它很容易使用来反映我的棋盘游戏逻辑。

假设玩家可以掷骰子,如果掷到6,再掷一次,然后在给定棋盘上的特定条件下,用4个数字中的一个移动。

目前我的问题是:

  • 我可以很容易地建模板,但它是机器的哪个元素?它是输入的一部分,还是状态?我是要输出新板作为输出,还是要就地修改当前板(这让我感觉不干净)。我必须能够确定玩家可以做出的所有可能的移动,所以也许第一个解决方案更好。
  • 相同的过程(滚动,可能重新滚动,移动)将对每个玩家重复。如果我在纸上制作一个状态机,我会制作3*4个状态,每一行代表一个玩家,每一列代表这个过程的一个步骤。在Java中一定有一些非常好的方法来做到这一点,我很高兴看到。除此之外,谁是赢家也必须被编码。

我没能想出一个好看的解决方案。

首先,我想说的是,不要试图表现游戏可能处于的每一个状态。给定一个起始状态,你就可以根据玩家的移动计算出下一个状态。没有必要把每一种可能性都画出来。(当创造一个玩棋盘游戏的AI时,通常会让它计算下几个可能的棋盘状态,并以此为基础选择一个移动,而不是计算每个可能的棋盘状态,因为这通常是不切实际的)。一般来说,状态机中的状态代表了板子的状态。玩家的移动将改变机器的状态,终止状态将是一个获胜的配置。

话虽如此,我不认为状态机是解决这个问题的最佳方法。"愚蠢的简单方法"实际上可能是用非常简单的逻辑编写游戏的最优雅、最干净的方法。这并不奇怪,但试图想出一个聪明的解决方案可能会使一个简单的问题变得过于复杂。

最新更新