即时战略游戏中寻径

转载 2000年08月22日 08:54:00

即时战略游戏中寻径(Path-finding)算法的原理及实现技术

作者:沈璐

  前几年,我在学校上学时,经常与同学在宿舍里网络对战“红色警报”,玩多了也一直在探索象“红色警报”这类即时战略游戏背后隐藏的编程奥秘。最近,找到一段空闲时间,终于把以前的想法付诸实施,用VC写了一个即时战略游戏的雏形(执行程序在附件中,采用了本文介绍的算法)。在此把即时战略游戏中寻径(Path-finding)算法的原理及实现技术写给大家。

  想象一下,当你兴致勃勃地坐在电脑前,正指挥着屏幕上的千军万马时,突然发现那些坦克车一碰到障碍物便停止行动,你肯定会对它们的愚蠢行为大为不满。因此,在即时战略的计算机游戏中,都采用了实时的寻径算法为可移动物体(如:“红警”中的坦克、士兵)计算一条较为“聪明”的行走路线。

一、单个物体的寻径算法

  寻径算法中需要解决的最基本问题是避开障碍物。最容易实现的方法是(参见图1):

  1. 从起点到终点拉一条直线A
  2. 沿着直线A朝终点行进,一遇到障碍物便按顺时针方向绕着障碍物行走,直至碰到直线A
  3. 重复步骤2,便一定能最终达到目的地。

path01.gif (23374 bytes)

1

(注:红色圆点表示起点,蓝色圆点表示终点;黄色直线标记为A, 黑色直线标记为B, 红色直线标记为B)

  该算法计算出来的路径并不是最短的,有时候还会走出傻乎乎的路线,但速度很快,能在较低档次的PC机上满足游戏中实时的要求,“红警”中的寻径算法便是以此为基础的(在帝国时代中采用比较先进的A*算法,限于篇幅这儿就不作介绍了)。可以对上述算法作几点改进,使可移动物体的行走路线更趋合理。

  () 看图1,显然可移动物体应按沿逆时针方向绕障碍物走,而不该按顺时针方向去绕弯子。于是,当遇到障碍物时,首先要判断环绕方向。如果比起顺时针方向,逆时针方向行走能以更短的路径碰到直线A,那么选取逆时针方向绕着障碍物行走,反之亦然。

  () 尽量走直线路径,减少绕行路程。如图1所示,先按上述算法计算出行走路线B,然后当可移动物体在路线B上绕着障碍物行进时,每走一步便从当前位置向终点拉一条直线C,如果沿着直线C前进能与目前还未经过的行走路线B的某段相遇(中间没有障碍物),就终止绕行,直接按直线C行走至路线B,从而缩短了路途。

  () 当终点处于障碍物包围之中,可移动物体永远不可能到达终点,无论是按顺时针方向还是逆时针方向绕行都只能回到原地,无法行进了。对于这种情况的处理方式就是绕障碍物一周,选择离终点距离最近的地方停下来。

  本文的寻径算法在具体实现中主要涉及到直线和环绕障碍物路线的生成技术。直线的光栅化生成可以参考任何一本计算机图形学教材,这儿不再赘述。下面给出环绕障碍物路线的生成算法(以顺时针方向为例)

path02.gif (1122 bytes)

2

  1. 当环绕障碍物行走时,先要判断当前障碍物相对于可移动物体的方向,标记为整数i(见图2)。例如:障碍物在可移动物体的正右方,就记作方向5
  2. 接着可移动物体依次查看方向j = (i+n) mod 8 (n=1..7),直至发现方向j处无障碍物为止。若障碍物位于正上方(7),可移动物体首先看左上方向(0 = (7+1) mod 8)能否通过,如果不通就接着试左边方向(1 = (7+2) mod 8),还不行再依次按图上所示箭头试探其余几个方向,直至找到出口,并往该方向行走一步。若障碍物位于左下方(2),则依次按下方(3)、右下方(4)、右方(5)、右上方(6)、上方(7)、左上方(0)、左方(1)等七个方向查看是否有通路。至于障碍物相对于可移动物体的其他位置的处理,照此类推。
  3. 重复步骤12,便能完成顺时针环绕障碍物行走。该算法详细的伪语言描述见下,反复调用函数ClockwiseWalkOneStep即可顺时针绕障碍一周。

 

二、动态障碍物环境中的行走路径生成技术

  刚才描述的算法只适用于单个可移动物体在静止的障碍物环境中生成行走路径。然而在实际的即时战略游戏中,经常是一群坦克在一个动态的地图上纵横驰骋,不同的坦克在行走过程中相遇时互为障碍物,而且是可移动的障碍物.因此,必须对上面的算法作出修改使得物体在运动中避开可移动的障碍物.

  最直观的解决办法是,一碰到可移动的障碍物,马上重新计算行走路径,该方法的缺点是重复计算路径、耗时太多.其实,当某个物体碰撞到一个处于运动状态的可移动障碍物时,可以先等待一段时间,接着若发现可移动障碍物已挪开,就可以按原来的行走路径继续前进,从而节省了重复计算路径的时间;反之,若发现可移动障碍物仍在原地,就比较两者的优先级(预先为每一个行走物体分配一个优先级),优先级较低则继续等待,优先级高者立刻重新计算行走路径避开可移动的障碍物.显然,运用该方法可以减少很多重复计算,加快了执行速度.该算法伪语言描述见下:

