2013-11-03 179 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