zoukankan      html  css  js  c++  java
  • 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*算法的说明极其马虎,我看了很久都不得其法。不过代码实例倒是挺不错。

  • 相关阅读:
    短连接生成
    google 定位 标记 地址解码 逆解码
    Laravel 文件上传
    Laravel
    对接航信开票-在线二维码开票
    win 下 composer 安装
    对接美团外卖开放平台
    IOS 弹框在微信中导致输入框等失焦 偏移问题解决
    微信公众号-高德地图实例
    对接百度地图API 实现地址转经纬度
  • 原文地址:https://www.cnblogs.com/babyzone2004/p/1829615.html
Copyright © 2011-2022 走看看