您还未登录!|登录|注册|帮助
CSDN首页资讯论坛博客下载搜索更多CTO俱乐部学生大本营培训充电移动开发软件研发云计算程序员TUPguocai_yao的专栏
条新通知
登录注册欢迎
退出
我的博客
配置
写文章
文章管理
博客首页
全站 当前博客 空间博客好友相册留言用户操作
[留言]  [发消息]  [加为好友] 
姚国才ID:guocai_yao
共19660次访问,排名9473,好友29人,关注者35人。
态度决定一切
姚国才的文章
原创 47 篇
翻译 0 篇
转载 13 篇
评论 25 篇
订阅我的博客
   
[编辑]guocai_yao的公告
[编辑]文章分类
APUE(Advanced Programming In The Unix Environment
C
C++
Programming Tips
skills
The C Programming Language
Unix环境高级编程)读书笔记
VC及其IDE
单片机
数据结构
琐碎
他山之玉
小想法
硬件电路的那些事儿
[编辑]EmbeddedSystem
Aquarius (其中还有英文网站)
[编辑]高手&大师
ammana_babi
Richard Stallman
Roland McGrath
steedhorse
taodm
侯捷
周立功
c语言搜题软件推荐徐艺波个人网站
艺术编程
陈莉君
[编辑]好书推荐
C++学习推荐书目
c语言的提高
[编辑]好友
袁东
存档
2010年05月(8)
2010年04月(2)
2010年01月(5)
2009年08月(1)
2009年06月(1)
2009年05月(4)
2009年04月(5)
2009年03月(8)
2009年02月(1)
2009年01月(1)
2008年05月(21)
2008年04月(3)
公告:
CSDN 产品事业部开设官方博客了!来关注我们的一举一动吧![意见反馈][官方博客]  C语言实现有限状态机 收藏
以下是转载内容:
☆─────────────────────────传说中的分隔符───────────────────────────────────────☆
来源1:wwwblogs/swingboat/archive/2005/07/27/201488.html
【转载1】有限状态机的实现 < type="text/javascript">
有限状态机(Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具,很多东西的模型实际上就是有限状态机。
最近看了一些游戏编程AI的材料,感觉游戏中的AI,第一要说的就是有限状态机来实现精灵的AI,然后才是A*寻路,其他学术界讨论比较多的神经网络、模糊控制等问题还不是很热。
FSM的实现方式:
1) switch/case或者if/else
这无意是最直观的方式,使用一堆条件判断,会编程的人都可以做到,对简单小巧的状态机来说最合适,但是毫无疑问,这样的方式比较原始,对庞大的状态机难以维护。
2) 状态表
维护一个二维状态表,横坐标表示当前状态,纵坐标表示输入,表中一个元素存储下一个状态和对应的操作。这一招易于维护,但是运行时间和存储空间的代价较大。
3) 使用State Pattern
使用State Pattern使得代码的维护比switch/case方式稍好,性能上也不会有很多的影响,但是也不是100%完美。不过Robert C. Martin做了两个自动产生FSM代码的工具,for java和for C++各一个,在www.objectmentor/resources/index上有免费下载,这个工具的输入是纯文本的状态机描述,自动产生符合State Pattern的代码,这样developer的工作只需要维护状态机的文本描述,每必要冒引入bug的风险去维护code。
4) 使用宏定义描述状态机
一般来说,C++编程中应该避免使用#define,但是这主要是因为如果用宏来定义函数的话,很容易产生这样那样的问题,但是巧妙的使用,还是能够产生奇妙的效果。MFC就是使用宏定义来实现大的架构的。
在实现FSM的时候,可以把一些繁琐无比的if/else还有花括号的组合放在宏中,这样,在
代码中可以3)中状态机描述文本一样写,通过编译器的预编译处理产生1)一样的效果,我见过产生C代码的宏,如果要产生C++代码,己软MFC可以,那么理论上也是可行的。
【评】:状态表的实现方法,《C专家编程》第8章有具体说明,转载【6】
☆──────────────────────传说中的分隔符──────────────────────────────☆
来源2:hi.baidu/juneshine/blog/item/6bff718bd5902f13c9fc7a14.html
【转载2】有限状态机的c实现
2007-05-11 15:12
網絡上可以搜索到很多有限狀態機的代碼和理論分析,這兒僅僅是做一個簡單的例子,僅供入門參考。
这儿以四位密码校验作为状态机的例子,连续输入2479就可以通过密码测试。一个非常简
单的例子,在实际的状态机实例中,状态转移表要更復雜一些,不過方式非常類似。在狀態查詢的地方可以做優化,同時對于輸入量也可以做有效性優化。具體代碼如下:
view plaincopy to clipboardprint?
c.h 
 
typedef enum{ 
STATE1 = 1, 
STATE2, 
STATE3, 
STATE4, 
STATE5,//password pass 
//...ADD here 
}STATE; 
 
typedef enum{ 
INPUT1 = '2', 
INPUT2 = '4', 
INPUT3 = '7', 
INPUT4 = '9', 
}INPUT; 
 
typedef struct 
STATE cur_state; 
INPUT input; 
STATE next_state; 
}STATE_TRANS; 
c.h
typedef enum{
STATE1 = 1,
STATE2,
STATE3,
STATE4,
STATE5,//password pass
//...ADD here
}STATE;
typedef enum{
INPUT1 = '2',
INPUT2 = '4',
INPUT3 = '7',
INPUT4 = '9',
}INPUT;
typedef struct
{
STATE cur_state;
INPUT input;
STATE next_state;
}STATE_TRANS;
c.c 
#include  <stdio.h>   
#include "c.h" 
 
STATE_TRANS state_trans_arry[] =   
{STATE1,INPUT1,STATE2}, 
{STATE2,INPUT2,STATE3}, 
{STATE3,INPUT3,STATE4}, 
{STATE4,INPUT4,STATE5}, 
}; 
#define STATE_TRANS_CNT (sizeof(state_trans_arry)/sizeof(state_trans_arry[0])) 
 
int main()   
int i; 
char ch; 
STATE state_machine = STATE1; 
 
while(ch != 'e') 
  ch = getchar(); 
  if((ch >= '0') && (ch <= '9'))//for digit password input only 
  { 
    for(i = 0;i < STATE_TRANS_CNT;i++) 
    { 
    if((ch == state_trans_arry[i].input) && (state_machine == state_trans_arry[i].cur_state)) 
    { 
      state_machine = state_trans_arry[i].next_state; 
      continue; 
    } 
    else if(i == (STATE_TRANS_CNT - 1))//no transfer match,reset state 
    { 
      state_machine = STATE1; 
    } 
    } 
    if(state_machine == STATE5) 
    printf("Password correct,state transfer machine pass!\n"); 
  } 
return 0; 
c.c
#include  <stdio.h> 
#include "c.h"
STATE_TRANS state_trans_arry[] =
{
{STATE1,INPUT1,STATE2},
{STATE2,INPUT2,STATE3},
{STATE3,INPUT3,STATE4},
{STATE4,INPUT4,STATE5},
};
#define STATE_TRANS_CNT (sizeof(state_trans_arry)/sizeof(state_trans_arry[0]))
int main() 
{
int i;
char ch;
STATE state_machine = STATE1;
while(ch != 'e')
{
  ch = getchar();
  if((ch >= '0') && (ch <= '9'))//for digit password input only
  {
    for(i = 0;i < STATE_TRANS_CNT;i++)
    {
    if((ch == state_trans_arry[i].input) && (state_machine == state_trans_arry[i].cur_state))

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。