2013-11-03 132 views
2

我正在尝试使用递归回溯算法编写迷宫生成器。我已经采取了this article的示例代码,并将它或多或少地转换为javascript。但它似乎不工作,因为所有行在生成的网格中都是相同的。递归回溯生成迷宫

我对这种事情一无所知,而且我被困在这里。任何人都可以看到我做错了什么?

编辑jsfiddle

// initialize the grid 
var grid = [] 
    , cells = [] 
    // duplicate to avoid overriding 
    , w = width 
    , h = height 
while (w--) cells.push(0) 
while (h--) grid.push(cells) 

var N = 1 
    , S = 2 
    , E = 4 
    , W = 8 
    , dirs = ['N', 'E', 'S', 'W'] 
    , dirsValue = { N: N, E: E, S: S, W: W } 
    , DX = { E: 1, W: -1, N: 0, S: 0 } 
    , DY = { E: 0, W: 0, N: -1, S: 1 } 
    , OPPOSITE = { E: W, W: E, N: S, S: N } 

function carve_passages_from(cx, cy, grid) { 
    var directions = shuffle(dirs) 

    directions.forEach(function(direction) { 
    var nx = cx + DX[direction] 
     , ny = cy + DY[direction] 

    if (ny >= 0 && ny <= (grid.length - 1) && nx >= 0 
     && nx <= (grid.length - 1) && grid[ny][nx] === 0) { 
     grid[cy][cx] += dirsValue[direction] 
     grid[ny][nx] += OPPOSITE[direction] 
     carve_passages_from(nx, ny, grid) 
    } 
    }) 
} 

carve_passages_from(0, 0, grid) 

return grid 

回答

2

的问题是这样的语句:

while (h--) grid.push(cells) 

您正在使用的grid的每一行相同的阵列。

为了解决它,你应该为每行创建一个新的数组:

while (h--) grid.push(new Array(w)) 

最后,用0替换所有undefined在网格中,如果需要的话。

+0

啊对了。非常感谢 – romainberger