Lua (trAInsported): 尝试实现 Wavefront 算法,但不起作用
2019-11-13 16:34:32
收藏:0
阅读:127
评论:1
我正在尝试实现 Wavefront 算法,并且我的函数存在问题,它可以产生具有特定梯度的地图。
我尝试了下面的代码的几个不同版本,但它们都没有起作用。
算法的起始点(目标)在运行之前被设置为 1,然后从该点开始每个邻居的梯度应该增加(类似于每个 Wavefront 算法),如果梯度尚未被修改。
“originX”和“originY”是算法应该开始的目标。 “mapMatrix”是一个全局变量
“mapMatrix”的布局如下:
0 0 0 0 0 0 0
0 0 N 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 N 0 0 N 0 N
N N 0 0 N 0 0
0 0 0 0 0 0 0
(0 代表轨道,N(nil)代表障碍物)
期望的输出示例:
7 6 5 4 3 4 5
6 5 N 3 2 3 4
5 4 3 2 1 2 3
6 5 4 3 2 3 3
7 N 5 4 N 4 N
N N 6 5 N 5 6
9 8 7 6 7 6 7
使用以下代码如下:
function pathFinder(originX, originY)
northDir = originY - 1
eastDir = originX + 1
southDir = originY + 1
westDir = originX - 1
if northDir > 0 and mapMatrix[originX][northDir] == 0 then
mapMatrix[originX][northDir] = mapMatrix[originX][originY] + 1
pathFinder(originX, northDir)
end
if eastDir <= 7 and mapMatrix[eastDir][originY] == 0 then
mapMatrix[eastDir][originY] = mapMatrix[originX][originY] + 1
pathFinder(eastDir, originY)
end
if southDir <= 7 and mapMatrix[originX][southDir] == 0 then
mapMatrix[originX][southDir] = mapMatrix[originX][originY] + 1
pathFinder(originX, southDir)
end
if westDir > 0 and mapMatrix[westDir][originY] == 0 then
mapMatrix[westDir][originY] = mapMatrix[originX][originY] + 1
pathFinder(westDir, originY)
end
end
使用上面的代码,我得到了以下‘mapMatrix’:
0 0 0 0 3 4 5
0 0 N 0 2 10 6
0 0 0 0 1 9 7
0 0 0 0 0 0 8
0 N 0 0 N 0 N
N N 0 0 N 0 0
0 0 0 0 0 0 0
如果我切换 if 语句的顺序,它还会产生‘mapMatrix’的不同版本
在将“northDir”等声明为“local”之后,输出如下:EDIT
33 24 23 22 3 4 5
32 25 N 21 2 11 6
31 26 27 20 1 10 7
30 29 28 19 20 9 8
31 N 29 18 N 10 N
N N 30 17 N 11 12
33 32 31 16 15 14 13
如果需要更多的代码或信息,我很乐意提供帮助。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你的代码完全错了。因为
pathFinder在第一个检查中被递归调用,它将沿着那个方向一直走,直到出现任何障碍,然后转向下一个方向,依此类推。BFS其实是一个相当简单的算法。可以在一个队列上简单地实现迭代而无需递归,具体如下:
1.将初始节点放入队列中; 2.从队列中弹出第一个节点并处理; 3.将未处理的相邻节点推到队列的末尾; 4.如果队列不为空,则转到步骤2。
在Lua中,可以使用约二至三十行代码来实现矩形矩阵:
function gradient(matrix, originX, originY) -- 创建队列并将原始位置和初始值放入队列中。 local queue = { { originX, originY, 1 } } repeat -- 从队列中弹出第一个位置和值。 local x, y, value = unpack(table.remove(queue, 1)) -- 在矩阵中标记此位置。 matrix[y][x] = value -- 检查顶部的位置。 if y > 1 and matrix[y - 1][x] == 0 then -- 如果它还没有被处理过,则将其推到队列中。 table.insert(queue, { x, y - 1, value + 1 }) end -- 检查左侧的位置。 if x > 1 and matrix[y][x - 1] == 0 then table.insert(queue, { x - 1, y, value + 1 }) end -- 检查底部的位置。 if y < #matrix and matrix[y + 1][x] == 0 then table.insert(queue, { x, y + 1, value + 1 }) end -- 检查右侧的位置。 if x < #matrix[y] and matrix[y][x + 1] == 0 then table.insert(queue, { x + 1, y, value + 1 }) end -- 重复此过程,直到队列为空。 until #queue == 0 end -- 只是帮助打印矩阵的函数。 function printMatrix(matrix) for _, row in pairs(matrix) do for _, value in pairs(row) do io.write(string.format("%2s", value)) end io.write('\n') end end local mapMatrix = { { 0, 0, 0, 0, 0, 0, 0, }, { 0, 0, 'N', 0, 0, 0, 0, }, { 0, 0, 0, 0, 0, 0, 0, }, { 0, 0, 0, 0, 0, 0, 0, }, { 0, 'N', 0, 0, 'N', 0, 'N', }, { 'N', 'N', 0, 0, 'N', 0, 0, }, { 0, 0, 0, 0, 0, 0, 0, }, } gradient(mapMatrix, 5, 3) printMatrix(mapMatrix) --[[ Produces: 7 6 5 4 3 4 5 6 5 N 3 2 3 4 5 4 3 2 1 2 3 6 5 4 3 2 3 4 7 N 5 4 N 4 N N N 6 5 N 5 6 9 8 7 6 7 6 7 ]]这是一个完整的脚本,在控制台中可以运行。
但是,虽然这段代码很简单,但并不是很高效。每次从队列中删除第一个项目都会导致重新索引余下的项目。在生产代码中,应该使用链表或类似的东西来实现队列。