翻出了一个文档,很久以前学习A*时做的一个小游戏,基于帧编程,没用OOP
游戏地址:http://www.3366.com/game/77446.shtml
简介:
开发环境:adobeflash cs 6
开发语言为as3.0
使用帧转跳技术开发。
所有类继承自MovieClip类
实体对象类
Star类 星星障碍对象类。
Charecter类 角色方块对象类。
Tile类 地形对象类。
界面相关类
LevelChoice类 关卡选择对象类。
ScoreBoard类 得分界面类。
游戏使用时间驱动
ENTER_FRAME 事件 每过一帧时间间隔,自动触发一个回调函数。
MouseEvent.CLICK 事件 响应鼠标点击,触发回调函数。
主要功能函数模块:
地图模块:
创建游戏地图
A*模块:
A*寻路算法实现寻路
行走模块:
通过A*模块返回的路径,驱动对象行走
界面模块:
处理界面的显示和帧的转跳
核心算法:
A*寻路算法:
A*是一种启发式的算法,所谓的"启发式",就是对每一个搜索的位置进行评估,也就是把找的位置离目标的距离当成找点的一个依据,然后猜测这个点是否最佳。
决定哪些方格会形成路径的关键是下面这个等式:
F = G + H
G=从起点A沿着已生成的路径到一个给定方格的移动开销。
H=从给定方格到目的方格的估计移动开销。这种方式常叫做试探。
1.
将开始节点放入开放列表(开始节点的F和G值都视为0);
2.
重复一下步骤:
i.
在开放列表中查找具有最小F值的节点,并把查找到的节点作为当前节点;
ii.
把当前节点从开放列表删除, 加入到封闭列表;
iii.
对当前节点相邻的每一个节点依次执行以下步骤:
1.
如果该相邻节点不可通行或者该相邻节点已经在封闭列表中,则什么操作也不执行,继续检验下一个节点;
2.
如果该相邻节点不在开放列表中,则将该节点添加到开放列表中,并将该相邻节点的父节点设为当前节点,同时保存该相邻节点的G和F值;
3.
如果该相邻节点在开放列表中, 则判断若经由当前节点到达该相邻节点的G值是否小于原来保存的G值,若小于,则将该相邻节点的父节点设为当前节点,并重新设置该相邻节点的G和F值.
iv.
循环结束条件:
当终点节点被加入到开放列表作为待检验节点时,表示路径被找到,此时应终止循环;
或者当开放列表为空,表明已无可以添加的新节点,而已检验的节点中没有终点节点则意味着路径无法被找到,此时也结束循环;
3.
从终点节点开始沿父节点遍历, 并保存整个遍历到的节点坐标,遍历所得的节点就是最后得到的路径;
注:以上关于A*算法的描述来源于来源于: GameDev.net作者: Patrick Lester翻译:孙璨