2015-09-16 37 views
1

我正在用Javascript寫一個簡單的掃雷遊戲。我有一個二維數組(稱爲「mineInput」)來保存所有地雷的位置。我有一個單獨的數組「結果」,它記錄了每個單元格相鄰的地雷數量。Javascript掃雷遊戲,不能增加正確的單元格

我有嵌套的for循環遍歷每個行和「結果」的每一列和您在「mineInput每賣」 2。如果有我的,我遞增與result[i][j]++;礦井數量。但是我注意到怪異的行爲其中整個柱遞增,而不是僅僅一個小區

此:

[ [ 0, 0, 0 ], 
    [ 0, 0, 0 ], 
    [ 0, 0, 0 ] ] 

後跟:result[i][j]++;

變爲:

[ [ 0, 1, 0 ], 
    [ 0, 1, 0 ], 
    [ 0, 1, 0 ] ] 

代替:

[ [ 0, 0, 0 ], 
    [ 0, 1, 0 ], 
    [ 0, 0, 0 ] ] 

這裏是全碼(PLS原諒控制檯日誌的淫穢數)。 https://repl.it/BIYH/2

任何想法有什麼不對?

+0

我已將您的帖子從調用此遊戲「Minecraft」更改爲「掃雷」。 「我的世界」是3D探索和構建東西的遊戲;掃雷是二維尋找隱藏的礦場遊戲,我敢肯定你正試圖在這裏問一下。 – duskwuff

+0

你試過了嗎(結果[i] [j])++; ? –

回答

1

我猜猜問題出在以下代碼中:

var result = []; 
var newRow = []; 
for (var i = 0; i < rowCount; i++) { 
    newRow.push(0); 
} 
for (var i = 0; i < rowCount; i++) { 
    result.push(newRow); 
} 

您一次又一次地將相同的數組添加到數組result。相反,您希望爲每行創建一個新陣列:

var result = []; 

for (var i = 0; i < rowCount; i++) { 
    var newRow = []; 
    for (var j = 0; j < rowCount; j++) { 
     newRow.push(0); 
    } 
    result.push(newRow); 
} 

數組是javascript中的對象,並且對象始終按引用傳遞。

+0

我知道這是愚蠢的。我現在覺得很愚蠢。謝謝 – lemontree

4

的問題是在你的代碼早在那裏你初始化你的陣列

var result = []; 
var newRow = []; 
for (var i = 0; i < rowCount; i++) { 
    newRow.push(0); 
} 
for (var i = 0; i < rowCount; i++) { 
    result.push(newRow); 
} 

您已經創建只有一個newRow數組並把它添加到您的result陣列3倍。所以,你可以顯示此類似:

newRow == [0,0,0] 
result == [newRow, newRow, newRow] 

當你增加你添加到一個單元格中newRow陣列賦予

newRow == [0,1,0] 
result == [newRow, newRow, newRow] therefore 
result = [[0,1,0],[0,1,0],[0,1,0]] 

就可以解決這個問題是這樣的:

var result = []; 
for (var i = 0; i < rowCount; i++) { 
    // create a new array for each row 
    var newRow = []; 
    for (var i = 0; i < rowCount; i++) { 
    newRow.push(0); 
    } 

    result.push(newRow); 
}