JavaScript中对象的随机矩阵生成问题
我正试图用JavaScript在4×4的网格上制作一个数独生成器。 因此,我声明了一个对象矩阵,如{number:0,cbd:1},它表示单元上的数字,以及一个状态变量,该状态变量控制该单元以后是否可以被挖掘(cbd): 然后,我使用此函数填充网格,遵守所有3个数独限制:行、列和正方形上没有重复:JavaScript中对象的随机矩阵生成问题,javascript,arrays,sudoku,Javascript,Arrays,Sudoku,我正试图用JavaScript在4×4的网格上制作一个数独生成器。 因此,我声明了一个对象矩阵,如{number:0,cbd:1},它表示单元上的数字,以及一个状态变量,该状态变量控制该单元以后是否可以被挖掘(cbd): 然后,我使用此函数填充网格,遵守所有3个数独限制:行、列和正方形上没有重复: fillmatrix4(matrix,tam){ var numberList = [...Array(4+1).keys()].slice(1); //[1,2,3,4] for(var k = 0
fillmatrix4(matrix,tam){
var numberList = [...Array(4+1).keys()].slice(1); //[1,2,3,4]
for(var k = 0; k < 4**2; k++){
var row = Math.floor(k/4);
var col = k%4;
if (matrix[row][col].number == 0){
numberList.sort(() => Math.random() - 0.5); //shuffles the array
for(var q = 0; q < numberList.length; q++){
var ids = matrix[row].map(a => a.number); //creates an array with the number property from all cells in that row
if (!(ids.includes(numberList[q]))){ //check if number is in row
if ((matrix[0][col].number != numberList[q]) && (matrix[1][col].number != numberList[q]) && (matrix[2][col].number != numberList[q]) && (matrix[3][col].number != numberList[q])){ //check if number is in column
var square = [];
if (row<2){It is used to find out what subgrid we are in
if (col<2){
square = [matrix[0][0].number, matrix[0][1].number, matrix[1][0].number, matrix[1][1].number];
} else {
square = [matrix[0][2].number, matrix[0][3].number, matrix[1][2].number, matrix[1][3].number];
}
} else {
if (col<2){
square = [matrix[2][0].number, matrix[2][1].number, matrix[3][0].number, matrix[3][1].number];
} else {
square = [matrix[2][2].number, matrix[2][3].number, matrix[3][2].number, matrix[3][3].number];
}
}
if (!(square.includes(numberList[q]))){ //check if number is that subgrid
matrix[row][col].number = numberList[q]; //if number not in row, column and square, adds it to matrix
if (this.checkGrid(matrix,tam)){ //returns true all matrix is filled
return matrix;
}
}
}
}
}
}
}
原因可能是什么?当您这样做时:
Array(4).fill({number: 0, cbd: 1})
这将使用对内存中相同对象的引用填充每个条目。从图形上看,它看起来像:
——。
|编号:0|
|生物多样性公约:1|
`-----------`
^ ^ ^ ^
| | | |
变量“矩阵”:[0,1,2,3]
对这些数组索引中的任何一个所做的更改都将改变相同的基础对象
以下是一个最小、完整、可复制的示例:
const arr=Array(4).fill({foo:bar});
arr[0].foo=“baz”;
log(JSON.stringify(arr,null,2));
控制台日志(arr)代码>当您执行以下操作时:
Array(4).fill({number: 0, cbd: 1})
这将使用对内存中相同对象的引用填充每个条目。从图形上看,它看起来像:
——。
|编号:0|
|生物多样性公约:1|
`-----------`
^ ^ ^ ^
| | | |
变量“矩阵”:[0,1,2,3]
对这些数组索引中的任何一个所做的更改都将改变相同的基础对象
以下是一个最小、完整、可复制的示例:
const arr=Array(4).fill({foo:bar});
arr[0].foo=“baz”;
log(JSON.stringify(arr,null,2));
控制台日志(arr)像这样使用.sort()
进行代码>洗牌是行不通的。另外,当您将一个对象传递给.fill()
时,您将使用对同一个对象的引用填充数组。像这样使用.sort()
洗牌不会真正起作用。另外,当您将一个对象传递给.fill()
时,您会用对同一个对象的引用填充数组。@ggorlen定义很好。我有一个努巴问题。你是如何制作图形定义的?:)你是说ASCII框?我刚刚在文本框中输入了它,但是像这样的工具也可以使用。@ggorlen定义不错。我有一个努巴问题。你是如何制作图形定义的?:)你是说ASCII框?我只是在文本框中输入了它,但是有些工具你可以使用。
Array(4).fill({number: 0, cbd: 1})