阅读笔记-游戏开发中的人工智能-第9章-有限状态机
1. 简述
记得,在上面向对象程序设计的课中,就学过有限状态机,后来上编译原理的时候,接着有限状态机,直到研一的形式语言自动机中,还是有限状态机。貌似有一个很列害的ERP中的核心解决方法也是状态机。不过给我印象最深的还是本科做的百项工程时,使用有限状态机实现无线模块的自动组网与通信,状态机说简单吧,确实挺简单,尤其是实际用的时候,但是想用好吧,也不轻松,状态机的实现是很简单,但是状态机得设计是要花一些心思的。
这一章主要是通过两个例子,来说明状态机在游戏中的使用,下面分别简单说一下其中一个例子。第二个例子主要是代码较多,没有太多的不同,具体想实现状态机的时候,参考一下更有价值。
2. 鬼怪的有限状态机
计算机控制鬼怪,有三种可能的状态:游走(roam)、闪躲(evade)以及追逐(chase),初始状态是“游走”。三个转化行为:当玩家吃了大力丸时,触发“我已变为蓝色”,当鬼怪看到玩家时,触发“看到了玩家”,当鬼怪看不到玩家时,触发“看不到玩家”。状态转化如图:
相关的程序代码:
switch(currentState) {
case kRoam:
if (imBlue==true) currentState=kEvade;
else if(canSeePlayer==true) currentState=kChase;
else if(canSeePlayer==false) currentState=kRoam;
case kChase:
if(imBlue==true) currentState=kEvade;
else if(canSeePlayer==false) currentState=kRoam;
else if(canSeePlayer==true) currentState=kChase;
case kEvade:
if(imBlue==true) currentState=kEvade;
else if(canSeePlayer==true) currentState=kChase;
else if(canSeePlayer==false) currentState=kRoam;
}
case kRoam:
if (imBlue==true) currentState=kEvade;
else if(canSeePlayer==true) currentState=kChase;
else if(canSeePlayer==false) currentState=kRoam;
case kChase:
if(imBlue==true) currentState=kEvade;
else if(canSeePlayer==false) currentState=kRoam;
else if(canSeePlayer==true) currentState=kChase;
case kEvade:
if(imBlue==true) currentState=kEvade;
else if(canSeePlayer==true) currentState=kChase;
else if(canSeePlayer==false) currentState=kRoam;
}
其实,三个case里面,代码都是一样的,只要保证imBlue先判断就行了,后面就是判断canSeePlayer了。当然这个代码不是最高效的,但是比较直观,容易展示。
个人感觉,一般优先状态机主要把握两个部分,第一部分就是在一个循环中,根据状态机做一些事情,第二个就是,做事的过程中,由于发生了一些情况,导致状态改变了,从而影响到了前面循环的过程。