为什么这个 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);
我正在尝试用 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);