最短路线 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] doif t[y][x]==1 thentb[y][x]=1elsetb[y][x]=0endendendlocal x1,y1for 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)endreturn tbendlocal 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 kayfor i=1,#t dolocal x = t[i][3] --左右方向local y = t[i][4] --上下方向local k = 0if t[i][2]~=0 then --直方向k=t[i][2]elseif t[i][1]~=0 then --斜方向k=t[i][1]endfor j=1,k doif x<0 and y<0 then --上左kay=1elseif y<0 and x==0 thenkay=2elseif x>0 and y<0 then --上右kay=3elseif x<0 and y==0 thenkay=4elseif x>0 and y==0 thenkay=6elseif y>0 and x<0 then --下左kay=7elseif y>0 and x==0 thenkay=8elseif y>0 and x>0 then --下右kay=9end--mSleep(ms)-- slide_w(1,_O[kay][1],_O[kay][2],"移动",10)ptable(_O[kay])endend--slide_w(1,_O[kay][1],_O[kay][2],"抬起")
