2016-02-26 82 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