许多FSM框架允许创建定义过渡矩阵的FSM,其中包括:
我想要处理这样一个场景:我有一个游戏。有几个玩家(数目不详)可以加入游戏。一个球员可以表现出他的准备,按下开始按钮。所有其他球员都会被告知按“开始”按钮。当最后一个玩家按下按钮时,游戏就开始了。
因此,我不知道如何使用转换矩阵来定义游戏的状态机。看起来,有时开始事件会导致转换到相同的状态,而在结束时则会导致一个新的状态。也许问题在于糟糕的状态/事件设计?
发布于 2018-07-27 10:27:35
如果它仍然相关,那么您可以在这里使用以下两种状态来建模您的空间:
然后用计数器监视事件。让我们说,N是玩家的数量,每次玩家点击就绪,你就设置counter = counter + 1。您的事件在开始时称为PlayersReady = false。在每个周期PlayersReady = counter >= N上,您可以监视每个人是否都准备好了。PlayersReady成为您的转换逻辑:
Initial state = NotReadyState if (NOT PlayersReady) newState = NotReadyState else newState = ReadyState
发布于 2022-08-21 08:42:34
条件转移不是纯有限状态机方法。一个严格的解决办法是有尽可能多的状态和玩家数量,比如N。因此,对于每一个K准备好的玩家过渡,看起来类似于<K-1 Players Ready State> -> <K Players Ready State>。因此,N个球员准备切换将等同于所有球员准备状态。
但是,如果每次都有非恒定数量的玩家,或者数量太大,所以无法保存这么多状态,那么您将需要一个有点复杂的解决方案,其中包括记得以前状态的堆栈状态内存。解决方案是初始化堆栈,好像之前有N-1非就绪状态,堆栈底部有所有玩家就绪状态(就好像q0-N状态下的玩家都准备好了一样)。因此,当K-播放器按下就绪按钮时,状态堆栈将减少1(玩家变得不准备,将先前的状态添加到堆栈中)。这并没有打破决定论,但仍然使它有点混乱。
另一种方法,我用于扑克轮班机器人,是委托一个外部系统的计数任务。游戏状态机不需要按字面顺序保持每个状态。这足以使它与自己的逻辑保持一致。因此添加了一个新的对象"Table“(播放器插槽架),它充当事件源。它驻留在真实事件和状态机之间,并且有一个微不足道的计数器。表本身发送“空”、“满”、“玩家投票准备”等事件。相反,一个游戏只处理“当前”、“下一个”、“下一个活跃”的玩家实体。所以实际的数字可能是无限的。
https://stackoverflow.com/questions/49680549
复制相似问题