IT袋

当前位置:主页 > 经验教程 > 建站编程 >

游戏A星寻路算法教程详解

游戏A星寻路算法教程详解 a星寻路算法路径优化【新手必看】(3)

更新:2023-08-08 07:48:08 来源:IT袋 作者:马勇
导读:游戏A星寻路算法教程详解,注意:在起点下面2格的方格的父亲已经与前面不同了。之前它的G值是28并且指向它右上方的方格。现在它的G值为20,并且指向它正上方的方格。这在寻路

游戏A星寻路算法教程详解

游戏A星寻路算法教程详解

注意:在起点下面2格的方格的父亲已经与前面不同了。之前它的G值是28并且指向它右上方的方格。现在它的G值为20,并且指向它正上方的方格。这在寻路过程中的某处发生,使用新路径时G值经过检查并且变得更低,因此父节点被重新设置,G和F值被重新计算。尽管这一变化在本例中并不重要,但是在很多场合中,这种变化会导致寻路结果的巨大变化。

那么我们怎么样去确定实际路径呢?很简单,从终点开始,按着箭头向父节点移动,这样你就被带回到了起点,这就是你的路径。如下图所示。从起点A移动到终点B就是简单从路径上的一个方格的中心移动到另一个方格的中心,直至目标。就是这么简单!

游戏A星寻路算法教程详解

游戏A*自动寻路算法总结(Summary of the A* Method)

现在我们把所有步骤放在一起:

1、把起点加入open list。

2、重复如下过程:

a、遍历open list,查找F值最小的节点,把它作为当前要处理的节点。

b、把这个节点移到close list。

c、对当前方格的8个相邻方格的每一个方格?

◆ 如果它是不可抵达的或者它在close list中,忽略它。否则,做如下操作。

◆ 如果它不在open list中,把它加入open list,并且把当前方格设置为它的父亲,记录该方格的F,G和H值。

◆ 如果它已经在open list中,检查这条路径(即经由当前方格到达它那里)是否更好,用G值作参考。更小的G值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的G和F值。如果你的open list是按F值排序的话,改变后你可能需要重新排序。

d、停止,当你

◆ 把终点加入到了open list中,此时路径已经找到了,或者

◆ 查找终点失败,并且open list是空的,此时没有路径。

3、保存路径。从终点开始,每个方格沿着父节点移动直至起点,这就是你的路径。

题外话(Small Rant)

请原谅我的离题,当你在网上或论坛上看到各种关于A*算法的讨论时,你偶尔会发现一些A*的代码,实际上他们不是。要使用A*,你必须包含上面讨论的所有元素----尤其是open list,close list和路径代价G,H和F。也有很多其他的寻路算法,这些算法并不是A*算法,A*被认为是最好的。在本文末尾引用的一些文章中Bryan Stout讨论了他们的一部分,包括他们的优缺点。在某些时候你可以二中择一,但你必须明白自己在做什么。

实现的注解(Notes on Implemetation)

现在你已经明白了基本方法,这里是你在写自己的程序是需要考虑的一些额外的东西。

1、维护Open List:这是A*中最重要的部分。每次你访问Open list,你都要找出具有最小F值的方格。有几种做法可以做到这个。你可以随意保存路径元素,当你需要找到具有最小F值的方格时,遍历整个open list。这个很简单,但对于很长的路径会很慢。这个方法可以通过维护一个排好序的表来改进,每次当你需要找到具有最小F值的方格时,仅取出表的第一项即可。我写程序时,这是我用的第一个方法。

对于小地图,这可以很好的工作,但这不是最快的方案。追求速度的A*程序员使用了叫做二叉堆的东西,我的程序里也用了这个。以我的经验,这种方法在多数场合下会快2—3倍,对于更长的路径速度成几何级数增长(10倍甚至更快)。

2、其他单位:如果你碰巧很仔细的看了我的程序,你会注意到我完全忽略了其他单位。我的寻路者实际上可以互相穿越。这取决于游戏,也许可以,也许不可以。如果你想考虑其他单位,并想使他们移动时绕过彼此,我建议你的寻路程序忽略它们,再写一些新的程序来判断两个单位是否会发生碰撞。如果发生碰撞,你可以产生一个新的路径,或者是使用一些标准的运动法则(比如永远向右移动,等等)直至障碍物不在途中,然后产生一个新的路径。为什么在计算初始路径是不包括其他单位呢?因为其他单位是可以动的,当你到达的时候它们可能不在自己的位置上。这可以产生一些怪异的结果,一个单位突然转向来避免和一个已不存在的单位碰撞,在它的路径计算出来后和穿越它路径的那些单位碰撞了。

在寻路代码中忽略其他单位,意味着你必须写另一份代码来处理碰撞。这是游戏的细节。

3、一些速度方面的提示:如果你在开发自己的A*程序或者是改编我写的程序,最后你会发现寻路占用了大量的CPU时间,尤其是当你有相当多的寻路者和一块很大的地图时。如果你阅读过网上的资料,你会发现就算是开发星际争霸,帝国时代的专家也是这样。如果你发现事情由于寻路而变慢了,这里有些主意很不错:

◆ 使用小地图或者更少的寻路者。

◆ 千万不要同时给多个寻路者寻路。取而代之的是把它们放入队列中,分散到几个游戏周期中。如果你的游戏以每秒40周期的速度运行,没人能察觉到。但是如果同时有大量的寻路者在寻路的话,他们会马上就发现游戏慢下来了。

◆ 考虑在地图中使用更大的方格。这减少了寻路时需要搜索的方格数量。如果你是有雄心的话,你可以设计多套寻路方案,根据路径的长度而使用在不同场合。这也是专业人士的做法,对长路径使用大方格,当你接近目标时使用小方格。

