最短路线 A_pathfinding(table,table,table)
付费vip免费
格式 : [table]最短路线 = A_pathfinding( 二值化表, {起点x,起点y,代价}, {终点x,终点y,代价})
适用场景 : A星寻路
其他关联函数 : ptable
首先我们需要得到二值化表,起点,终点,请查看A星寻路(一)链接地址
local t={
{1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0},
{1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0},
{1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0},
{1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0},
{1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0},
{1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1}}
local Zt={16,1,260} --终点
local Qt={1,21,0} --起点
算法寻路原理:
从起点周围的所有点都计算一遍,找到距离终点最近的点,把其他点暂时存入到一个表备用,走过的路线全部记录下来即可。如果有回头的路线,则需要把走过的路线,删除掉原来所有比当前重新走的代价小的值,最终留下的数据就是最短路线。
vip群公告获取源码密码
local _t_Y = A_pathfinding(t,Qt,Zt)
--得到左图最短路线
--[[_t_Y={{1,21,260},{2,20,246},{3,19,232},{4,18,218},{4,17,208},{4,16,198},
{5,15,184},{5,14,174},{5,13,164},{5,12,154},{5,11,150},{6,10,136},{7,9,122},
{8,8,108},{9,7,94},{10,6,80},{11,5,66},{12,4,52},{13,3,38},{14,2,24},{15,1,10},
{16,1,0}}]]
遍历起点周围有两种方法自由选择(仅供参考,实际可能相反):
1、左图:周围8点,循环寻路1000次,耗时10秒,路线短,没拐角。实际摇杆控制人物,会比较顺畅。
2、右图:周围4点,循环寻路1000次,耗时5秒,路程长,有拐角,方向有拐角。实际摇杆控制人物,会不断的切换方向。
路线可视化 A_visualization(table,table)
免费
格式 : table = A_visualization( 二值化表, 最短路线)
适用场景 : A星寻路
其他关联函数 : ptable
--观看最短路线的方法,不参与A星计算使用
function A_visualization(t,_t_Y)
local tb={}
for y=1,#t do --复制一份二值化代价表
tb[y]={}
for x=1,#t[1] do
if t[y][x]==1 then
tb[y][x]=1
else
tb[y][x]=0
end
end
end
local x1,y1
for i=1,#_t_Y do --遍历最短路线
local x=_t_Y[i][1]
local y=_t_Y[i][2]
tb[y][x]=7 --向前走
-- ptable(tb) --播放
-- mSleep(500)
end
return tb
end
local vi=A_visualization(t,_t_Y)
ptable(vi)
导致寻路失败例子:当所有点 2 都走完,还是无法到达终点位置,则退出循环,返回{ }
加油,马上就可以到实战啦!
如果我们顺利得到了最短路线,接下来我们就要学习获取路线每一步的行走方向,来控制我们的游戏摇杆8个方向。
行走方向 A_direction(table,number)
付费vip免费
格式 : 方向 = A_direction(最短路线,来回方向(-1可得到相反反向))
适用场景 : A星寻路
其他关联函数 : ptable
vip群公告获取源码密码
local t = A_direction(_t_Y,1)
ptable(t)
--t={{1,0,1,-1},{1,0,1,-1},{1,0,1,-1},{0,1,0,-1},{0,1,0,-1},{1,0,1,-1},
{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{1,0,1,-1},{1,0,1,-1},
{1,0,1,-1},{1,0,1,-1},{1,0,1,-1},{1,0,1,-1},{1,0,1,-1},{1,0,1,-1},
{1,0,1,-1},{1,0,1,-1},{0,1,1,0}}
{斜方向,直方向,x方向,y方向},x>0 右 x<0 左,y>0 下 y<0 上
举例:{1,0,1,-1}
x>0 = 右
y<0 = 上
以此判断是方向是右上
斜方向 = 1
我们需要往 右上 走 1次
直方向 = 0
有时候会因为回头路,导致中间路线被删,所以可能不止走一步,比如:
我们可以看到 第 3、4 步并没有存入最短路线,原因是路线计算的时候,选择了其他方向的路线,而当存入第 5 步的时候,把 3 4步进行了判断,结果代价小于第 5 步,被算法判断成回头路给删除。所以斜方向和直方向,有时候这种路线,我们就会得到 > 1 的次数。
--例子图行走方向[[{
{1,0,1,-1},{0,3,3,0},{0,1,1,0},{0,1,1,0},{0,1,1,0},{0,1,1,0},{0,1,1,0},
{0,1,1,0},{0,1,1,0},{0,1,1,0},{0,1,1,0},{1,0,1,-1},{1,0,1,-1},{0,1,0,-1},
{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1}{0,1,0,-1},
{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},
{0,1,0,-1},{0,1,0,-1}}]]
我们已经把路线转换成了方向和行走次数,搭配 万向滑动函数链接地址 ,试试看吧!
_O_5 = {300,460} --摇杆中心坐标
_O_x = 50 --x固定移动距离
_O_y = 50 --y固定移动距离
ms=100 --毫秒
local _O = {
{-1,-1,"上左"},{0,-1,"上"},{1,-1,"上右"},
{-1, 0,"左"}, {0, 0,"中"},{1, 0,"右"},
{-1, 1,"下左"},{0, 1,"下"},{1, 1,"下右"}
}
for i=1,#_O do
_O[i][1]=_O[i][1]*_O_x+_O_5[1]
_O[i][2]=_O[i][2]*_O_y+_O_5[2]
end
--slide_w(1,_O[5][1],_O[5][2],"按下")
local kay
for i=1,#t do
local x = t[i][3] --左右方向
local y = t[i][4] --上下方向
local k = 0
if t[i][2]~=0 then --直方向
k=t[i][2]
elseif t[i][1]~=0 then --斜方向
k=t[i][1]
end
for j=1,k do
if x<0 and y<0 then --上左
kay=1
elseif y<0 and x==0 then
kay=2
elseif x>0 and y<0 then --上右
kay=3
elseif x<0 and y==0 then
kay=4
elseif x>0 and y==0 then
kay=6
elseif y>0 and x<0 then --下左
kay=7
elseif y>0 and x==0 then
kay=8
elseif y>0 and x>0 then --下右
kay=9
end
--mSleep(ms)
-- slide_w(1,_O[kay][1],_O[kay][2],"移动",10)
ptable(_O[kay])
end
end
--slide_w(1,_O[kay][1],_O[kay][2],"抬起")