2017-06-14 16 views
0

楽しい小さなプロジェクトのために、私はjavascriptで人生のコンウェイのゲームをプログラムすることに決めました。私のロジックは理にかなっているように見えますが、個々の機能は仕事をしていますが、意図した結果が得られません。グリッドと呼ばれる配列があり、すべてのセルの値が格納されています。私はそれぞれの個々のセルをチェックし、8つの周囲のセルすべてをチェックして隣のセルをチェックし、他のセルごとに繰り返します。ある時点で、私のグリッドは正しい値を保存せずにリセットされます。この時点で、私はそれがJavaScriptの問題だと思っています。ライフアレイのJavascriptゲームがリセットされる

<body> 
 
    <style> 
 
    * { 
 
     padding: 0; 
 
     margin: 0; 
 
    } 
 
    
 
    body { 
 
     overflow: hidden; 
 
    } 
 
    
 
    canvas { 
 
     background: #FFFFFF; 
 
     display: block; 
 
     margin: 0 auto; 
 
    } 
 
    </style> 
 
    <canvas id="canvas" style="border:1px solid #000000;"></canvas> 
 
</body> 
 
<script> 
 
    var canvas = document.getElementById("canvas"); 
 
    var ctx = canvas.getContext('2d'); 
 
    canvas.width = window.innerWidth; 
 
    canvas.height = window.innerHeight; 
 
    var Game = {}; 
 
    var nextGrid, emptyGrid, grid; 
 
    Game.horCells = 30; 
 
    Game.cellSize = canvas.width/Game.horCells; 
 
    Game.verCells = Math.floor(canvas.height/Game.cellSize); 
 
    Game.startLives = 80; 
 

 
    config(); 
 
    //setInterval(run, 1000); 
 

 
    function config() { 
 
    console.log("in config"); 
 
    emptyGrid = newGrid(Game.horCells, Game.verCells); 
 
    grid = emptyGrid; 
 
    nextGrid = emptyGrid; 
 
    //Manual Setup 
 
    for (var i = 0; i < Game.startLives; i++) { 
 
     //grid[getRandomInt(0, Game.horCells - 1)][getRandomInt(0, Game.verCells - 1)] = true; 
 
    } 
 
    grid[0][3] = true; 
 
    grid[1][3] = true; 
 
    grid[2][3] = true; 
 
    } 
 

 
    function run() { 
 
    console.log("gread" + grid[3][3]); 
 
    draw(); 
 
    update(); 
 
    } 
 

 

 
    function draw() { 
 
    console.log("Draw"); 
 
    ctx.fillStyle = "#FFFFFF"; 
 
    ctx.fillRect(0, 0, canvas.width, canvas.height); 
 
    for (var i = 0; i < Game.horCells; i++) { 
 
     for (var j = 0; j < Game.verCells; j++) { 
 
     if (grid[i][j] === false) { 
 
      ctx.fillStyle = "#FFFFFF"; 
 
     } else if (grid[i][j] === true) { 
 
      console.log("drawing live"); 
 
      ctx.fillStyle = "#000000"; 
 
     } 
 
     ctx.fillRect(i * Game.cellSize, j * Game.cellSize, Game.cellSize, Game.cellSize); 
 
     } 
 
    } 
 
    } 
 

 
    function update() { 
 
    for (var p = 0; p < Game.horCells; p++) { 
 
     for (var k = 0; k < Game.verCells; k++) { 
 
     nextGrid[p][k] = survival(p, k); 
 
     } 
 
    } 
 
    } 
 

 
    function survival(x, y) { 
 
    var neighbours = 0; 
 
    for (var l = 0; l < 3; l++) { 
 
     for (var m = 0; m < 3; m++) { 
 
     var sx = (x - 1) + l; 
 
     var sy = (y - 1) + m; 
 
     //Check bounds 
 
     if (inBounds(sx, sy) === true && grid[sx][sy]) { 
 
      neighbours++; 
 
     } 
 
     } 
 
    } 
 
    if (grid[x][y]) { 
 
     neighbours--; 
 
     if (neighbours === 2 || neighbours === 3) { 
 
     return true; 
 
     } else if (neighbours < 2 || neighbours > 3) { 
 
     console.log("DIED"); 
 
     return false; 
 
     } 
 
    } else if (grid[x][y] === false && neighbours === 3) { 
 
     return true; 
 
    } else { 
 
     console.log("DIED"); 
 
     return false; 
 
    } 
 
    } 
 

 
    function inBounds(x, y) { 
 
    return (x >= 0 && x < Game.horCells && y >= 0 && y < Game.horCells); 
 
    } 
 

 
    function newGrid(xCells, yCells) { 
 
    var gridd = new Array(xCells); 
 
    for (var i = 0; i < xCells; i++) { 
 
     gridd[i] = new Array(yCells); 
 
    } 
 

 
    for (var j = 0; j < xCells; j++) { 
 
     for (var k = 0; k < yCells; k++) { 
 
     gridd[j][k] = false; 
 
     } 
 
    } 
 
    return gridd; 
 
    } 
 

 

 
    function getRandomInt(min, max) { 
 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
 
    } 
 
