A*算法Lua实现

##一.寻路

这里写图片描述

--3个任务

local class = require "middleclass"
Point = class('Point')
function Point:initialize(x,y)
    self.x = x
    self.y = y
end

function Point:__tostring()
    return 'Point:[' .. tostring(self.x) .. ',' .. tostring(self.y) .. ']'
end

--从图中建造数据模型
aStar = {
--0表示可走
--1表示不可走
{0,0,0,0,0,0,0},
{0,0,0,1,0,0,0},
{0,0,0,1,0,0,0},
{0,0,0,1,0,0,0},
{0,0,0,0,0,0,0},
}

startPoint = Point(3,2)
endPoint = Point(3,6)
local openTab,closeTab = {},{}
function openTab:__tostring() 
	local ret = ""
	 for k = 1 ,#self do
		ret = ret ..  tostring(self[k]) 
	 end
	  return ret
end 
setmetatable(openTab,openTab)

function nextPos(aStar,point)
	--遍历上下左右添加到开启表
	local tmp = {Point(point.x,point.y - 1),Point(point.x,point.y + 1),
	Point(point.x - 1 ,point.y ),Point(point.x + 1,point.y)
	}
	if point.x == endPoint.x and point.y == endPoint.y then
		--print("结束")
		openTab[#openTab + 1] = point
		if #openTab < 10 then
			print(openTab)
		end 
		table.remove(openTab)
		return
	else	
		for i = 1,4 do
			--处于边界内并且可走
			if tmp[i].x >= 1 and tmp[i].x <= 5 and tmp[i].y >= 1 and tmp[i].y <= 7 and  aStar[tmp[i].x][tmp[i].y] == 0 then
				aStar[point.x][point.y] = 1 --当前位置设置不可走
				openTab[#openTab + 1] = point
				nextPos(aStar,tmp[i]) --选择下一个位置
				table.remove(openTab)
				aStar[point.x][point.y] = 0
			else
				-- 不可走的舍弃,裁枝
			end  
		end 
	end
end

nextPos(aStar,startPoint)





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骇客之技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值