0%

状态机

简介

状态机:描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的事件做出反应的模型。

用来表示有限多个状态以及在这些状态(State)之间转移(Transition)和动作(Action)的数学模型。

简单的说它可以将单位的所有行为去划分状态,状态与状态之间通过事件的触发形成。

状态机可归纳为4个要素,即现态,条件,动作,次态。

  • 现态:是指当前所处的状态。
  • 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
  • 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的
  • 次态:条件满足后要迁往的新状态。

事件:1.检测转换条件 2.进行状态切换

设计状态机

  • 可以用状态移动图表示
  • 可以用表格来表示,如:事件/状态表,现态/次态表…

AI设计中个人喜欢现态/次态表

img)点击并拖拽以移动

状态机分类

  • Moore状态机:输出只和状态有关而与输入无关
  • Mealy状态机:输出不仅和状态有关而且和输入有关系

实现

  • 竖向:swich,if..else
  • 横向:FSM

附录:竖向写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
cur_state = nxt_state;

switch(cur_state){ //在当前状态中判断事件

case s0: //在s0状态

if(e0_event){ //如果发生e0事件,那么就执行a0动作,

并保持状态不变;

执行a0动作;

//nxt_state = s0; //因为状态号是自身,所以可以删除此句

,以提高运行速度。

}

else if(e1_event){ //如果发生e1事件,那么就执行a1动作,

并将状态转移到s1态;

执行a1动作;

nxt_state = s1;

}

else if(e2_event){ //如果发生e2事件,那么就执行a2动作,

并将状态转移到s2态;

执行a2动作;

nxt_state = s2;

}

break;

case s1: //在s1状态

if(e2_event){ //如果发生e2事件,那么就执行a2动作,

并将状态转移到s2态;

执行a2动作;

nxt_state = s2;

}

break;

case s2: //在s2状态

if(e0_event){ //如果发生e0事件,那么就执行a0动作,

并将状态转移到s0态;

执行a0动作;

nxt_state = s0;

}

点击并拖拽以移动