最短路线 A_pathfinding(table,table,table)付费vip免费

格式 : [table]最短路线 = A_pathfinding( 二值化表, {起点x,起点y,代价}, {终点x,终点y,代价})
适用场景 : A星寻路
其他关联函数 : ptable

首先我们需要得到二值化表,起点,终点,请查看A星寻路(一)链接地址

  1. local t={
  2. {1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
  3. {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  4. {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  5. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  6. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  7. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  8. {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  9. {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  10. {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  11. {1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0},
  12. {1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0},
  13. {1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0},
  14. {1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0},
  15. {1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0},
  16. {1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
  17. {0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
  18. {0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},
  19. {0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},
  20. {0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},
  21. {0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},
  22. {0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1}}
  23. local Zt={16,1,260} --终点
  24. local Qt={1,21,0} --起点

算法寻路原理:
从起点周围的所有点都计算一遍,找到距离终点最近的点,把其他点暂时存入到一个表备用,走过的路线全部记录下来即可。如果有回头的路线,则需要把走过的路线,删除掉原来所有比当前重新走的代价小的值,最终留下的数据就是最短路线。
vip群公告获取源码密码

  1. local _t_Y = A_pathfinding(t,Qt,Zt)
  2. --得到左图最短路线
  3. --[[_t_Y={{1,21,260},{2,20,246},{3,19,232},{4,18,218},{4,17,208},{4,16,198},
  4. {5,15,184},{5,14,174},{5,13,164},{5,12,154},{5,11,150},{6,10,136},{7,9,122},
  5. {8,8,108},{9,7,94},{10,6,80},{11,5,66},{12,4,52},{13,3,38},{14,2,24},{15,1,10},
  6. {16,1,0}}]]

遍历起点周围有两种方法自由选择(仅供参考,实际可能相反):
1、左图:周围8点,循环寻路1000次,耗时10秒,路线短,没拐角。实际摇杆控制人物,会比较顺畅。
2、右图:周围4点,循环寻路1000次,耗时5秒,路程长,有拐角,方向有拐角。实际摇杆控制人物,会不断的切换方向。
A星寻路8.gifA星寻路4.gif

路线可视化 A_visualization(table,table)免费

格式 : table = A_visualization( 二值化表, 最短路线)
适用场景 : A星寻路
其他关联函数 : ptable

  1. --观看最短路线的方法,不参与A星计算使用
  2. function A_visualization(t,_t_Y)
  3. local tb={}
  4. for y=1,#t do --复制一份二值化代价表
  5. tb[y]={}
  6. for x=1,#t[1] do
  7. if t[y][x]==1 then
  8. tb[y][x]=1
  9. else
  10. tb[y][x]=0
  11. end
  12. end
  13. end
  14. local x1,y1
  15. for i=1,#_t_Y do --遍历最短路线
  16. local x=_t_Y[i][1]
  17. local y=_t_Y[i][2]
  18. tb[y][x]=7 --向前走
  19. -- ptable(tb) --播放
  20. -- mSleep(500)
  21. end
  22. return tb
  23. end
  24. local vi=A_visualization(t,_t_Y)
  25. ptable(vi)

导致寻路失败例子:当所有点 2 都走完,还是无法到达终点位置,则退出循环,返回{ }
image.png

加油,马上就可以到实战啦!
如果我们顺利得到了最短路线,接下来我们就要学习获取路线每一步的行走方向,来控制我们的游戏摇杆8个方向。

image.png

行走方向 A_direction(table,number)付费vip免费

格式 : 方向 = A_direction(最短路线,来回方向(-1可得到相反反向))
适用场景 : A星寻路
其他关联函数 : ptable

vip群公告获取源码密码

  1. local t = A_direction(_t_Y,1)
  2. ptable(t)
  3. --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},
  4. {0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{0,1,0,-1},{1,0,1,-1},{1,0,1,-1},
  5. {1,0,1,-1},{1,0,1,-1},{1,0,1,-1},{1,0,1,-1},{1,0,1,-1},{1,0,1,-1},
  6. {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

有时候会因为回头路,导致中间路线被删,所以可能不止走一步,比如:
image.pngimage.png
我们可以看到 第 3、4 步并没有存入最短路线,原因是路线计算的时候,选择了其他方向的路线,而当存入第 5 步的时候,把 3 4步进行了判断,结果代价小于第 5 步,被算法判断成回头路给删除。所以斜方向和直方向,有时候这种路线,我们就会得到 > 1 的次数。

  1. --例子图行走方向[[{
  2. {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},
  3. {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},
  4. {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},
  5. {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},
  6. {0,1,0,-1},{0,1,0,-1}}]]

我们已经把路线转换成了方向和行走次数,搭配 万向滑动函数链接地址 ,试试看吧!
A星寻路(二) - 图7A星寻路(二) - 图8

  1. _O_5 = {300,460} --摇杆中心坐标
  2. _O_x = 50 --x固定移动距离
  3. _O_y = 50 --y固定移动距离
  4. ms=100 --毫秒
  5. local _O = {
  6. {-1,-1,"上左"},{0,-1,"上"},{1,-1,"上右"},
  7. {-1, 0,"左"}, {0, 0,"中"},{1, 0,"右"},
  8. {-1, 1,"下左"},{0, 1,"下"},{1, 1,"下右"}
  9. }
  10. for i=1,#_O do
  11. _O[i][1]=_O[i][1]*_O_x+_O_5[1]
  12. _O[i][2]=_O[i][2]*_O_y+_O_5[2]
  13. end
  14. --slide_w(1,_O[5][1],_O[5][2],"按下")
  15. local kay
  16. for i=1,#t do
  17. local x = t[i][3] --左右方向
  18. local y = t[i][4] --上下方向
  19. local k = 0
  20. if t[i][2]~=0 then --直方向
  21. k=t[i][2]
  22. elseif t[i][1]~=0 then --斜方向
  23. k=t[i][1]
  24. end
  25. for j=1,k do
  26. if x<0 and y<0 then --上左
  27. kay=1
  28. elseif y<0 and x==0 then
  29. kay=2
  30. elseif x>0 and y<0 then --上右
  31. kay=3
  32. elseif x<0 and y==0 then
  33. kay=4
  34. elseif x>0 and y==0 then
  35. kay=6
  36. elseif y>0 and x<0 then --下左
  37. kay=7
  38. elseif y>0 and x==0 then
  39. kay=8
  40. elseif y>0 and x>0 then --下右
  41. kay=9
  42. end
  43. --mSleep(ms)
  44. -- slide_w(1,_O[kay][1],_O[kay][2],"移动",10)
  45. ptable(_O[kay])
  46. end
  47. end
  48. --slide_w(1,_O[kay][1],_O[kay][2],"抬起")