有限状态机 FSM

文章目录
  1. 1. 定义
  2. 2. 特征
  3. 3. 几个重要概念[3]
  4. 4. 状态机的要素[1:1]
  5. 5. 注意的问题
  6. 6. 例子
    1. 6.1. 游戏
  7. 7. 褒扬和批判
    1. 7.1. 游戏开发
  8. 8. 更多
  9. 9. 参考

img

定义

有限状态机(Finite-state machine)是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。[1]

特征

简单说,它有三个特征[2]

  • 状态总数(state)是有限的。
  • 任一时刻,只处在一种状态之中。
  • 某种条件下,会从一种状态转变(transition)到另一种状态。

几个重要概念[3]

  • 状态(State):表示对象的某种形态,在当前形态下可能会拥有不同的行为和属性。
  • 转移(Transition):表示状态变更,并且必须满足确使转移发生的条件来执行。
  • 动作(Action):表示在给定时刻要进行的活动。
  • 事件(Event):事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。

状态机的要素[1:1]

状态机可归纳为4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:

  • 现态:当前所处的状态。
  • 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
  • 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
  • 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

我们可以用状态表了表示整个过程,如下图所示。

状态表

img

注意的问题

避免把某个“程序动作”当作是一种“状态”来处理[1:2]

那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。

例子

游戏

有限状态机用来编游戏和故事是最好的了。[4]
这有一个寻宝游戏,首先你从‘开始’出发,然后你跟随箭头知道你到达终点。

img

褒扬和批判

游戏开发

在游戏开发中使用状态机显然不失为一种不错的选择,首先它的概念并不复杂,其次它的实现也十分简单而直接。但它的缺点却也十分明显,例如难以复用,因为它往往需要根据具体的情况来做出反应,当然当状态机的模型复杂到一定的程度之后,也会带来实现和维护上的困难。[3:1]

更多

参考:[5]

代码相关:[2:1]

对JavaScript的意义在于,很多对象可以写成有限状态机。

参考


  1. 深入浅出理解有限状态机 - 简书 ↩︎ ↩︎ ↩︎

  2. JavaScript与有限状态机 - 阮一峰的网络日志 ↩︎ ↩︎

  3. 趣说游戏AI开发:对状态机的褒扬和批判 - Runtime - SegmentFault ↩︎ ↩︎

  4. Programming Basics: 有限状态机 ↩︎

  5. 有限状态机 - 维基百科,自由的百科全书 ↩︎