我的 Lua 正在编织的迷宫建造者
My Lua maze builder that is braiding
我正在构建一个 Lua 脚本,该脚本使用通过堆栈而不是递归实现的 Recursive Backtracker 版本生成迷宫。目前迷宫正在编织,我似乎无法弄清楚我的逻辑在哪里发生。下面的函数将 x 和 y 作为生成二维结构迷宫的起点(table of tables):
local function buildMazeInternal(x,y,maze)
local stack = {}
local directions = {'North','East','South','West'}
table.insert(stack,{x=x,y=y})
while #stack > 0 do
local index = 1
local nextX = x
local nextY = y
local braid = false
for i = #directions, 2, -1 do -- backwards
local r = calc:Roll(1,i) -- select a random number between 1 and i
directions[i], directions[r] = directions[r], directions[i] -- swap the randomly selected item to position i
end
while index <= #directions and nextX == x and nextY == y do
if directions[index] == 'North' and y > 1 and not maze[y-1][x].Visited then
maze[y][x].North = true
maze[y-1][x].South = true
nextY = y-1
elseif directions[index] == 'East' and x < width and not maze[y][x+1].Visited then
maze[y][x].East = true
maze[y][x+1].West = true
nextX = x+1
elseif directions[index] == 'South' and y < height and not maze[y+1][x].Visited then
maze[y][x].South = true
maze[y+1][x].North = true
nextY = y+1
elseif directions[index] == 'West' and x > 1 and not maze[y][x-1].Visited then
maze[y][x].West = true
maze[y][x-1].East = true
nextX = x-1
else
index = index + 1
end
end
if nextX ~= x or nextY ~= y then
x = nextX
y = nextY
maze[y][x].Visited = true
table.insert(stack,{x=x,y=y})
else
x = stack[#stack].x
y = stack[#stack].y
table.remove(stack)
end
end
end
我知道我忽略了一些东西,但我似乎无法确定它。请注意,calc:Roll(1,100)
方法是我的应用程序中用于模拟掷骰子的 .net 方法,在本例中为 1 * 100 面骰子,它可以替换为调用 math.Random(1,100)
以在我的外部使用申请。
我至少看到一个问题。当你去 "want to go up" 时,你检查 "cell which is up" 是否被访问,如果是,你 "skip" 就上去。
恕我直言,这似乎不正确。如果你想上去,但是从当前单元格 "up" 的单元格被访问 但有一个 "down" 出口 ,你应该仍然可以去向上(而不是因为它被访问而跳过)。
其他方向同理
我只有这些了。
我在 Reddit 上发帖后找到了答案。我没有设置要访问的初始单元格,允许它通过两次。更正是在 table.insert(stack,{x=x,y=y})
.
之前添加 maze[y][x].Visited = true
我正在构建一个 Lua 脚本,该脚本使用通过堆栈而不是递归实现的 Recursive Backtracker 版本生成迷宫。目前迷宫正在编织,我似乎无法弄清楚我的逻辑在哪里发生。下面的函数将 x 和 y 作为生成二维结构迷宫的起点(table of tables):
local function buildMazeInternal(x,y,maze)
local stack = {}
local directions = {'North','East','South','West'}
table.insert(stack,{x=x,y=y})
while #stack > 0 do
local index = 1
local nextX = x
local nextY = y
local braid = false
for i = #directions, 2, -1 do -- backwards
local r = calc:Roll(1,i) -- select a random number between 1 and i
directions[i], directions[r] = directions[r], directions[i] -- swap the randomly selected item to position i
end
while index <= #directions and nextX == x and nextY == y do
if directions[index] == 'North' and y > 1 and not maze[y-1][x].Visited then
maze[y][x].North = true
maze[y-1][x].South = true
nextY = y-1
elseif directions[index] == 'East' and x < width and not maze[y][x+1].Visited then
maze[y][x].East = true
maze[y][x+1].West = true
nextX = x+1
elseif directions[index] == 'South' and y < height and not maze[y+1][x].Visited then
maze[y][x].South = true
maze[y+1][x].North = true
nextY = y+1
elseif directions[index] == 'West' and x > 1 and not maze[y][x-1].Visited then
maze[y][x].West = true
maze[y][x-1].East = true
nextX = x-1
else
index = index + 1
end
end
if nextX ~= x or nextY ~= y then
x = nextX
y = nextY
maze[y][x].Visited = true
table.insert(stack,{x=x,y=y})
else
x = stack[#stack].x
y = stack[#stack].y
table.remove(stack)
end
end
end
我知道我忽略了一些东西,但我似乎无法确定它。请注意,calc:Roll(1,100)
方法是我的应用程序中用于模拟掷骰子的 .net 方法,在本例中为 1 * 100 面骰子,它可以替换为调用 math.Random(1,100)
以在我的外部使用申请。
我至少看到一个问题。当你去 "want to go up" 时,你检查 "cell which is up" 是否被访问,如果是,你 "skip" 就上去。
恕我直言,这似乎不正确。如果你想上去,但是从当前单元格 "up" 的单元格被访问 但有一个 "down" 出口 ,你应该仍然可以去向上(而不是因为它被访问而跳过)。
其他方向同理
我只有这些了。
我在 Reddit 上发帖后找到了答案。我没有设置要访问的初始单元格,允许它通过两次。更正是在 table.insert(stack,{x=x,y=y})
.
maze[y][x].Visited = true