“人工智能”(Artificial Intelligence)简称AI,在游戏里是必不可缺的,
请教一般在哪些地方会使用什么样的AI算法,比如寻路、战斗等等。
游戏编程中的寻路算法
在游戏关卡中常常会放置一些怪物(即NPC),这些怪物通常在一个区
域内走来走去,这个区域被称为“巡逻区域”;一旦玩家的角色进入怪物的
“视 野”,怪物就会发现玩家角色,并主动向其所在的位置移动,这个区
域称为“警戒区域”;当玩家角色和怪物更加靠近时,会进入到怪物的“攻
击区域”,这时怪物 会对玩家角色进行伤害。在某些RPG(Real-Time
Strategy Game,即时战略游戏)中,NPC 在不利的情况下还会选择
主动逃跑。如何模拟这些行为逻辑,目前游戏业已经有一些比较成熟的方法。
1 随机寻路算法
随机寻路算法适合模拟游戏中那些没有什么头脑的生物,它们总是在场
景中漫无目的地走来走去。可以用以下的代码进行模拟:
- npc_x_velocity = -5 + rand() %10;
- npc_y_velocity = -5 + rand() %10;
- int npc_move_count=0;
- while(++npc_move_count<num){
- npc_x+ = npc_x_velocity;
- npc_y+ = npc_y_velocity;
- } //end while
在上例中,N P C 会选取一个随机方向和速率运动一会儿,然后再选
取另一个。当然,还可以加上更多的随机性,如,改变运动方向的时
间不是固定的n u m个周期,或者更倾向于朝某个方向等。实际编程
中还必须考虑到碰撞检测,当NPC 遇到障碍物后,会随机选取一个前
进的方向,继续行走。
2 跟踪算法
当游戏中的主角进入到NPC 的“警戒区域”后,游戏的A I 可轻易获得
目标的位置,然后控制N P C 对象移向被跟踪的对象。跟踪算法可以
模拟这一行为:
- void Bat_AI(void)
- {
- if(ghost.x > bat.x)
- bat.x++;
- else
- if(ghost.x < bat.x)
- bat.x--;
- if(ghost.y > bat.y)
- bat.y++;
- else
- if(ghost.y < bat.y)
- bat.y--;
- //其他代码
- } // end Bat_AI
这段代码放到程序中实际运行时不难发现,N P C会迅速地追踪到目
标。这种跟踪非常精确,但是在游戏中过于精确却不一定是一件好事,
因为这会使N P C的行为看上去显得有点假。一种更自然的跟踪方式
是使跟踪者的方向矢量与从跟踪目标的中心到跟踪者的中心所定义的
方向矢量靠拢。
这个算法可以这样设计:假设AI 控制的对象称作跟踪者(tracker)
并有以下属性:
- Position:(tracker.x,tracker.y)
- Velocity:(tracker.xv,tracker.yv)
被跟踪对象称作跟踪目标(target),有如下属性:
- Position:(target.x,target.y)
- Velocity:(target.xv,target.yv)
基于上面的定义,下面是调整跟踪者的速度向量的常用逻辑循环:
1)计算从跟踪者到跟踪目标的向量:TV = (target.x -tracker.x, target.y-tracker.y) = (tvx, tvy)
,
规格化TV——也就是说 (tvx, tvy)/ Vector_Length(tvx,tvy)
使得
最大长度为1.0,记其为TV*
。记住Vector_Length()
只是计算从原点
(0,0)开始的矢量长度。
2)调整跟踪者当前的速度向量,加上一个按rate比例缩放过的TV*
:
- tracker.x += rate*tvx;
- tracker.y += rate*tvy;
注意:当rate >1.0
时,跟踪向量会合得更快,跟踪算法对目标跟踪
得更紧密,并更快地修正目标的运动。
3)跟踪者的速度向量修改过之后,有可能向量的速度会溢出最大值,
就是说,跟踪者一旦锁定了目标的方向,就会继续沿着该方向加速。
所以,需要设置一个上界,让跟踪者的速度从某处慢下来。可做如下改进:
- tspeed = Vector_Length(tracker.xv, tracker.yv);
- if(tspeed>max_SPEED){
- tracker.xv*=0.7;
- tracker.yv*=0.7;
- }
也可以选择其它的边界值0.5 或0.9 等均可。如果追求完美,甚至可以
计算出确切的溢出,并从向量中缩去相应的数量。追踪过程中同样也会
遇到障碍物,因此,碰撞检测是必不可少的。程序员可以根据不同
的游戏类型设计碰撞后的行为逻辑。
3 闪避算法
这个技术是让游戏的N P C 能避开玩家角色的追击,跟前面的跟踪代码
很相似,跟踪算法的对立面就是闪避算法,只要把上例中的等式翻转
,闪避算法就成了,下面是转换后的代码:]
- if(ghost.x > bat.x)
- bat.x--;
- else
- if(ghost.x < bat.x)
- bat.x++;
- if(ghost.y > bat.y)
- bat.y--;
- else
- if(ghost.y < bat.y)
- bat.y++;
- ......
以上介绍的3 个算法可以模拟NPC 的一些简单的寻路、跟踪和闪避行为,
在小游戏中会经常用到。但是,在较大型的游戏中使用这样简单的算法就
会大大影响游戏效果了。因此,大型游戏的人工智能算法都较复杂。
内容节选自《游戏编程中的寻路算法研究》
可以看看《AI for Game Developers》这本书:
·使用基于势函数的单一技术处理追赶、躲避、聚集和避障等问题。
·使用包括路径点和经典a*算法解决寻径问题。
·利用ai脚本扩充ai引擎的功能,让设计者和玩家更好地设计和玩游戏。
·给你的游戏角色赋予基于规则的ai推理能力,包括模糊逻辑和有限状态机。
·使用概率分析和诸如贝叶斯推理的高级技术处理不确定性问题。