有限状态机以及扩展

      经常会遇到这个词FSM,有限状态机,特别是在讲到游戏AI模块中。正好通过看《游戏编程模式》中的状态模式对有限状态机有了一个初步的了解,文中从普通的有限状态机,到并行状态机,再到层次状态机,最后介绍了下推状态机。这里做一下总结,以后再阅读代码时能做出辨认以及以后能为自己所用。

目录

1.有限状态机

2.并发状态机

3.层次状态机

4.下推状态机


1.有限状态机

有限状态机的定义是:

    1.拥有一组状态,可以在这种状态中进行切换(由于有输入或者有事件发生)

    2.同一时刻只能处于一种状态。

比如一个角色,有站立,跳跃,俯冲,和躲避4种状态。在状态之间的切换操作有键盘按下B,按下↓,释放↓。简单的表示几组状态的转移:

1)用图来表示状态转移:

2)也可以用表来表示状态转移:

 
当前状态→
条件↓
状态A站立 状态B跳跃 状态C俯冲 状态D躲避
按下B 状态B跳跃      
按下↓ 状态D躲避 状态C俯冲    
释放↓       状态A站立

对于有限状态机的实现有两种方式

1)使用枚举和分支--面向过程

用枚举类型来定义各种状态,用一个变量来指定当前是哪种状态。

用if分支来判断当处于何种状态下,当是何种事件或者输入的时候,会发生什么事。

2) 使用状态模式--面向对象

把每一种状态都定义成一个类。

对每种状态下各个输入都放到类中去处理。

    关于这两种实现方式,1)简单直观,如果是简单的状态机可以用这种方式。但是如果针对每个状态下还需要有自己的变量以及特殊的逻辑以及后续需要频繁的修改,可以考虑用2),使用状态对象把相关的数据和代码封装起来。

2.并发状态机(多维)

    并发状态机的意思就是两个不相关的状态机同时运行,也就是两组不相关的状态,并发的进行。比如一组状态是第一部分中的4种状态,另外一组状态是是否开火的状态。当然也可以是多组。

    如果不使用并行状态机,而是把两种状态混合到一起的话,就多出很多状态,比如站立开火,站立不开火,跳跃开火,跳跃不开火。

    如果是两组状态互不搭嘎的时候,用两个状态机实现方法很好。但是实际中,可能两组状态中有所干扰,比如在跳跃的时候不能开火,才开火的时候不能俯冲,对于这种需要加一些if语句进行判断。

3.层次状态机(HFSM)

    层次状态机就是有多层结构的,比如在第一部分中多了,滑行,走路,跑步,这个可以和站立 提炼出新的一层父级状态——在陆地上OnGround,这几个状态都是按↓要进入躲避,按B要进入跳跃。

    相当于滑行,走路,跑步,和站立 是子状态,其父状态是 OnGround,对于共同的特性,按↓要进入躲避,按B要进入跳跃,都交由父状态处理。

    如果用状态模式 来实现 状态机的话,就用类的继承来实现这一功能。

    同一个类型内的状态是不需要关心外部状态的跳转的,这样也做到了无关状态间隔离。

    同一层次的状态数量不宜超过5

   http://www.aisharing.com/archives/393

4.下推状态机

   首先下推状态机使用的是一个状态栈,在切换状态的时候 可以是替换原有的状态(替换栈顶元素),也可以是把要进入的状态pushdown到状态栈中。解决的是如何恢复到前一个状态。至于什么情况下用前者,什么情况下用后者,就看当这个状态完成以后是否是需要恢复到前一个状态的。

    比如开火是一个独立的新的状态,与第一部分中的各个状态同一等级,任何一个状态都能按下某个键以后都能进入到开火状态,并且开火动画完成以后自己切换到原来的状态

https://gpp.tkchu.me/state.html

猜你喜欢

转载自blog.csdn.net/u012138730/article/details/88031168