游戏路径算法
游戏开发中的游戏AI算法优化技巧

游戏开发中的游戏AI算法优化技巧游戏开发是一个以人工智能(AI)为核心的领域。
游戏AI算法的优化对于游戏的玩法体验和游戏性能有着重要的影响。
本文将介绍一些游戏开发中的游戏AI算法优化技巧,帮助开发者创建更出色的游戏体验。
1. 路径规划算法优化路径规划是游戏AI中常用的算法之一。
优化路径规划算法可以提高NPC(非玩家角色)在游戏世界中的行动效率和智能。
其中一种优化路径规划算法的技巧是使用A*算法。
A*算法结合了广度优先搜索和启发式搜索,可以更高效地找到最短路径。
开发者可以通过调整启发式函数的权重来优化A*算法的性能,以解决一些复杂的路径规划问题。
2. 决策树算法优化决策树是游戏AI中常用的算法之一,用于NPC进行决策。
优化决策树算法可以提高NPC的反应速度和决策智能。
一种优化决策树算法的技巧是使用剪枝策略。
通过剪枝可以减少决策树的分支数目,加快决策的过程。
此外,开发者还可以通过调整决策树的权重,使NPC更加智能地进行决策。
3. 机器学习算法优化机器学习算法在游戏开发中有广泛应用,可以用于NPC的学习和行为预测。
优化机器学习算法可以提高NPC 在游戏中的学习效果和智能行为。
一种优化机器学习算法的技巧是增加数据集的多样性。
通过增加不同类型的训练样本,可以提高机器学习算法的泛化能力,使NPC能够在更多情况下做出准确的预测和决策。
4. 虚拟现实中的视觉感知算法优化虚拟现实(VR)游戏中的视觉感知算法是游戏AI优化的关键。
优化视觉感知算法可以提高NPC在VR环境中的交互和感知效果。
一种优化视觉感知算法的技巧是减少计算量。
由于VR游戏对计算资源的要求较高,开发者可以使用一些优化手段,如图像压缩、算法并行化等,以提高算法的效率和实时性。
5. 强化学习算法优化强化学习算法用于训练NPC在游戏中进行优化策略的学习。
优化强化学习算法可以提高NPC学习和适应能力。
一种优化强化学习算法的技巧是使用经验回放机制。
经验回放机制可以让NPC从过去的经验中学习,提高学习效率和行为策略的准确性。
游戏中路径搜索算法研究

置被 探索 到而这 个位 置| 是 目标 时 , 算 法结 束 ; 除好 A 否则 , 将为进 一步搜 索 记 录这个 位 置的所有 相邻 位 它 置 J 。地 图上 的每个 节点 都 有 3个重 要 的属性 , 分别
为 F G和 H分 , 索 算 法 不 仅影 响游 戏 的性 能 , 搜 同时 对
游戏 的真 实性 也 有 很 重要 的影 响 。随 着硬 件 水 平 的 快 速提 高 , 游戏 开发 中对 游戏 的真 实性 的重 视 程度 也
从该 节点 到 目标 节 点估 计 代 价 , F是 G和 H 的 和 , 它 代表 对这 条经过 节 点 的路 径 最好 的猜 测和估 计 , 因此
( 西南大学计 算机 与信息科 学学院, 重庆 4 0 1 ) 0 75
摘要: 路径搜 索是 游戏 中非常重要 的一部分 , 算法是 最常用的搜 索算 法, 是使 用 A‘ 法搜 索 出的路径 的真 实性 常 A 但 算
常不能让人满意。本文介 绍 A 搜 索算 法及存在 的路径 问题 , 对该算 法在 游戏 中暴 露的 问题 , 出一种 平滑改进 的算 针 提
( ) P为起 始节 点 。 1令 ( ) F, 2 把 G和 H 的 值赋 给 P 。 ( ) P添 加到 O e 中 , 时 P是 O e 中 3把 p n表 此 p n表 的唯一 的节 点 。
究, 同时也取得了很多的成果。文献 [ ] 1 主要研究搜 索的效率 , 提出了二叉 堆的概念 ; 文献 [ ] 路径平 2对 滑 进行 了一 定 的研 究 , 是 在 游 戏 中并 不适 用 , 有 但 没 考 虑游 戏 本 身 的特 点 。本 文 着 重 研 究 A 算 法 在 游 戏 中存在的路线真实性 问题 , 同时提 出一种改 进算
游戏寻路算法的简单实现

