天天看点

A*寻路算法及在游戏中的应用 

翻出了一个文档,很久以前学习A*时做的一个小游戏,基于帧编程,没用OOP

游戏地址:http://www.3366.com/game/77446.shtml

简介:

A*寻路算法及在游戏中的应用 
A*寻路算法及在游戏中的应用 
A*寻路算法及在游戏中的应用 
A*寻路算法及在游戏中的应用 
A*寻路算法及在游戏中的应用 

开发环境:adobeflash cs 6

开发语言为as3.0

使用帧转跳技术开发。

A*寻路算法及在游戏中的应用 

所有类继承自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翻译:孙璨

A*寻路算法及在游戏中的应用