2013-04-24 48 views
0

我在用Javascript和HTML5 Canvas構建Conway的生活遊戲。 這裏的代碼是gameOfLife對象的範圍內:無法解決爲什麼數組更新時不應該這樣做?

this.cells = []; 
this.nextCellState = []; 

填充this.cells我的細胞對象後,我填充this.nextCellState像這樣:

this.nextCellState = this.nextCellState.concat(this.cells); 

在鼠標點擊,相應的單元格對象屬性的IsAlive開啓真:

function clickAlive(x, y) { 
    for (var i in this.cells) { 
     if (x.between(this.cells[i].x, this.cells[i].x + cellsize) && y.between(this.cells[i].y, this.cells[i].y + cellsize)) { 
      this.cells[i].isAlive = true; 
      console.log('Breakpoint'); 
     } 
    } 
} 

的問題是,在看看cellsnextCellState數組在斷點處,他們都點擊單元格激活到true

這是什麼造成的?

+1

不要使用'爲in'循環遍歷數組。使用普通的'for'循環。它不會解決你的問題,但這是一個設計建議 – Ian 2013-04-24 18:10:29

回答

2

當您將cells的內容複製到nextCellState時,您正在製作數組的淺表副本。對象本身現在被兩個數組重新命名(即cells[0]nextCellState[0]指向同一個對象)。

您需要在nextCellState中創建新對象才能夠獨立更改對象的內部狀態。如果你的單元格對象有一個複製構造函數,最簡單的方法是。然後,你可以做這樣的事情:

this.nextCellState = this.nextCellState.concat(
    this.cells.map(function(cell) { 
     return cell.copy(); // or whatever your copy constructor is 
    }) 
); 
相關問題