工作流程-人工智能之状态机的原理和实现
工作流程-人工智能之状态机的原理和实现程序又称机器人程序,顾名思义既是通过程序模拟替代人类来操作游戏.是一种人工智能简单的应用.而状态机正是人工智能一种简单的实现.
举例说明:
控制游戏角色移动到想要某地准备打怪练级.那么我们想象一下作为人类该怎样一步步的操作呢? 首先通过大脑里预先设定好满足战斗的条件.
如背包未满.装备持久正常.携带药品足够.等等.再用眼睛检查角色各项是否满足其条件.如满足则查找当前画面是否有可攻击的怪物.
如果有则选择. 并攻击.怪物死亡后.检查地面是否有掉落物品.如有则拾取.然后重复之前的动作. 了解了这些情况后.如何编程来实现呢?
传统的编程实现方式既是遵循事先设定的逻辑.从头到尾顺序的执行.其缺点是过于死板.程序一经写成.很难对其进行扩展.
程序规模和代码逻辑成正比.不易于维护. 相较下.状态机编程思想成为更佳的解决方案.下面将通过C语言语法的伪代码来讲解其原理和实现.
状态机的4个要素:现态.条件.动作.次态
1.现态:是指游戏角色当前所处的状态.
2.条件:当一个条件被满足.将会触发一个动作.或者执行一次状态的迁移.
3.动作.条件满足后执行的工作
4.次态:条件满足后要迁往的新状态.
综上所述.一个状态机可以通过2个函数来完成.第一个函数获取现态.再通过条件返回需要执行的动作.第二个函数.实现动作的集合.并修改次态.
函数一:
unsignedint GetAction() // 函数功能:获取状态并根据预先定义的条件来返回需要执行的动作码.
{
第一步获取状态:
因为当今的MMORPG类游戏.都有各自简单的人工智能成分.所以在其设计时.游戏角色结构中必有一个域.来表示角色当前状态.这正是我们需要的.大前提所在.当然此域需要我们通过逆向分析取得.
如:1=静止 2=休息 3=移动 4=战斗 5=受到攻击
第二步对每种状态的各种条件进行判断.并返回结果.
switch(游戏角色状态)
{
case 1:当人物状态为静止时.检测是否符合挂机条件.再检测是否选择了怪物.如果所有条件不成立则返回攻击动作码
{
检查条件.通过先后逻辑来控制优先级
if(满足回程补给条件==是) 返回结果 1
else if(角色选中状态==空) 返回结果 2
else返回结果 3
}
case 2:当人物状态为休息时.大家知道游戏设计如果角色一段时间没有动作.就会原地休息.因为程序一旦执行.如果返回这个状态就说明程序或者角色出现异常.那我们只能做些停止之类的动作
{
返回结果 4
}
case 3:当人物状态为移动时.判断条件是否到达目的地
{
if(到达目的地==假) 返回结果 5
}
case 4:当人物状态为战斗时.判断攻击目标是否死亡
{
if(判断目标死亡==是) 返回结果 6
else 返回结果3
}
case 5:当人物状态为受到攻击时.
{
返回结果 3
}
default:
{
如果状态未定义.可输出调试信息.
}
}
Function End
}
函数二:
unsigned intProcess() // 函数功能:动作合集,因为我们的状态是游戏客户端控制的.所以不需要我们来调整次态
{
while(1)可以开条子线程写一个死循环检查状态返回的动作码. 如不喜可使用时钟,或其他
{
switch(GetAction())
{
case 1:执行回程补给动作
case 2:执行选怪动作
case 3:执行攻击动作
case 4:执行关机动作
case 5:执行寻路动作
case 6:执行拾取动作
default:输出调试信息
}
Loop End
}
Function End
}
以上函数只为说明思路.其条件设定和逻辑必定不够严谨.请观者不必执着于此.其状态机的优点就是相对灵活.可轻松扩展.并使逻辑清晰.并简单化.
希望各位还不懂此思想的同学.看完此文.能理解其原理后举一反三写出自己W美的状态机
PS:
此文归类科普.适用人群为初入 行业的同学. 当然更欢迎各位前辈大牛光临指教.如有不吝赐教更优秀的思路.小弟和广大新人同学.更是感激不尽.不过.
请那些闲得蛋疼的朋友自重些.有时间能帮助别人就帮一下. 不想的话.就多读几本书来帮帮自己. 再不行就睡会觉来养养精神.别把时间用在说风凉话上. 损人不利己 .
交流不同意见可以.但最好不要带人身攻击. 支持,赞一个 学习了,谢谢楼主 工作流程-人工智能之状态机的原理和实现 求沙发 OMG!介是啥东东!!! 硬实厉害啊 打酱油的,飘过赚点海币 高手云集 马上来看看 手指点一点,海币轻松得到手!
页:
[1]