为什么这个 javascript while 循环挂起?

Why does this javascript while loop hang?

我正在尝试用 javascript 做一个非常简单的事情来创建一个扫雷网格。

gridsize=9;

//grid initialisation 
var grid=Array(gridsize).fill(Array(gridsize).fill(null));

// this comes from  <
function randint(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

nbombs=20;
insertedbombs=0;

while (insertedbombs<nbombs){
    rx=randint(0,gridsize-1);
    ry=randint(0,gridsize-1);
    if (grid[rx][ry] == null){
        insertedbombs++;
        grid[rx][ry]='b';
    }
}

while 循环挂起,在 Chrome 和 Firefox 控制台中,网格的所有值都被填充,而不仅仅是 20,我不知道为什么,我想我对 javascript 语言,因为 python 中的相同代码有效。

工作python代码:

grid= [[None for i in range(9)]for i in range(9)]

nbombs=20;
insertedbombs=0;
while (insertedbombs< nbombs):
    rx=random.randint(0,8)
    ry=random.randint(0,8)
    if (grid[rx][ry]== None):
            grid[rx][ry]='b'
            insertedbombs+=1

问题是 Array#fill 没有按照您的想法去做。

在您的示例中,您创建了一个 SINGLE 数组 Array(gridsize).fill(null),然后将该数组放在外部数组的每个索引处。这意味着您的 grid 实际上包含相同的数组,超过 9 次。因此,当您分配 grid[0][0] 时,您实际上是一次性分配了 grid[0][0]grid[1][0]grid[2][0]grid[3][0] 等……[=22] =]

const gridSize = 9;

//grid initialisation 
const grid = Array(gridSize).fill(Array(gridSize).fill(null));

console.log(grid[0] === grid[1]);

grid[0][0] = 10;

console.log(grid[0][0], grid[0][0] === grid[1][0]);

您要做的是首先用一些虚拟值填充数组,例如 null。然后映射数组并将每个条目替换为它自己的 Array(gridsize).fill(null).

副本

const gridSize = 9;

//grid initialisation 
const grid = Array(gridSize)
  .fill(null)
  .map(() => Array(gridSize)
    .fill(null)
  );

const randInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1)) + min;

const nbombs = 20;
let insertedbombs = 0;

while (insertedbombs < nbombs){
    const rx = randInt(0, gridSize - 1);
    const ry = randInt(0, gridSize - 1);
    if (grid[rx][ry] === null){
        insertedbombs += 1;
        grid[rx][ry] = 'b';
    }
}

console.log(grid);