游戏寻路算法的简单实现提到寻路算法,⼤家都会想到A*算法。
A*算法总结(Summary of the A* Method)Ok ,现在你已经看完了整个的介绍,现在我们把所有步骤放在⼀起: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. 保存路径。
从终点开始,每个⽅格沿着⽗节点移动直⾄起点,这就是你的路径。
我按照这个思路中的总结,写了⼀个算法出来,开启列表和关闭列表是基于stl来实现的。
⼤概10000*10000的地图,寻路寻下来,要⽤30秒的时间,汗颜,如果⽐较复杂的地形,要⽤1分多钟。
最后我⾃⼰对我⾃⼰的代码做了⼀个总结,发现主要慢的地⽅是这⼏个步骤:a. 遍历 open list ,查找 F 值最⼩的节点,把它作为当前要处理的节点。
实际上这个步骤,是为了直接对路径进⾏排序,如果不这么做,最终的路径,很可能会出现很多重复来回⾛的路,但是,这个BUG是可以在最终筛选节点的时候在来处理的,最终筛选的时候来处理的效率要⽐在寻路算法中直接搜索效率得多,如果你是游戏开发程序员,那么你的算法不得不这么做,使⽤⼆叉堆来搞这个步骤会⽐较快,或者你先实现短距离最佳路径,在使⽤远距离寻路时⽤短距离的⾛路函数配合最后筛选的⽅式也可以实现寻路,如果你是游戏外挂作者,你就可以不排序,⽽最后来筛选。
游戏开发中经常用到的算法详解

游戏开发中经常用到的算法详解作为游戏开发人员,算法是我们必须掌握的技能之一。
无论是小型独立游戏还是大型 AAA 游戏,算法都扮演了至关重要的角色。
在这篇文章中,我将为大家详细介绍游戏开发中经常用到的算法,帮助大家深入掌握游戏开发的核心技术。
一、碰撞检测算法碰撞检测算法是游戏开发中常用的一种算法,它可以判断两个物体是否相互接触。
在游戏中,我们需要不断地检测物体之间的碰撞,以保证游戏场景的正常运作。
最常用的碰撞检测算法包括了 AABB 碰撞检测算法、圆形碰撞检测算法、多边形碰撞检测算法等。
其中,AABB 碰撞检测算法是最简单的一种算法,它通过对物体的包围盒进行检测来判断物体是否相互接触。
如果两个物体的包围盒相交,那么这两个物体就存在碰撞。
圆形碰撞检测算法则是通过计算两个圆心之间的距离来判断两个圆形是否相交。
多边形碰撞检测算法则是通过计算两个多边形边之间的相对位置来判断两个多边形是否相交。
二、路径搜索算法路径搜索算法是游戏中常用的一种算法,它可以帮助我们找到两个地点之间最短的路径。
在游戏中,我们经常需要让角色沿着特定的路径移动,这时就需要使用到路径搜索算法。
最常用的路径搜索算法包括了 A* 算法、Dijkstra 算法等。
其中,A* 算法比较常用,它采用启发式函数来估算当前节点到目标节点的距离,以此来选择下一个要遍历的节点。
三、随机数生成算法在游戏开发中,我们经常需要生成随机数来实现一些功能,比如道具掉落、怪物生成、随机地图等。
随机数生成算法是这种情况下必不可少的。
目前常用的随机数生成算法包括了 Linear Congruential Generator(线性同余法)、Mersenne Twister 等。
其中,Mersenne Twister 算法是目前被广泛使用和认可的一种算法,它有着优秀的随机性和均匀性。
同时,需要注意的是,在游戏中使用随机数时,我们需要遵循一定的规则,以保证游戏的可玩性和公平性。
计算机游戏算法设计与优化

