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*的算法就集中在下面的伪代码上了,不过具体实现起来还是要花很多功夫的。

 

把起始节点加进openlist
while openlist不为空{
    当前节点的=openlist 中成本最低的节点
    if 当前节点==目标节点 then
        路径完成
    else
        把当前节点移入closelist
        检查当前节点的每个相邻节点
        for 每个相邻节点
             if 该节点不在 openlist 中
                and 该节点不是障碍物
      and   该节点不在closed List中
                and   该节点不在边界外
             将该节点移入 openlist并计算其成本
}

 

 

参考资料:

《游戏中的人工智能》

GameRes http://gameres.com/

《ActionScript3.0 游戏开发实例》此书关于A*算法的说明极其马虎,我看了很久都不得其法。不过代码实例倒是挺不错。

posted @ 2010-09-17 22:19  橡树小屋  阅读(1182)  评论(0编辑  收藏  举报
追逐梦想,永不停息