我正在尝试初始化多个数组 sudoku [9] [9] ,它由 cell 组成 当我在* sudoku [x]中运行 sudoku.initialize(),所有行, col ,框时y] * s各为8,8,9。
sudoku[2][2].box=1
1
sudoku[4][8].box=2
2
sudoku[2][2].box
2
sudoku[3][3].box
2
我猜在javascript中存在对多维数组的误解。
foreground
因为我是javascript的初学者,这个代码可能很荒谬。但无论如何你可以抓住我的意思。
答案 0 :(得分:1)
多维数组中的所有81个项目都指向同一个对象,因为:
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
sudoku[i][j] = cell;
}
}
您sudoku[i][j]
存储对同一对象cell
的引用
当您稍后尝试修改/访问sudoku[2][2]
,sudoku[3][3]
,sudoku[4][8]
中的值时,您实际上使用的是同一个对象。
您需要为每个单元格创建一个新对象 以这种方式更改代码应该有所帮助:
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
sudoku[i][j] = {
sol: 0,
row: 0,
col: 0,
box: 0,
candi: [1, 2, 3, 4, 5, 6, 7, 8, 9]
};
}
}
您的if
方法中也不需要这么多initialize
一些数学和整数除法/模数将在两行代码中完成所有魔术;)
function Cell(row, col)
{
this.col = col;
this.row = row;
this.sol = 0;
this.box = Math.ceil(row / 3) * 3 + Math.ceil(col / 3) - 3;
this.candidates = [1, 2, 3, 4, 5, 6, 7, 8, 9];
}
function Sudoku()
{
this.rows = new Array(9);
for (var i = 0; i < 9; i++)
{
this.rows[i] = new Array(9);
for (var j = 0; j < 9; j++) {
this.rows[i][j] = new Cell(i, j);
}
}
this.print = function() {
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
document.write(this.rows[i][j].row + "/" + this.rows[i][j].col + " ");
}
document.write("<br/>");
}
};
}
var sudoku = new Sudoku();
sudoku.print();
答案 1 :(得分:0)
问题是您要为每个单元格分配相同的对象。因为Javascript中的对象是通过引用(而不是值)存储的,所以执行
data.replace({'very bad': 1, 'bad': 2, 'poor': 3, 'good': 4, 'very good': 5}, inplace=True)
基本上使sudoku[1][2] = cell;
和sudoku[1][2]
意味着相同的事情。您需要为cell
中的每个位置创建一个新的单元格对象。关于如何在Javascript中定义“类”并实例化对象,有很多可用的材料,例如参见:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
虽然还有其他可能的方法,例如你可以克隆对象,使用原型等等。