2015-09-16 39 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); 
}