2016-02-25 25 views
-1

我目前正在使用Javascript編寫生活中的康威遊戲,但遇到了一些我無法找到解決方案的錯誤。的錯誤是:無法修復我的javascript代碼中的錯誤

  • 未捕獲的類型錯誤:無法讀取屬性 '1' 的未定義的 - 這是此行 - 變種currentneighbour = cell.grid [RO + neighbour1] [COL + neighbour2];
  • GoL.update - 與上面相同的行
  • GoL.updateAll - 這是這一行 - this.update(i,j);
  • (匿名函數) - 這是在底部的這條線gameoflife.updateAll();

我不知道爲什麼我得到這些錯誤,並遵循一個似乎適用於他們的教程。 這裏是我的遊戲代碼。

//object constructor 
function cell(){ 
    this.alive = Math.random() >0.7;  
    this.neighbours = 0; //number of live neighbours 
    this.checkneighbours = [[-1,-1],[-1,0],[0,-1],[-1,1],[1,-1],[1,0],[0,1],[1,1]]; 
} 


function GoL(size){ 
    this.size = size; 
    this.grid = this.makeGrid(size); 
};  

    GoL.prototype.makeGrid = function(size){ 
     var grid = []; 
     for(var i=0; i<size; i++){ 
      var row=[]; 
      for(var j =0; j<size; j++){ 
       row.push(new cell()); 
      } 
      grid.push(row); 
     } 
      return grid; 
    }; 

    GoL.prototype.drawGrid = function(){ 
     console.log("\033[2J"); 
     for(var i=0;i<this.size;i++){ 
      var row =this.grid[i]; 
      var rowCell=""; 
      for(var j=0;j<this.size;j++){ 
       var cell = row[j]; 
       if(cell.alive){ 
        rowCell += "X|"; 
       }else{ 
        rowCell += " |"; 
       }    
      } 
      console.log(rowCell); 
     }  
    }; 

GoL.prototype.underpopulation = function(ro,col){ 
    var cell = this.grid[ro][col]; 
    if(cell.neighbours <2){ 
     return true; 
    }else{ 
     return false; 
    } 
}; 
GoL.prototype.overpopulation = function(ro,col){ 
    var cell = this.grid[ro][col]; 
    if(cell.neighbours >3){ 
     return true; 
    }else{ 
     return false; 
    } 
}; 

GoL.prototype.backtolife = function(ro,col){ 
    var cell = this.grid[ro][col]; 
    if(cell.neighbours ===3 && !cell.alive){ 
    return true; 
    }else{ 
     return false; 
    } 
}; 

GoL.prototype.update = function(ro,col){  
    var cell = this.grid[ro][col]; 
    cell.num_of_neighbours = 0; 
    for(var i =0; i<cell.checkneighbours.length; i++){ 
     var checkneighbour = cell.checkneighbours[i]; 
     var neighbour1 = checkneighbour[0]; 
     var neighbour2 = checkneighbour[1]; 
     if(neighbour1>=0 && neighbour1 < this.size && neighbour2 >=0 && neighbour2 < this.size){ 
     var currentneighbour = cell.grid[ro + neighbour1][col+neighbour2]; 
     if(currentneighbour.alive){ 
      cell.num_of_neighbours++; 
     } 
     } 
    } 
}; 

GoL.prototype.updateAll = function(){ 
    for(var i=0; i<this.size;i++){ 
     for(var j=0; j<this.size;j++){ 
      this.update(i,j); 
     } 
    } 
} 

GoL.prototype.cellstatus = function(ro,col){ 
    var cell = this.grid[ro][col]; 
    if(this.underpopulation(ro,col) || this.overpopulation(ro,col)){ 
     cell.alive = false; 
    }else if(this.backtolife(ro,col)){ 
     cell.alive = true; 
    } 
}; 

GoL.prototype.allcellstatus = function(ro,col){ 
    for(var i=0; i<this.size;i++){ 
     for(var j=0; j<this.size;j++){ 
      this.cellstatus(i,j); 
     } 
    } 
}; 


var gameoflife = new GoL(40); 

var interval = setInterval(function(){ 
    gameoflife.drawGrid(); 
    gameoflife.updateAll(); 
    gameoflife.allcellstatus(); 
},1000);  
+0

爲了方便起見,我已經做了一小段代碼(只改變它的輸出寫入頁面而不是控制檯,這使得調試一個嚴重的PITA):https://jsfiddle.net/nw4Lw7z9/ –

回答

2

這是一個錯字。

var currentneighbour = cell.grid[ro + neighbour1][col + neighbour2];

應該

var currentneighbour = this.grid[ro + neighbour1][col + neighbour2];

一個無關的錯誤附近:要設置cell.num_of_neighbours++;但想讀cell.neighbours

撥弄應用這些更改:https://jsfiddle.net/nw4Lw7z9/1/有還是一些非常錯誤的遊戲邏輯,這些模式不匹配康威的所有,但至少它現在給一些輸出...