用C语言实现有限状态机

原创 2007年09月22日 10:58:00

有限状态机(finite state machine)是一个数学概念,如果把它运用于程序中,可以发挥很大的作用。它是一种协议,用于有限数量的子程序("状态")的发展变化。每个子程序进行一些处理并选择下一种状态(通常取决于下一段输入)。

有限状态机(FSM)可以用作程序的控制结构。FSM对于那些基于输入的在几个不同的可选动作中进行循环的程序尤其合适。投币售货机就是FSM的一个好例子。另外一个你可以想到的复杂的例子就是你正在用的东西,想到了吗?没错,就是操作系统。在投币售货机的例子中,输入是硬币,输出是待售商品,售货机有"接受硬币","选择商品","发送商品"和"找零钱"等几种状态。

它的基本思路是用一张表保存所有可能的状态,并列出进入每个状态时可能执行的所有动作,其中最后一个动作就是计算(通常在当前状态和下一次输入字符的基础上,另外再经过一次表查询)下一个应该进入的状态。你从一个"初始状态"开始。在这一过程中,翻译表可能告诉你进入了一个错误状态,直到到达结束状态。

在C语言中,有好几种方法可以用来表达FSM,但它们绝大多数都是基于函数指针数组。一个函数指针数组可以像下面这样声明:

void (*state[MAX_STATES]) ();

如果知道了函数名,就可以像下面这样对数组进行初始化。

extern int a(),b(),c(),d();

int (*state[]) ()={a,b,c,c};

可以通过数组中的指针来调用函数:

(*state[i]) ();

所有函数必须接受同样的参数,并返回同种类型的返回值(除非你把数组元素做成一个联合)。函数指针是很有趣的。注意,我们可以去掉指针形式,把上面的调用写成:

state[i] ();

甚至

(******state[i]) ();

这是一个在ANSI C中流行的不良方法:调用函数和通过指针调用函数(或任意层次的指针间接引用)可以使用同一种语法。

如果你想干得漂亮一点,可以让状态函数返回一个指向通用后续函数的指针,并把它转换为适当的类型。这样,就不需要全局变量了。如果你不想搞得太花哨,可以使用一个switch语句作为一种简朴的状态机,方法是赋值给控制变量并把switch语句放在循环内部。关于FSM还有最后一点需要说明:如果你的状态函数看上去需要多个不同的参数,可以考虑使用一个参数计数器和一个字符串指针数组,就像main函数的参数一样。我们熟悉的int argc,char *argv[]机制是非常普遍的,可以成功地应用在你所定义的函数中。 

有限状态机(使用状态模式C++实现)

最近在研究怪物的AI,由于怪物的AI是使用有限状态机来实现的。所以就查看关于有限状态机的东西。根据这几天的查看资料,知道了有限状态机是计算机科学中一个很重要的概念。而且有限状态机是一个抽象的概念,具体...
  • yangzhengqui
  • yangzhengqui
  • 2015年01月11日 23:18
  • 5419

有限状态机(FSM)的Java 演示

本文从简单的例子入手,逐步演变成非常复杂的程序。 在简明 状态模式(5.8)中,状态之间的变换由外界控制,或者说,多种状态是分割的、无关的。状态模式最有趣的地方正是讨论其状态的变迁。...
  • yqj2065
  • yqj2065
  • 2014年09月18日 14:51
  • 19532

c/c++ 有限状态机实现

c/c++ 有限状态机实现 实现如下状态机: 1. 2层嵌套swith实现。 外层switch判断状态,内层switch判断消息。状态和消息都采用枚举变量。 ...
  • uyghfjhh
  • uyghfjhh
  • 2014年02月22日 00:39
  • 1311

状态机的原理和实现

有限状态机(FSM)是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型。在计算机领域有着广泛的应用。通常FSM包含几个要素:状态的管理、状态的监控、状态的触发、状态触发后引发的动作。 ...
  • lee_fighting
  • lee_fighting
  • 2016年09月02日 14:55
  • 1949

有限状态机(FSM)学习总结

 1       概念和术语 有限状态自动机 (FSM:Finite State Machine),简称状态机,是表示有限多个状态以及在这些状态之间转移和动作的数学模型。状态存储关于过去的信息...
  • bbs598598
  • bbs598598
  • 2016年02月24日 10:29
  • 2665

整理:一种有限状态机的C语言实现

状态机的原理就不说了,先给出状态机的转换图,很简单 实现的思路是这样的: 1、用函数指针表示状态(状态函数)。 2、状态函数接受一个参数(event),并...
  • bat67
  • bat67
  • 2016年07月29日 10:37
  • 385

一个通用的有限状态机(FSM)框架

吃饭,睡觉,打豆豆现在要实现一个游戏中的一个NPC的AI, 他只做三件事,吃饭,睡觉,打豆豆,最直接,最简答想到的代码应该是这样。void Update() { if(Hungry) { Ea...
  • qp120291570
  • qp120291570
  • 2016年04月19日 02:08
  • 7874

Unity3D自学笔记——有限状态机(一)框架搭建

框架搭建概念有限状态机(FSM),即在有限的状态里面进行状态的转移,并执行相应状态下的动作。状态机主要要素有 当前状态 当前状态下执行的动作 切换到下一个状态的条件 下一个状态 Animator就...
  • alistair_chow
  • alistair_chow
  • 2016年11月11日 03:56
  • 1257

有限状态机(FSM)学习总结

原文地址:http://blog.163.com/enjoy_yourself_ok/blog/static/1645812142012227102738745/ 1       概念和术语...
  • erickhuang1989
  • erickhuang1989
  • 2014年12月25日 14:29
  • 1795

算法学习笔记(九)有限状态机 FSM 的应用

有限状态机(Finite-state machine)又称有限状态自动机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。常用与:正则表达式引擎,编译器的词法和语法分析,游戏设计,网络...
  • thisinnocence
  • thisinnocence
  • 2014年11月16日 13:06
  • 2927
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C语言实现有限状态机
举报原因:
原因补充:

(最多只允许输入30个字)