</script>

+1

「ある時点で、グリッドに正しい値とリセットが保存されなくなった」ということを具体的に説明できますか? Javascript配列は単純に動作を停止しません。その場合、ウェブはひどく壊れてしまいます。 – Carcigenicate

+0

'emptyGrid = newGrid(Game.horCells、Game.verCells); grid = emptyGrid; nextGrid = emptyGrid; 'は少し不便です。両方の参照を同じ可変グリッドに割り当てています。 2つの別々の空のグリッドを作成してみてください。 – Carcigenicate

+0

また、 'newGrid'と' grid'を入れ替えることも決してありません。 – Carcigenicate

答えて

0
emptyGrid = newGrid(Game.horCells, Game.verCells); 
grid = emptyGrid; 
nextGrid = emptyGrid 

グリッドを作成し、その後、同じオブジェクトgridnextGridを割り当てます。ここでも、gridnextGridは同じオブジェクトです。あなたが1に加えた変更は、もう一方に対して起こります。

彼らは独立して変更することができるので、2つの別々のグリッドを作成します。

grid = newGrid(Game.horCells, Game.verCells); 
nextGrid = newGrid(Game.horCells, Game.verCells); 

それとも、少しそれをneatenする:

var g =() => newGrid(Game.horCells, Game.verCells); 

grid = g(); 
nextGrid = g(); 

だけコメントで質問をクリアするには:

var g =() => newGrid(Game.horCells, Game.verCells); 

Is(basi

var g = function() { 
    return newGrid(Game.horCells, Game.verCells); 
} 

「太い矢印」機能として知られています。

両方のビットは同じことを行います。つまり、新しいグリッドを返す関数を作成します。これは、newGrid(Game.horCells, Game.verCells);を2度書く必要がないという利点があります。

functionキーワードの代わりに矢印機能を使用しました。なぜなら、後者は巨大で醜いので、コードをクリーンアップするという目標から離れているからです。

+0

ありがとうございました!これはすべて今や意味をなさない。私は、一方の値を他方の値に割り当てることは、それが現在の状態のみを割り当てると仮定しました。そして、私はemptyGridを参照することができました。もし私がそれを再生成せずにきれいなグリッドを得る必要があれば。 –

+0

@ArinYaldizciyan問題ありません。そして、いいえ。その動作が必要な場合は、不変のデータ構造で作業する必要があります。 Immutable.jsライブラリ、またはClojurescript(JavaScriptにコンパイル)などの言語を探します。 – Carcigenicate

+0

最後のもう一つの質問!あなたの解は表記=>を使いますが、この記法の機能は何ですか?もう一度ありがとう:) –

関連する問題