【状态机】

[url]http://www.156ok.com/article/article_list.asp?account_id=888[/url]

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



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



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

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

[Copy to clipboard] [ - ]
CODE:
 // 定义状态
  #define STATE_CHASE  1  // 追逐
  #define STATE_RANDOM  2  // 随机
  #define STATE_EVADE  3  // 逃避
  #define STATE_PATTERN 4  // 模式

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

  // 进入游戏主循环
  while(!done)
  {
    ...
    switch(sprite_state)
    {
      case STATE_CHASE:
      {
        // 追逐状态的控制逻辑
      }break;

      case STATE_RANDOM:
      {
        // 随机状态的控制逻辑
      }break;

      case STATE_EVADE:
      {
        // 逃避状态的控制逻辑
      }break;

      case STATE_PATTERN:
      {
        // 模式状态的控制逻辑
      }break;

    default:break;

    } // end switch sprite_state

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

你可能感兴趣的:(职场,休闲)