参考博客 http://blog.csdn.net/lufy_legend/article/details/5733733
这个博客地址上对A*算法的原理解释的还是蛮清楚的,并且用js实现了。对于对A星不了解的同学这个博客可以先扫一下盲。
知道了A* 原理之后我们就用lua来实现拉
代码是在网上找了一个lua实现的四个方向的寻路再根据上面博客的思路修改为八个方向的寻路
--
-- A* Lua 实现
-- By Jian
-- Version 1.0
-- modiy by steven
module("AStarQuery", package.seeall)
-- 常量 FindWay中设置--
KMapWidth = 0 -- 地图的宽度(节点数)
KMapHeight = 0 -- 地图的高度(节点数)
--[[
地图节点
]]
CMapNode =
{
iX = 0 , -- 在地图中的 X 坐标
iY = 0 , -- 在地图中的 Y 坐标
iIndex = 0 , -- 在一维地图数组中的下标
iFCost = 0 , -- A Star 算法中的 F 耗费
-- iGCost = 0 , -- A Star 算法中的 G 耗费
-- iHCost = 0 , -- A Star 算法中的 H 耗费
iIsInOpenList = false , -- 该节点是否在 开放列表 中
iIsInCloseList = false , -- 该节点是否在 关闭列表 中
iParent = nil , -- 使用A Star 求路径过程中存储父节点
iNext = nil , -- 在openList 和 closeList 中指向下一个元素
iCanPass = true -- 该节点是否是可通过节点
}
-- 构造函数 --
function CMapNode:new( aIndex )
if ( aIndex == nil ) then
error( " the Index Can't be nil " ) end
ret = object or {}
self.__index = self
setmetatable(ret, self)
ret.iX = aIndex - math.floor( aIndex / KMapWidth) * KMapWidth -- 求余、未知 % 为什么报错,数学库也打开了
ret.iY = ( aIndex - ret.iX ) / KMapWidth -- Lua 得出的商是浮点数
ret.iIndex = aIndex
return ret
end