﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-摆渡人，外婆桥！-随笔分类-WorkFlow</title><link>http://www.blogjava.net/swingboat/category/6385.html</link><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----只要路选对了，就不怕有多远！</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:01:43 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:01:43 GMT</pubDate><ttl>60</ttl><item><title>有限状态机的实现 </title><link>http://www.blogjava.net/swingboat/archive/2005/12/28/25646.html</link><dc:creator>swingboat</dc:creator><author>swingboat</author><pubDate>Wed, 28 Dec 2005 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/swingboat/archive/2005/12/28/25646.html</guid><wfw:comment>http://www.blogjava.net/swingboat/comments/25646.html</wfw:comment><comments>http://www.blogjava.net/swingboat/archive/2005/12/28/25646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/swingboat/comments/commentRss/25646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/swingboat/services/trackbacks/25646.html</trackback:ping><description><![CDATA[有限状态机（Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具，很多东西的模型实际上就是有限状态机。<BR><BR>最近看了一些游戏编程AI的材料，感觉游戏中的AI，第一要说的就是有限状态机来实现精灵的AI，然后才是A*寻路，其他学术界讨论比较多的神经网络、模糊控制等问题还不是很热。<BR><BR>FSM的实现方式：<BR>1） switch/case或者if/else<BR>这无意是最直观的方式，使用一堆条件判断，会编程的人都可以做到，对简单小巧的状态机来说最合适，但是毫无疑问，这样的方式比较原始，对庞大的状态机难以维护。<BR><BR>2） 状态表<BR>维护一个二维状态表，横坐标表示当前状态，纵坐标表示输入，表中一个元素存储下一个状态和对应的操作。这一招易于维护，但是运行时间和存储空间的代价较大。<BR><BR>3） 使用State Pattern<BR>使用State Pattern使得代码的维护比switch/case方式稍好，性能上也不会有很多的影响，但是也不是100％完美。不过Robert C. Martin做了两个自动产生FSM代码的工具，for java和for C++各一个，在http://www.objectmentor.com/resources/index上有免费下载，这个工具的输入是纯文本的状态机描述，自动产生符合State Pattern的代码，这样developer的工作只需要维护状态机的文本描述，每必要冒引入bug的风险去维护code。<BR><BR>4） 使用宏定义描述状态机<BR>一般来说，C++编程中应该避免使用#define，但是这主要是因为如果用宏来定义函数的话，很容易产生这样那样的问题，但是巧妙的使用,还是能够产生奇妙的效果。MFC就是使用宏定义来实现大的架构的。<BR>在实现FSM的时候，可以把一些繁琐无比的if/else还有花括号的组合放在宏中，这样，在代码中可以3）中状态机描述文本一样写，通过编译器的预编译处理产生1）一样的效果，我见过产生C代码的宏，如果要产生C++代码，己软MFC可以，那么理论上也是可行的。<img src ="http://www.blogjava.net/swingboat/aggbug/25646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/swingboat/" target="_blank">swingboat</a> 2005-12-28 09:02 <a href="http://www.blogjava.net/swingboat/archive/2005/12/28/25646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>