path03.gif (2436 bytes)

3 可移动物体状态转换图

  上述算法中,可移动物体具有四种状态(见图3)StillnessRun、FindNewPath、Moving。在初始情况下,可移动物体处于Stillness状态。当接受指挥命令后,便进入FindNewPath状态。一旦计算出行走路径,可移动物体就置为Run状态。在Run状态下,从行走路径列表中取出下一步的坐标,若该坐标所示位置无障碍物,状态变迁为Moving,进行前后两步间的坐标插值,结束后又回到Run状态;若发现原先计算出来的行走路径已经不适用了,便从Run状态转为FindNewPath状态,等找到新路径后,再恢复至Run状态。最后,当到达终点时,可移动物体的状态为Stillness

  察看本算法的实际效果,请下载DEMO程序。

 

作者:
Email: uulushen@public1.sz.js.cn
通讯地址:江苏省苏州市干将东路704
邮政编码:
215000

游戏中的数学与物理(一)

游戏,玩起来很简单很随意,但是在真正的制作过程中,为了画面越逼真就需要越多的基础知识在里面,有物理、数学、算法等等。有一个好的基本功,对于做好游戏是非常重要的。...
  • wfenglinxu
  • wfenglinxu
  • 2015年07月02日 22:23
  • 617

游戏中几种概率设计

游戏中常见的4种概率设计 1、常规做法,直接配置概率,程序直接判定 2、在1的基础上,加个保底次数,当连续不发生的次数高于保底时,强制发生 3、设置基础概率,事件不发生概率翻倍 4、设置数组,将事件发...
  • poxiao8
  • poxiao8
  • 2016年12月08日 18:01
  • 1082

游戏中的ai设计

我们游戏开发中,很多时候会用到Ai,什么是Ai,就是智能。比如boss,他作为我们要击杀的对象,当我们去攻击它,他会攻击我们,并会释放技能,当他血量很弱少,有些怪物会发动狂暴,暴击等技能,来维护保持它...
  • a1026438521
  • a1026438521
  • 2017年05月22日 14:42
  • 260

漫谈游戏中的阴影技术(阴影技术比较)

http://blog.sina.com.cn/s/blog_55288aa20100e2fk.html 随着硬件的越来越高端化,各种以前可望而不可及的效果越来越多的应用到网络游戏里。本篇文章是介绍...
  • OnafioO
  • OnafioO
  • 2017年01月01日 12:06
  • 702

麻将游戏(广度优先搜索)

Description   在一种"麻将"游戏中,游戏是在一个有W*H格子的矩形平板上进行的。每个格子可以放置一个麻将牌,也可以不放(如图所示)。玩家的目标是将平板上的所有可通过一条路径相连的两张相...
  • chrisblogtk
  • chrisblogtk
  • 2016年04月08日 21:42
  • 832

游戏中的组件系统介绍

Evolve Your Hierarchy Refactoring Game Entities with Components Up until fairly recent years, ...
  • tcx19900712
  • tcx19900712
  • 2014年01月25日 15:03
  • 554

首个MMORPG手游服务器端AOI设计的一些思考

最近在做一个移动平台上的MMORPG项目,负责服务器的工作,第一次做这种类型的游戏服务器的开发,准备工作时必须的,综合网上的资料和自己的想法,总结了一下AOI的实现方式,从以下三个方面来谈谈。水平有限...
  • lwtbn1
  • lwtbn1
  • 2014年07月19日 15:29
  • 1558

Android逆向实例笔记—在so里对游戏的修改

这里还是利用鬼哥的提供的样本,天天消联盟 我们今天的任务是从so里面修改,对游戏的金币的修改...
  • qq_24349189
  • qq_24349189
  • 2016年10月30日 21:34
  • 1353

3D游戏中的数学运用

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:【119706192】本文链接地址: 3D游戏中的数学运用 【01】3D游戏数学简介 总导:...
  • asd237241291
  • asd237241291
  • 2013年01月18日 01:26
  • 3683

游戏中的设计模式——状态者模式

大家好,今天要为大家介绍的是游戏中常用的设计模式之状态者模式,这个模式常用于我们Unity3D中的状态机切换,接下来就来看看这个模式的实现 (⊙_⊙)! 状态者模式定义 每个对象都有其对应的状态...
  • qq_16885903
  • qq_16885903
  • 2016年09月27日 00:43
  • 118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:即时战略游戏中寻径
举报原因:
原因补充:

(最多只允许输入30个字)