◆ 对于很长的路径,考虑使用路径点系统,或者可以预先计算路径并加入游戏中。

◆ 预先处理你的地图,指出哪些区域是不可到达的。这些区域称为“孤岛”。实际上,他们可以是岛屿,或者是被墙壁等包围而不可到达的任意区域。A*的下限是,你告诉他搜寻通往哪些区域的路径时,他会搜索整个地图,直到所有可以抵达的方格都通过open list或close list得到了处理。这会浪费大量的CPU时间。这可以通过预先设定不可到达的区域来解决。在某种数组中记录这些信息,在寻路前检查它。在我的Blitz版程序中,我写了个地图预处理程序来完成这个。它可以提前识别寻路算法会忽略的死路径,这又进一步提高了速度。

4、不同的地形损耗:在这个教程和我的程序中,地形只有2种:可抵达的和不可抵达的。但是如果你有些可抵达的地形,移动代价会更高些,沼泽,山丘,地牢的楼梯

等都是可抵达的地形,但是移动代价比平地就要高。类似的,道路的移动代价就比 它周围的地形低。

在你计算给定方格的G值时加上地形的代价就很容易解决了这个问题。简单的给这些方格加上一些额外的代价就可以了。A*算法用来查找代价最低的路径,应该很容易处理这些。在我的简单例子中,地形只有可达和不可达两种,A*会搜寻最短和最直接的路径。但是在有地形代价的环境中,代价最低的的路径可能会很长。

就像沿着公路绕过沼泽而不是直接穿越它。

另一个需要考虑的是专家所谓的“influence Mapping”,就像上面描述的可变成本地形一样,你可以创建一个额外的计分系统,把它应用到寻路的AI中。假设你有这样一张地图,地图上由个通道穿过山丘,有大批的寻路者要通过这个通道,电脑每次产生一个通过那个通道的路径都会变得很拥挤。如果需要,你可以产生一个influence map,它惩罚那些会发生大屠杀的方格。这会让电脑选择更安全的路径,也可以帮助它避免因为路径短(当然也更危险)而持续把队伍或寻路者送往某一特定路径。

5、维护未探测的区域:你玩PC游戏的时候是否发现电脑总是能精确的选择路径,甚至地图都未被探测。对于游戏来说,寻路过于精确反而不真实。幸运的是,这个问题很容易修正。答案就是为每个玩家和电脑(每个玩家,不是每个单位---那会浪费很多内存)创建一个独立的knownWalkability数组。每个数组包含了玩家已经探测的区域的信息,和假设是可到达的其他区域,直到被证实。使用这种方法,单位会在路的死端徘徊,并会做出错误的选择,直到在它周围找到了路径。地图一旦被探测了,寻路又向平常一样工作。

6、平滑路径:A*自动给你花费最小的,最短的路径,但它不会自动给你最平滑的路径。在这条路径上,第一步在起点的右下方,如果第一步在起点的正下方是不是路径会更平滑呢?

有几个方法解决这个问题。在你计算路径时,你可以惩罚那些改变方向的方格,把它的G值增加一个额外的开销。另一种选择是,你可以遍历你生成的路径,查找那些用相邻的方格替代会使路径更平滑的地方。

7、非方形搜索区域:在我们的例子中,我们使用都是2D的方形的区域。你可以使用不规则的区域。想想冒险游戏中的那些国家,你可以设计一个像那样的寻路关卡。你需要建立一张表格来保存国家相邻关系,以及从一个国家移动到另一个国家的G值。你还需要一个方法了估算H值。其他的都可以向上面的例子一样处理。当你向open list添加新项时,不是使用相邻的方格,而是查看表里相邻的国家。

类似的,你可以为一张固定地形的地图的路径建立路径点系统。路径点通常是道路或地牢通道的转折点。作为游戏设计者,你可以预先设定路径点。如果两个路径点的连线没有障碍物的话它们被视为相邻的。在冒险游戏的例子中,你可以保存这些相邻信息在某种表中,当open list增加新项时使用。然后记录G值(可能用两个结点间的直线距离)和H值(可能使用从节点到目标的直线距离)。其它的都想往常一样处理。

以上IT袋网介绍的游戏A星寻路算法教程详解 a星寻路算法路径优化【新手必看】的详细讲解,仅供大家参考建议!

相关阅读

  • 网站设计是什么工作 网页设计的工作岗位介绍

    网站设计是什么工作 网页设计的工作岗位介绍

    今天带来的IT技巧小经验网站设计是什么工作和网页设计的工作岗位介绍IT技巧方面的经验,具体详情如下: 网页设计师是一种专业人员,他们负责为网站或应用程序设计用户界面和视觉元素。

  • 二级域名怎么注册 二级域名注册平台及流程

    二级域名怎么注册 二级域名注册平台及流程

    今天带来的IT技巧小经验二级域名怎么注册和二级域名注册平台及流程的介绍,接下来小编为网友介绍。 什么是二级域名? 按照严格的标准来划分,顶级域名的下一级才是二级域名。其中顶级

  • 注册域名的网站有哪些 网上注册平台介绍

    注册域名的网站有哪些 网上注册平台介绍

    跟大家分享注册域名的网站有哪些和网上注册平台介绍的相关经验,相关内容具体如下: 很多客户在做网站之前知道自己需要一个网址,但是却不知道怎么注册域名,在哪里注册域名,那个域

  • 如何创建一个网页前端 web创建一个简单网页教程

    如何创建一个网页前端 web创建一个简单网页教程

    IT电脑小知识篇,关于如何创建一个网页前端和web创建一个简单网页教程的相关知识,接下来就是全面介绍。 首先我要说学习前端网页制作其实很简单! 今天我带着你踏入前端开发的大门,我