计算机游戏算法设计与优化随着计算机技术的不断进步,计算机游戏已经成为人们休闲娱乐的重要方式。
而游戏算法的设计和优化是游戏开发过程中极其重要的环节。
游戏算法是指为了游戏实现而设计的算法,这些算法在游戏过程中具有不同的功能和作用,比如路径寻找算法、物理引擎算法、动画算法等等。
设计和优化好的游戏算法能够提高游戏的质量和用户体验。
1. 路径寻找算法路径寻找算法是指在游戏中寻找到一条最短的路径,让游戏中的角色能够到达目的地。
通常使用的算法是 A* 算法,它是一种启发式搜索算法。
A* 算法通过计算每个节点的启发式函数值来选择下一个节点,从而寻找到目标节点。
优化路径寻找算法的方法有很多,其中一种方法是空间分割算法。
我们可以将游戏地图分割成一个个小区域,并且记录每个区域的通路信息,这样能够减少路径搜索的复杂度,提高算法效率。
2. 物理引擎算法物理引擎算法用于模拟游戏世界中的物理规律,使物体能够在游戏中表现出现实世界的物理特性。
常见的物理引擎算法有牛顿运动学算法、欧拉运动学算法、基于约束力的物理引擎。
在游戏中,基于约束力的物理引擎更加常见。
这种物理引擎基于牛顿第二定律,模拟物体之间的约束力,计算物体的加速度和速度,最终确定物体的位置。
优化物理引擎算法的方法有多种,比如运用多线程、优化约束处理算法等等。
3. 动画算法动画算法用于展示游戏中的动画效果。
常见的动画算法有关键帧动画、物理动画、骨骼动画等。
关键帧动画算法是最早应用于计算机动画领域的算法之一。
它通过为每个关键帧设置动画效果,自动计算中间的帧数和动画路径,从而生成连续的动画效果。
物理动画算法是模拟现实世界的物理规律来实现动画效果的一种算法,常见的有布料动画、流体动画等。
骨骼动画算法是将模型的变形控制与骨骼关节相结合的一种动画算法。
它通过修改骨骼关节的姿势,从而达到变换模型的效果。
优化动画算法的方法有很多,例如减少骨骼数量、优化动画过渡等。
总结游戏算法的设计和优化是游戏开发过程中十分重要的环节。
y迷宫计算公式

y迷宫计算公式迷宫是一种常见的谜题游戏,游戏的目标是通过解密、找线路等方法,尽可能快地从起点到达终点。
在解决迷宫的过程中,一些推理和计算技巧也可以帮助玩家更快地进入角色并完成游戏。
在这篇文章中,我们将介绍一些y迷宫的计算公式,希望能对在迷宫游戏中遇到瓶颈的玩家有所帮助。
1. y迷宫的定义y迷宫有多个入口和多个出口,通过这些入口和出口,构成了一些相交的通道。
每个通道都会有一个或多个分叉,通道之间的连接则呈现出y字形的结构,这也是y迷宫的名字来源。
y迷宫是一种比较复杂的迷宫,因为它有多个入口和多个出口,这使得它相对于其他迷宫更加难以解决。
对于想要解决y迷宫的玩家来说,他们需要一些有效的计算公式帮助他们避免繁琐的操作,从而快速地解决问题。
2. 最短路径算法在y迷宫中,最短路径算法是一种最常见的计算公式。
这个公式确定了每个入口到每个出口的最短路径。
它通常通过将y迷宫分成可走和不可走的两部分来实现。
在该算法中,地图会被转换成多个节点,然后采用广度优先搜索或Dijkstra算法来找到两点之间的最短路径。
用最短路径算法来解决y迷宫有以下步骤:1) 用图标记每一个交叉点和转角,这些交叉点和转角都是节点。
2) 用每一个交叉点和转角来创建一个图。
3) 找到每个节点到连接的节点的最短路径。
4) 当所有的路径都被找到时,玩家可以按照路径走到终点。
当然在实际操作中,最短路径算法比较复杂且需要消耗大量的计算资源,但是对于一些复杂的y迷宫来说,它仍然是一种有效的计算公式。
3. A* 算法A* 算法是一种基于最短路径算法的改进。
它使用一种称为启发函数的技术来计算两点之间的最短路径。
这个算法通过评估每个节点对目标的距离来判断哪些方案更加可行。
A*算法的计算公式可以写为:f(n) = g(n) + h(n)其中f(n)表示节点n的总估计成本,g(n) 表示从起点到节点n 的实际成本,h(n)表示从节点n到目标节点的估计成本。
通过比较f(n) 的值,玩家就能决定哪条路线更加高效。
recast 寻路原理

