A*算法的Actionscript3.0实例
【实例演示】
为了能看到每步的效果,我将每秒的帧数设置为6,调慢物体移动的速度,效果如上。本来A*算法的核心算法不是很复杂,但是实现起来的代码比想象中多了很多,而且很多细节没有能够一一测试,放个DEMO上来,以后要用到,再每个环节都调试一遍吧。其实有本电子书上有A*的例子,不过是在我敲完代码的时候才发现,杯具……!
关于A*算法的资料,可以参考
A*寻路初探 GameDev.net(http://data.gameres.com/message.asp?TopicID=25439)
【A*方法总结】
选择路径中经过哪个方格的关键是下面这个等式:
F = G + H
这里:
* G = 从起点A,沿着产生的路径,移动到网格上指定方格的移动耗费。
* H = 从网格上那个方格移动到终点B的预估移动耗费。这经常被称为启发式的,可能会让你有点迷惑。这样叫的原因是因为它只是个猜测。我们没办法事先知道路径的长度,因为路上可能存在各种障碍(墙,水,等等)。虽然本文只提供了一种计算H的方法,但是你可以在网上找到很多其他的方法。
让我们把每一步的操作写在一起:
1,把起始格添加到开启列表。
2,重复如下的工作:
a) 寻找开启列表中F值最低的格子。我们称它为当前格。
b) 把它切换到关闭列表。
c) 对相邻的8格中的每一个?
* 如果它不可通过或者已经在关闭列表中,略过它。反之如下。
* 如果它不在开启列表中,把它添加进去。把当前格作为这一格的父节点。记录这一格的F,G,和H值。
* 如果它已经在开启列表中,用G值为参考检查新的路径是否更好。更低的G值意味着更好的路径。如果是这样,就把这一格的父节点改成当前格,并且重新计算这一格的G和F值。如果你保持你的开启列表按F值排序,改变之后你可能需要重新对开启列表排序。(我在程序中省略此步骤)
d) 停止,当你
* 把目标格添加进了开启列表,这时候路径被找到,或者
* 没有找到目标格,开启列表已经空了。这时候,路径不存在。
3.保存路径。从目标格开始,沿着每一格的父节点移动直到回到起始格。这就是你的路径。
【伪代码】
基本上A*的算法就集中在下面的伪代码上了,不过具体实现起来还是要花很多功夫的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 把起始节点加进openlist while openlist不为空{ 当前节点的=openlist 中成本最低的节点 if 当前节点==目标节点 then 路径完成 else 把当前节点移入closelist 检查当前节点的每个相邻节点 for 每个相邻节点 if 该节点不在 openlist 中 and 该节点不是障碍物 and 该节点不在closed List中 and 该节点不在边界外 将该节点移入 openlist并计算其成本 } |
参考资料:
《游戏中的人工智能》
GameRes http://gameres.com/
《ActionScript3.0 游戏开发实例》此书关于A*算法的说明极其马虎,我看了很久都不得其法。不过代码实例倒是挺不错。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架