编织的我的Lua迷宫建造者

时间:2015-01-20 18:16:21

标签: lua maze

我正在构建一个Lua脚本,它使用一个使用堆栈而不是递归实现的Recursive Backtracker版本来生成迷宫。目前迷宫正在编织,我似乎无法弄清楚我的逻辑在哪里发生。下面的函数将x和y作为生成迷宫的起点,这是一个2d结构(表格表):

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)以便在我之外使用应用

2 个答案:

答案 0 :(得分:1)

我至少看到一个问题。当你去&#34;想要上去&#34;时,你会检查&#34;单元格是否正常运行。被访问了,如果是的话,你会跳过&#34;跳过&#34;上去。

这似乎不正确恕我直言。如果你想上升,但是那个&#34; up&#34;来自当前的小区访问但是有一个&#34; down&#34;退出,你仍然可以上去(而不是因为被访问而跳过)。

这同样适用于其他方向。

这就是我得到的全部。

答案 1 :(得分:1)

我在Reddit上发帖后找到了答案。我没有将初始单元格设置为访问,允许它通过两次。更正是在maze[y][x].Visited = true之前添加table.insert(stack,{x=x,y=y})