2016-02-26 21 views
0

我已經編寫了康威的JavaScript遊戲,它似乎在製作一些東西到屏幕上,但它似乎沒有遵循相同的邏輯,或者以同樣的方式運行在康威生命遊戲中。我不知道什麼是錯的,爲什麼它是這樣運行的,我的代碼在我看來應該遵循正確的規則。任何人都可以發現它爲什麼沒有正確運行?這裏是的jsfiddle https://jsfiddle.net/nw4Lw7z9/1/問題與我的生命邏輯遊戲?

//object constructor 
function cell(){ 
    this.alive = Math.random() >0.8;  
    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(){ 
     grid.innerHTML = ''; 
     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 += " |"; 
       }    
      } 
      grid.innerHTML = grid.innerHTML + rowCell + "\n"; 
     }  
    }; 

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 = this.grid[ro + neighbour1][col+neighbour2]; 
     if(currentneighbour.alive){ 
      cell.neighbours++; 
     } 
     } 
    } 
}; 

GoL.prototype.updateAll = function(){ 
    for(var i=0; i<this.size-1;i++){ 
     for(var j=0; j<this.size-1;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(100); 

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

HTML鏈接

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>Game of Life</title> 
    <script src="cell.js" type="text/javascript"> </script> 
    </head> 
    <body> 
    <pre id="grid"> 
    </pre> 
    </body> 
</html> 

回答

1

update功能是很難效仿。我已經把它清理乾淨了。試試這個:

GoL.prototype.update = function(ro,col){  
    var cell = this.grid[ro][col]; 
    // Uncomment this. Need to re-set every iteration (and fix typo) 
    cell.neighbours = 0; 
    for(var i = 0; i < cell.checkneighbours.length; i++){ 
     // Get new indices 
     var newRow = ro + cell.checkneighbours[i][0]; 
     var newCol = col + cell.checkneighbours[i][1]; 

     // Check that indices are in range 
     if (newRow >= 0 && newRow < this.grid.length && newCol >= 0 && newCol < this.grid[newRow].length) { 
      if(this.grid[newRow][newCol].alive){ 
       cell.neighbours++; 
      } 
     } 
    } 
}; 
+0

我認爲修好了!歡呼! – eth3king