我正在对有限状态机进行自我教育研究。目前偶然发现有趣但非平凡的任务要完成。根据国际象棋游戏规则定义状态机真的很难。
虽然规则似乎很简单,但游戏本身很难使用FSM。我在考虑将游戏状态编码为棋盘状态,其中每个方块都是空的或包含一些棋子。但是很难定义转换,因为转换应该知道涉及主题单元邻域的事实。对于像en-passant或castling这样的情况,也很难定义过渡,特别是当铸造被其他部件阻挡时。同样的方法是很难定义被其他部分阻挡但不能跳过它们的棋子的移动限制,即棋子,主教,车手,女王。
你会如何解决这个问题?或者可能有一些我不知道的FSM扩展。我很确定有很多类似的应用程序,其中FSM使用起来不切实际。在一般情况下,您将如何处理此问题。
提前谢谢你,
答案 0 :(得分:1)
在你的方法中,每个状态都是一个字段矩阵,其中每个字段都有一个特定的状态,它是颜色的组成和放在它上面的棋子,棋子本身就是颜色的组合。国际象棋及其类型(典当,车等)。因此,您可以通过利用这些矩阵轻松定义规则:
Example for pawn:
Initial state:
C D E
5 (W , (X , ?)) (B , (P , B)) (W , (P , B))
4 (B , (P , W)) (W , (X , ?)) (B , (P , W))
现在,我们可以根据此规则评估移动两个白色数字的规则:
如果一个棋子没有被另一个人物挡住,它可以直接向前移动,或者它可以击败距离它一个街区对角放置的数字。下面用白色移动构建上述状态的转换表可以通过以下方式完成:
S1->(a)X (just the standard way to define a transition)
a would be the figure, we want to move and S2 the resulting state
X are the reachable state.
a = Pawn at C4
we have two options evaluating the field:
C5 is free, so we can move the pawn to that field
D5 is held by a black pawn, so we can beat it and move to that field
a = Pawn at E4
E5 not free, we can't move ahead
D5 is held by a black pawn, which we can beat
将其转化为数学应该不会太难。每个州的州过渡表将包括所有数字的所有可能移动。生成的机器将是NFA。
另一种选择是将过渡定义为您想要移动的一对棋子以及您想要移动它的位置。这样你就可以构建一个DFA。