recast 寻路原理Recast寻路原理一、引言寻路算法是游戏开发中常用的算法之一,用于计算游戏角色在地图中找到最佳路径。
Recast是一种基于网格的寻路算法,具有高效、准确、可扩展的特点。
本文将详细介绍Recast寻路原理及其应用。
二、Recast寻路原理1. 地图建立Recast首先需要根据游戏地图构建三维网格,并将地图中的障碍物标记为不可行走区域。
通过对地图的采样和分析,Recast能够生成准确的地图数据,用于后续的寻路计算。
2. 寻路计算Recast使用A*算法进行寻路计算。
A*算法是一种常用的启发式搜索算法,通过评估节点的启发式值来选择下一步的行动。
Recast根据地图上的节点和连接关系,计算出从起点到终点的最佳路径。
3. 路径平滑Recast计算出的路径通常会包含许多离散的节点,为了使角色移动更加流畅,需要对路径进行平滑处理。
Recast通过引入Bezier曲线和距离检测等技术,对路径进行平滑处理,使得路径更加符合角色的移动特性。
4. 动态更新在游戏中,地图上的障碍物可能会发生变化,需要对路径进行动态更新。
Recast提供了动态更新的功能,可以在障碍物发生变化时,快速重新计算最佳路径。
三、Recast寻路的应用Recast寻路算法被广泛应用于各种类型的游戏中,包括角色扮演游戏、即时战略游戏等。
Recast的高效性能和准确性使得游戏角色能够在复杂的地图中快速找到最佳路径,增强了游戏的可玩性和真实感。
四、Recast寻路的优势1. 高效性能:Recast采用了高效的寻路算法,能够在复杂的地图中快速计算最佳路径,提高了游戏的运行效率。
2. 准确性:Recast通过精确的地图数据和启发式搜索算法,能够计算出最优的路径,使得游戏角色移动更加自然和流畅。
3. 可扩展性:Recast支持动态更新,能够在地图障碍物变化时快速重新计算路径,适应不同的游戏场景和需求。
五、总结Recast寻路算法是一种高效、准确、可扩展的基于网格的寻路算法。
游戏开发中一种新的高效寻路算法——B *寻路算法

