首页 > 代码库 > 用lua 实现的A*star 寻路算法

用lua 实现的A*star 寻路算法

local AStar={}
function AStar:create(s_node,e_node,map_list)
local openlist={}
local closelist={}

local maplist=map_list

local startnode={x=s_node.x,y=s_node.y,g=0,h=0,f=0,prenode=nil}
local endnode={x=e_node.x,y=e_node.y}

if startnode.x==endnode.x and startnode.y==endnode.y then
  return {}
end
if maplist[endnode.x][endnode.y] > 0 then
  return {}
end



local isendnode=nil
local function setH(node)
  node[‘h‘]=math.abs(node[‘x‘]-endnode[‘x‘])+math.abs(node[‘y‘]-endnode[‘y‘])
end

local function setG(node)
  node[‘g‘]=node[‘prenode‘][‘g‘]+1
end
local function setF(node)
  node[‘f‘]=node[‘g‘]+node[‘h‘]
end

local function GetNodeByPoint(node,x,y)

--这里超出的范围--可以根据自己的要求来改
  if x<1 or y<1 or x>7 or y>7 then
    return
  end

  if maplist[x][y]>0 then
    return
  end


  for key, var in ipairs(closelist) do
    if var.x==x and var.y==y then
      return
    end
  end

  local snode={}
  snode[‘x‘]=x
  snode[‘y‘]=y
  snode[‘prenode‘]=node
  setH(snode)
  setG(snode)
  setF(snode)

  for key, var in ipairs(openlist) do
    if var.x==x and var.y==y then
      if snode[‘f‘]>var[‘f‘] then
        return
      end
    var[‘prenode‘]=node
    --setH(var)
    setG(var)
    setF(var)
    return
    end
  end

  openlist[#openlist+1]=snode
  if (snode[‘x‘] == endnode[‘x‘]) and (snode[‘y‘]==endnode[‘y‘]) then
    isendnode=snode
  end

end

local function addfengopen(node)
  GetNodeByPoint(node, node[‘x‘], node[‘y‘]+1)
  GetNodeByPoint(node, node[‘x‘], node[‘y‘]-1)
  GetNodeByPoint(node, node[‘x‘]+1, node[‘y‘])
  GetNodeByPoint(node, node[‘x‘]-1, node[‘y‘])
end

local function findmin()
  local fmin=9999
  local node=nil
  local index=nil
  for key, var in ipairs(openlist) do
    if fmin>var[‘f‘] then
      fmin=var[‘f‘]
      node=var
      index=key
    end
  end

  if node then
    table.remove(openlist,index)
    return node
  end
end

local function search()
  local currentnode=startnode
  currentnode[‘g‘]=1

  setH(currentnode)
  setF(currentnode)

  closelist[#closelist+1]=currentnode

  local xunluan=0
  while true do
    addfengopen(currentnode)

    currentnode=findmin()
    if not currentnode then
      return {}
  end
  closelist[#closelist+1]=currentnode

-- print(‘open list ...‘)
-- showtable1:printtable(openlist)
-- print(‘close list ...‘)
-- showtable1:printtable(closelist)

  if isendnode then
    print(‘tui chu‘,isendnode,xunluan)
    break
  end
  xunluan=xunluan+1
end

--找到了路径
  local apath={}
  while isendnode[‘prenode‘] do
    apath[#apath+1]={x=isendnode[‘x‘],y=isendnode[‘y‘]}
    isendnode=isendnode[‘prenode‘]
  end

  return apath
end

return search()
end

return AStar

用lua 实现的A*star 寻路算法