游戏人工智的能开发决策之6种方法.docx

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
游戏人工智的能开发决策之6种方法

游戏人工智能开发之6种决策方法人工智能遵循着:感知-思考-行动决策方法:有限状态机(Finite-State Machines),分层状态机(Hierarchical Finite-State Machines),行为树(Behavior Trees),效用系统(Utility Systems),目标导向型行动计划(Goal-Oriented Action??Planners),分层任务网络(Hierarchical Task Networks)一、有限状态机 有限状态机是目前游戏AI中最常见的行为模型。状态机的代码简单又快速,使用上强大、灵活、计算开销小。状态机的一个好处是可以可视化,如下图所示: 图中有四个状态:巡逻(patrol),查看(investigate),攻击(attack),逃走(flee),我们把实心圆当做初始状态。 简要过程:假设NPC士兵正在保卫他的阵地,当前状态为巡逻,当他听到什么动静时就会转到查看状态,跑到声音源去查看,如果看到敌人就转到攻击状态,如果没看到过一段时间又会回到巡逻状态。在攻击状态中如果血值低下就会进入逃跑状态。如果击败了敌人,又会回到巡逻状态。 状态机状态类的一个主要结构如下,onEnter函数就相当于unity中的Start()函数,在类开始时调用,作为对旧状态的过度和新状态产生的开始,比如当从巡逻转向攻击状态时,可以在攻击状态的开始让NPC大喊“发现敌人!进攻!”等等。onUpdate()就相当于unity中的Update(),你可以让它每帧都执行,或者几秒钟执行一次,是循环执行的,每次执行时间间隔由你来决定。onExit()就是在退出一个状态之前要执行的,比如,杀死敌人之后由攻击状态转向巡逻状态之前,让NPC做一个欢呼手势并大叫胜利了。FSMTransition列表为将要转到的所有可能的状态。class FSMState{?virtual void onEnter();?virtual void onUpdate();?virtual void onExit();?listFSMTransition transitions;}; 每个状态还存储着FSMTransition的类,代表能从当前状态可以转到的状态class FSMTransition{?virtual bool isValid();?virtual FSMState* getNextState();?virtual void onTransition();} 当转换条件满足时isValid()返回true,比如当发现敌人NPC就从巡逻状态转到攻击,getNextState()返回将要转到的状态,onTransition()是状态之间转换的过渡,和上面说的onEnter()差不多。 最后是有限状态机类FiniteStateMachineclass FiniteStateMachine{?void update();?listFSMState states;?FSMState* initialState;?FSMState* activeState;} 有限状态机类包含一个包含所有状态的列表states,initialState为初始状态,activeState为当前状态。 伪代码如下:在??activeState.transtitions中循环调用isValid(),检测是否符合达到下一状态的条件如果符合转换条件 调用activeState.on Exit(),退出当前状态 设置activeState 为 validTransition.getNextState(),把当前状态赋值为下一状态 调用activeState.onEnter(),下一状态的开始如果不符合转换条件,调用activeState.onUpdate(),让NPC执行当前状态需要做的事 在编写有限状态机的代码只前最好画一个上面的草图,这样既可以明确转换关系,又可以不漏掉该有的状态。二、分层有限状态机 有限状态机虽然好,但是它有很大的缺点,当状态少的时候可以运用自如,当状态多的时候10个以上就已经结构非常复杂,而且容易出错。 如果我们让NPC巡逻两个地方,比如安全的室内,和门口。 如果我们想在一个状态上附加一些状况,例如当NPC在巡逻时,让他接一个电话然后再恢复巡逻,此时如果使用有限状态机的话我们必须要新建一个打电话的状态来做过渡,但是此时的巡逻有两个,所以能接到电话的状态也有两个,然后加了两个相同的状态,很多这样的重复的小状态使得状态机越来越复杂。如下图: 这时,我们可以用分层有限状态机来解决这个问题,把多个状态机归为一层,如下图,把巡逻安全处和门口归为看守建筑,这样我们只需要有一个打电话状态就可以了。 分层有限状态机增加了一个滞后,在有限状态机中并没有

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档