算 法 过 程 1.起始 ,探 索节点为 自由非 爬绕
节 点 ,从 原 点 出发 , 向 目标 点 前进 。 2.判 断 前 面 是 否 为 障 碍 : 不 是 障
碍 , 向 目标 前 进 一格 ,仍 为 自由 非爬 绕 节 点 ;是 障 碍 , 沿 障碍 分 叉 为左 右 两 个 分 支 ,从 两 个 方 向分 别 试 图绕 过 障 碍 , 这 两个 分 支节 点 即成 为爬 绕 探 索节 点 。
45747 40884 43315
132 159 126 142 581
134 133 130 131 630
84276 80890 82583
图6 A 基本 算法 一无 阻挡
图7 算 法一无阻 挡
B击算 法 与A 算 法 的 性 能 比 较
为 了 全 面 比 较 B 算 法 与 A 算 法 在 性 能 上 的 关 系 ,我 对 A 算 法 进 行 了 方 向 上 的 优 化 , 使 A 在 简 单 地 图 上 更 加 高 效 , 且 寻 找 路 径 更 为 平 滑 , 而 不 是 简单地走 出所谓直 角三 角形 。
图2 遇 到障碍 分 叉为两 个分支
点为 自由的 ,从 原点 朝着 目标前 进 , 当遇 到 障 碍 时 , 沿 着 障 碍 分 叉 为 左 右 两 个 分 支 , 每 个 分 支 分 别 构 成 一 个 爬 绕 的探索节 点 ,试 图绕过 障碍 ,绕过 障碍后 ,爬绕 节点又 变 为 自由节 点 向 目标 前 进 , 此 过 程 迭 代 进 行 , 直 到 到 达 目标 寻 路 成 功 或 探 索 节 点 消 失 表 明 没 有 可达 路 径 。
图3 爬绕节点绕过阻挡,又成为 自由节点
算 法描 述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A*寻路初探译者序:很久以前就知道了A*算法,但是从未认真读过相关的文章,也没有看过代码,只是脑子里有个模糊的概念。
这次决定从头开始,研究一下这个被人推崇备至的简单方法,作为学习人工智能的开始。
这篇文章非常知名,国内应该有不少人翻译过它,我没有查找,觉得翻译本身也是对自身英文水平的锻炼。
经过努力,终于完成了文档,也明白的A*算法的原理。
毫无疑问,作者用形象的描述,简洁诙谐的语言由浅入深的讲述了这一神奇的算法,相信每个读过的人都会对此有所认识(如果没有,那就是偶的翻译太差了--b)。
原文链接:/reference/articles/article2003.asp 以下是翻译的正文。
(由于本人使用ultraedit编辑,所以没有对原文中的各种链接加以处理(除了图表),也是为了避免未经许可链接的嫌疑,有兴趣的读者可以参考原文。
会者不难,A*(念作A星)算法对初学者来说的确有些难度。
这篇文章并不试图对这个话题作权威的陈述。
取而代之的是,它只是描述算法的原理,使你可以在进一步的阅读中理解其他相关的资料。
最后,这篇文章没有程序细节。
你尽可以用任意的计算机程序语言实现它。
如你所愿,我在文章的末尾包含了一个指向例子程序的链接。
压缩包包括C++和Blitz Basic两个语言的版本,如果你只是想看看它的运行效果,里面还包含了可执行文件。
我们正在提高自己。
让我们从头开始。
序:搜索区域假设有人想从A点移动到一墙之隔的B点,如下图,绿色的是起点A,红色是终点B,蓝色方块是中间的墙。
[图1]你首先注意到,搜索区域被我们划分成了方形网格。
像这样,简化搜索区域,是寻路的第一步。
这一方法把搜索区域简化成了一个二维数组。
数组的每一个元素是网格的一个方块,方块被标记为可通过的和不可通过的。
路径被描述为从A到B我们经过的方块的集合。
一旦路径被找到,我们的人就从一个方格的中心走向另一个,直到到达目的地。
这些中点被称为“节点”。
当你阅读其他的寻路资料时,你将经常会看到人们讨论节点。
为什么不把他们描述为方格呢?因为有可能你的路径被分割成其他不是方格的结构。
他们完全可以是矩形,六角形,或者其他任意形状。
节点能够被放置在形状的任意位置-可以在中心,或者沿着边界,或其他什么地方。
我们使用这种系统,无论如何,因为它是最简单的。
开始搜索正如我们处理上图网格的方法,一旦搜索区域被转化为容易处理的节点,下一步就是去引导一次找到最短路径的搜索。
在A*寻路算法中,我们通过从点A开始,检查相邻方格的方式,向外扩展直到找到目标。
我们做如下操作开始搜索:1,从点A开始,并且把它作为待处理点存入一个“开启列表”。
开启列表就像一张购物清单。
尽管现在列表里只有一个元素,但以后就会多起来。
你的路径可能会通过它包含的方格,也可能不会。
基本上,这是一个待检查方格的列表。
2,寻找起点周围所有可到达或者可通过的方格,跳过有墙,水,或其他无法通过地形的方格。
也把他们加入开启列表。
为所有这些方格保存点A作为“父方格”。
当我们想描述路径的时候,父方格的资料是十分重要的。
后面会解释它的具体用途。
3,从开启列表中删除点A,把它加入到一个“关闭列表”,列表中保存所有不需要再次检查的方格。
在这一点,你应该形成如图的结构。
在图中,暗绿色方格是你起始方格的中心。
它被用浅蓝色描边,以表示它被加入到关闭列表中了。
所有的相邻格现在都在开启列表中,它们被用浅绿色描边。
每个方格都有一个灰色指针反指他们的父方格,也就是开始的方格。
[图2]接着,我们选择开启列表中的临近方格,大致重复前面的过程,如下。
但是,哪个方格是我们要选择的呢?是那个F值最低的。
路径评分选择路径中经过哪个方格的关键是下面这个等式:F =G + H这里:* G = 从起点A,沿着产生的路径,移动到网格上指定方格的移动耗费。
* H = 从网格上那个方格移动到终点B的预估移动耗费。
这经常被称为启发式的,可能会让你有点迷惑。
这样叫的原因是因为它只是个猜测。
我们没办法事先知道路径的长度,因为路上可能存在各种障碍(墙,水,等等)。
虽然本文只提供了一种计算H的方法,但是你可以在网上找到很多其他的方法。
我们的路径是通过反复遍历开启列表并且选择具有最低F值的方格来生成的。
文章将对这个过程做更详细的描述。
首先,我们更深入的看看如何计算这个方程。
正如上面所说,G表示沿路径从起点到当前点的移动耗费。
在这个例子里,我们令水平或者垂直移动的耗费为10,对角线方向耗费为14。
我们取这些值是因为沿对角线的距离是沿水平或垂直移动耗费的的根号2(别怕),或者约1.414倍。
为了简化,我们用10和14近似。
比例基本正确,同时我们避免了求根运算和小数。
这不是只因为我们怕麻烦或者不喜欢数学。
使用这样的整数对计算机来说也更快捷。
你不就就会发现,如果你不使用这些简化方法,寻路会变得很慢。
既然我们在计算沿特定路径通往某个方格的G值,求值的方法就是取它父节点的G值,然后依照它相对父节点是对角线方向或者直角方向(非对角线),分别增加14和10。
例子中这个方法的需求会变得更多,因为我们从起点方格以外获取了不止一个方格。
H值可以用不同的方法估算。
我们这里使用的方法被称为曼哈顿方法,它计算从当前格到目的格之间水平和垂直的方格的数量总和,忽略对角线方向。
然后把结果乘以10。
这被成为曼哈顿方法是因为它看起来像计算城市中从一个地方到另外一个地方的街区数,在那里你不能沿对角线方向穿过街区。
很重要的一点,我们忽略了一切障碍物。
这是对剩余距离的一个估算,而非实际值,这也是这一方法被称为启发式的原因。
想知道更多?你可以在这里找到方程和额外的注解。
F的值是G和H的和。
第一步搜索的结果可以在下面的图表中看到。
F,G和H的评分被写在每个方格里。
正如在紧挨起始格右侧的方格所表示的,F被打印在左上角,G在左下角,H则在右下角。
[图3]现在我们来看看这些方格。
写字母的方格里,G = 10。
这是因为它只在水平方向偏离起始格一个格距。
紧邻起始格的上方,下方和左边的方格的G值都等于10。
对角线方向的G值是14。
H值通过求解到红色目标格的曼哈顿距离得到,其中只在水平和垂直方向移动,并且忽略中间的墙。
用这种方法,起点右侧紧邻的方格离红色方格有3格距离,H值就是30。
这块方格上方的方格有4格距离(记住,只能在水平和垂直方向移动),H值是40。
你大致应该知道如何计算其他方格的H值了~。
每个格子的F值,还是简单的由G和H相加得到继续搜索为了继续搜索,我们简单的从开启列表中选择F值最低的方格。
然后,对选中的方格做如下处理:4,把它从开启列表中删除,然后添加到关闭列表中。
5,检查所有相邻格子。
跳过那些已经在关闭列表中的或者不可通过的(有墙,水的地形,或者其他无法通过的地形),把他们添加进开启列表,如果他们还不在里面的话。
把选中的方格作为新的方格的父节点。
6,如果某个相邻格已经在开启列表里了,检查现在的这条路径是否更好。
换句话说,检查如果我们用新的路径到达它的话,G值是否会更低一些。
如果不是,那就什么都不做。
另一方面,如果新的G值更低,那就把相邻方格的父节点改为目前选中的方格(在上面的图表中,把箭头的方向改为指向这个方格)。
最后,重新计算F 和G的值。
如果这看起来不够清晰,你可以看下面的图示。
好了,让我们看看它是怎么运作的。
我们最初的9格方格中,在起点被切换到关闭列表中后,还剩8格留在开启列表中。
这里面,F值最低的那个是起始格右侧紧邻的格子,它的F值是40。
因此我们选择这一格作为下一个要处理的方格。
在紧随的图中,它被用蓝色突出显示。
[图4]首先,我们把它从开启列表中取出,放入关闭列表(这就是他被蓝色突出显示的原因)。
然后我们检查相邻的格子。
哦,右侧的格子是墙,所以我们略过。
左侧的格子是起始格。
它在关闭列表里,所以我们也跳过它。
其他4格已经在开启列表里了,于是我们检查G值来判定,如果通过这一格到达那里,路径是否更好。
我们来看选中格子下面的方格。
它的G值是14。
如果我们从当前格移动到那里,G值就会等于20(到达当前格的G值是10,移动到上面的格子将使得G值增加10)。
因为G值20大于14,所以这不是更好的路径。
如果你看图,就能理解。
与其通过先水平移动一格,再垂直移动一格,还不如直接沿对角线方向移动一格来得简单。
当我们对已经存在于开启列表中的4个临近格重复这一过程的时候,我们发现没有一条路径可以通过使用当前格子得到改善,所以我们不做任何改变。
既然我们已经检查过了所有邻近格,那么就可以移动到下一格了。
于是我们检索开启列表,现在里面只有7格了,我们仍然选择其中F值最低的。
有趣的是,这次,有两个格子的数值都是54。
我们如何选择?这并不麻烦。
从速度上考虑,选择最后添加进列表的格子会更快捷。
这种导致了寻路过程中,在靠近目标的时候,优先使用新找到的格子的偏好。
但这无关紧要。
(对相同数值的不同对待,导致不同版本的A*算法找到等长的不同路径。
)那我们就选择起始格右下方的格子,如图。
[图5]这次,当我们检查相邻格的时候,发现右侧是墙,于是略过。
上面一格也被略过。
我们也略过了墙下面的格子。
为什么呢?因为你不能在不穿越墙角的情况下直接到达那个格子。
你的确需要先往下走然后到达那一格,按部就班的走过那个拐角。
(注解:穿越拐角的规则是可选的。
它取决于你的节点是如何放置的。
)这样一来,就剩下了其他5格。
当前格下面的另外两个格子目前不在开启列表中,于是我们添加他们,并且把当前格指定为他们的父节点。
其余3格,两个已经在开启列表中(起始格,和当前格上方的格子,在表格中蓝色高亮显示),于是我们略过它们。
最后一格,在当前格的左侧,将被检查通过这条路径,G值是否更低。
不必担心,我们已经准备好检查开启列表中的下一格了。
我们重复这个过程,知道目标格被添加进开启列表,就如在下面的图中所看到的。
[图6]注意,起始格下方格子的父节点已经和前面不同的。
之前它的G值是28,并且指向右上方的格子。
现在它的G值是20,指向它上方的格子。
这在寻路过程中的某处发生,当应用新路径时,G值经过检查变得低了-于是父节点被重新指定,G和F值被重新计算。
尽管这一变化在这个例子中并不重要,在很多场合,这种变化会导致寻路结果的巨大变化。
那么,我们怎么确定这条路径呢?很简单,从红色的目标格开始,按箭头的方向朝父节点移动。
这最终会引导你回到起始格,这就是你的路径!看起来应该像图中那样。
从起始格A移动到目标格B只是简单的从每个格子(节点)的中点沿路径移动到下一个,直到你到达目标点。
就这么简单。
[图7]A*方法总结好,现在你已经看完了整个说明,让我们把每一步的操作写在一起:1,把起始格添加到开启列表。
2,重复如下的工作:a) 寻找开启列表中F值最低的格子。
我们称它为当前格。