前几年,我在学校上学时,经常与同学在宿舍里网络对战“红色警报”,玩多了也一直在探索象“红色警报”这类即时战略游戏背后隐藏的编程奥秘。最近,找到一段空闲时间,终于把以前的想法付诸实施,用VC写了一个即时战略游戏的雏形(执行程序在附件中,采用了本文介绍的算法)。在此把即时战略游戏中寻径(Path-finding)算法的原理及实现技术写给大家。
想象一下,当你兴致勃勃地坐在电脑前,正指挥着屏幕上的千军万马时,突然发现那些坦克车一碰到障碍物便停止行动,你肯定会对它们的愚蠢行为大为不满。因此,在即时战略的计算机游戏中,都采用了实时的寻径算法为可移动物体(如:“红警”中的坦克、士兵)计算一条较为“聪明”的行走路线。
一、单个物体的寻径算法
寻径算法中需要解决的最基本问题是避开障碍物。最容易实现的方法是(参见图1):
-
- 从起点到终点拉一条直线A。
- 沿着直线A朝终点行进,一遇到障碍物便按顺时针方向绕着障碍物行走,直至碰到直线A。
- 重复步骤2,便一定能最终达到目的地。
图 1
(注:红色圆点表示起点,蓝色圆点表示终点;黄色直线标记为A, 黑色直线标记为B, 红色直线标记为B)
该算法计算出来的路径并不是最短的,有时候还会走出傻乎乎的路线,但速度很快,能在较低档次的PC机上满足游戏中实时的要求,“红警”中的寻径算法便是以此为基础的(在帝国时代中采用比较先进的A*算法,限于篇幅这儿就不作介绍了)。可以对上述算法作几点改进,使可移动物体的行走路线更趋合理。
(一) 看图1,显然可移动物体应按沿逆时针方向绕障碍物走,而不该按顺时针