没有实际应用意义,只是为了熟悉Lua语法和重温下A*
建议使用LuaEdit Copy代码后再看
懒,不想排版了..
--
-- A* Lua 实现
-- By Jian
-- Version 1.0
--
-- 常量 --
KMapWidth = 15 -- 地图的宽度(节点数)
KMapHeight = 15 -- 地图的高度(节点数)
--[[
地图节点
]]
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
-- 绘制函数 --
function CMapNode:DrawChar()
drawChar = nil
if ( self.iCanPass ) then
if ( self.iIsInOpenList ) then drawChar = "1 "
else drawChar = "O " end
else drawChar = "X " end
return drawChar
end
--[[
地图表
]]
Map = { n = KMapWid