免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4487 | 回复: 0

人工智能入门 - 有限状态机 [复制链接]

论坛徽章:
0
发表于 2003-05-06 19:14 |显示全部楼层
http://www.156ok.com/article/article_list.asp?account_id=888

我们必须把一个类似存储器形式的东西有限状态机(Finite-State Machine)加入到我们的“大脑”中,以便系统可以从一种行为迁移至另一种行为,并且能够了解它正在执行的行为。图5-1显示了一个有限状态机。



有限状态机一般用于执行复杂逻辑的硬件设计中,有限状态机的概念在软件工程中也很有用。一个电脑游戏可有许多种操作模式 — 例如:初始化模式、正常模式及终止模式 — 有限状态机除了可以跟踪游戏的全部状态外,还可以跟踪这些模式。有限状态机还可以控制游戏中玩家的对手和游戏对象。例如,我们可以做一部跟踪玩家角色状态的有限状态机。角色可能有如下状态:
状态0:活着
状态1:奄奄一息
状态2:死亡
  基于这些状态,游戏中的控制逻辑可执行不同的事情。如果玩家角色处于状态0,逻辑将允许角色移动、开火等等。然而,如果角色处于1,游戏逻辑将显示死亡顺序,角色就不能再移动或开火了。最后,当状态切换到状态2时,游戏逻辑将仔细检查它使用什么样的顺序才能使玩家角色活过来。
  当然,还存在将玩家角色从一种状态向另一种状态迁移的逻辑。如果玩家角色处于状态0,进入状态1的唯一办法就是以某种方式被击中或其它。一旦玩家角色处于状态1,一段时间后,角色会自动进入状态2,因此,我们明白了状态变化就是游戏环境 — 输入和有限状态机自身的结果,意思是说下一状态在某种方式上基于当前的状态。请参考图5-2所示。



上面我们讲的例子是为了游戏对象所提供的一个有限状态机比较典型的例子。总之,一个游戏对象可能有很多的状态,复杂的规则控制状态变化,这些状态变化我们称为状态迁移。另外,一个状态可以有输出。例如:在我们的状态模型的实例中,死亡状态可能有一个输出,用信号通知声音系统播放一次惨叫声。
  通过上面的阐述,我们已经知道什么是有限状态机了,但是我们如何在计算机中制作它呢?下面我们就以一个精灵活动状态为例写出伪代码:

我们可以定义一些变量跟踪状态
基于每种状态和可能的输入制定规则


  1.  // 定义状态
  2.   #define STATE_CHASE  1  // 追逐
  3.   #define STATE_RANDOM  2  // 随机
  4.   #define STATE_EVADE  3  // 逃避
  5.   #define STATE_PATTERN 4  // 模式

  6.   // 赋予精灵STATE_CHASE状态
  7.   int sprite_state = STATE_CHASE;

  8.   // 进入游戏主循环
  9.   while(!done)
  10.   {
  11.     ...
  12.     switch(sprite_state)
  13.     {
  14.       case STATE_CHASE:
  15.       {
  16.         // 追逐状态的控制逻辑
  17.       }break;

  18.       case STATE_RANDOM:
  19.       {
  20.         // 随机状态的控制逻辑
  21.       }break;

  22.       case STATE_EVADE:
  23.       {
  24.         // 逃避状态的控制逻辑
  25.       }break;

  26.       case STATE_PATTERN:
  27.       {
  28.         // 模式状态的控制逻辑
  29.       }break;

  30.     default:break;

  31.     } // end switch sprite_state

复制代码


 请记住上面这个简单的AI模型吧,以后也许你会用到。还有一点可以加到有限状态机中:占先状态控制。这就是在基于某些变量或函数在状态完全没有“成熟”之前便改变状态。在上面的伪代码中,每个状态都要执行完成为止。我们可以把条件增加为:如果在状态的执行中足够的因素得到了满足,有限状态机就会“跳出”这个状态。
  小结:设计有限状态机时,一定要仔细考虑出全部状态和状态迁移规则,避免在两个间出现周而复始的“无限循环”。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP