阅读笔记-游戏开发中的人工智能-第9章-有限状态机
2011-05-25 09:23
531 查看
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里面,代码都是一样的,只要保证imBlue先判断就行了,后面就是判断canSeePlayer了。当然这个代码不是最高效的,但是比较直观,容易展示。
个人感觉,一般优先状态机主要把握两个部分,第一部分就是在一个循环中,根据状态机做一些事情,第二个就是,做事的过程中,由于发生了一些情况,导致状态改变了,从而影响到了前面循环的过程。
记得,在上面向对象程序设计的课中,就学过有限状态机,后来上编译原理的时候,接着有限状态机,直到研一的形式语言自动机中,还是有限状态机。貌似有一个很列害的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里面,代码都是一样的,只要保证imBlue先判断就行了,后面就是判断canSeePlayer了。当然这个代码不是最高效的,但是比较直观,容易展示。
个人感觉,一般优先状态机主要把握两个部分,第一部分就是在一个循环中,根据状态机做一些事情,第二个就是,做事的过程中,由于发生了一些情况,导致状态改变了,从而影响到了前面循环的过程。
相关文章推荐
- 阅读笔记-游戏开发中的人工智能-第2章-追逐和闪躲
- 阅读笔记-游戏开发中的人工智能-第3章-移动模式
- 阅读笔记-游戏开发中的人工智能-第2章-追逐和闪躲
- 阅读笔记-游戏开发中的人工智能-第4章-群聚
- 阅读笔记-游戏开发中的人工智能-第8章-描述式AI及描述引擎
- 阅读笔记-游戏开发中的人工智能-第5章-以势函数实现移动
- 阅读笔记-游戏开发中的人工智能-第7章-A*路径寻找算法
- 阅读笔记-游戏开发中的人工智能-第1章-游戏人工智能简介
- 游戏开发中的人工智能(九):有限状态机
- 【阅读笔记之六】《DIRECTX.9.0.3D游戏开发编程基础》:Direct3D中的颜色
- 【阅读笔记之九】《DIRECTX.9.0.3D游戏开发编程基础》:Direct3D中的融合技术
- 【阅读笔记之八】《DIRECTX.9.0.3D游戏开发编程基础》:Direct3D中的纹理与映射
- <游戏开发中的人工智能> -- 阅读笔记
- 【阅读笔记之十一】《DIRECTX.9.0.3D游戏开发编程基础》:网格(一)闲话ID3DXMesh接口
- 【阅读笔记之十】《DIRECTX.9.0.3D游戏开发编程基础》:Direc3D中的字体
- Orz游戏开发框架阅读笔记(一)
- 【阅读笔记之十三】《DIRECTX.9.0.3D游戏开发编程基础》 网格(三)加载小汽车的XFile的demo
- 【阅读笔记之十二】《DIRECTX.9.0.3D游戏开发编程基础》:网格(二)浅话X文件和渐进网格
- 【阅读笔记之一】《DIRECTX.9.0.3D游戏开发编程基础》:DirectX概略
- 【阅读笔记之四】《DIRECTX.9.0.3D游戏开发编程基础》绘制流水线