2017-07-11 23 views
1

我真的試圖初始化多陣列數獨[9] [9]其是由細胞的我運行時 sudoku.initialize(),所有rowcolbox in * sudoku [x] [y] * s分別是8,8,9。設置屬性值在多dementional對象陣列

var cell = { 
    sol: 0, 
    row: 0, 
    col: 0, 
    box: 0, 
    candi: [1, 2, 3, 4, 5, 6, 7, 8, 9] 
}; 


var sudoku = {} 
sudoku = new Array(9); 
for (var i = 0; i < 9; i++) { 
    sudoku[i] = new Array(9); 
} 
for (var i = 0; i < 9; i++) { 
    for (var j = 0; j < 9; j++) { 
     sudoku[i][j] = cell; 
    } 
} 
sudoku.initialize = function() { 
    for (var i = 0; i < 9; i++) { 
     for (var j = 0; j < 9; j++) { 
      sudoku[i][j].row = i; 
      sudoku[i][j].col = j; 
      if (i < 3) { 
       if (j < 3) 
        sudoku[i][j].box = 1; 
       else if (2 < j && j < 6) 
        sudoku[i][j].box = 2; 
       else if (5 < j) 
        sudoku[i][j].box = 3; 
      } 
      else if (2 < i && i < 6) { 
       if (j < 3) 
        sudoku[i][j].box = 4; 
       else if (2 < j && j < 6) 
        sudoku[i][j].box = 5; 
       else if (5 < j) 
        sudoku[i][j].box = 6; 
      } 
      else if (5 < i) 
       if (j < 3) 
        sudoku[i][j].box = 7; 
       else if (2 < j && j < 6) 
        sudoku[i][j].box = 8; 
       else if (5 < j) 
        sudoku[i][j].box = 9; 
     } 
    } 
} 
sudoku.print=function(){ 
    for (var i = 0; i < 9; i++) { 
     for (var j = 0; j < 9; j++) { 
      document.write(sudoku[i][j].col + "&nbsp"); 
     } 
     document.write("\n"); 
    } 
} 
sudoku.initialize();` 

我想JavaScript中的多元數組存在誤解。

sudoku[2][2].box=1 
    1 
    sudoku[4][8].box=2 
    2 
    sudoku[2][2].box 
    2 
    sudoku[3][3].box 
    2 

因爲我是JavaScript的初學者,這段代碼可能很荒謬。但無論如何,你可以抓住我的意思。

+2

數組中的所有81個項目指向同一個對象。 –

回答

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] 
     }; 
    } 
} 

你也不會在你的initialize方法需要這麼多if秒。
一些數學和整數除法/模會做所有的在兩行代碼魔術;)

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 + "&nbsp"); 
 
     } 
 
     document.write("<br/>"); 
 
    } 
 
    }; 
 
} 
 

 
var sudoku = new Sudoku(); 
 
sudoku.print();

0

的問題是,你正在分配相同的對象,以你的細胞中的每一個。因爲在Javascript對象是通過引用存儲(不是值),做

sudoku[1][2] = cell; 

本質使得sudoku[1][2]cell意味着同樣的事情。您需要爲sudoku中的每個位置創建一個新的單元格對象。有大量的材料提供了有關如何在JavaScript中定義「類」和實例化對象,例如參見:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

雖然有可能其他方法,例如,你可以克隆對象,利用原型等