2016-10-26 14 views
3

学校プロジェクトのためにConwayのGame of LifeのJavaScriptバージョンをプログラミングする必要がありますが、我々はエッジをループすることに固執しています。すべて正常に動作しますが、近傍にあるセルではネイバー数を計算する関数は機能しません(配列外の値を評価する必要があるため未定義です)。いくつかのオプションを試しましたが、それらはすべてプログラムの残りの機能を変更します。Stuck programming JSのConwayの "Game of Life"

グリッドのエッジで機能させるために追加する必要があるのは何ですか?

var totalNeighbors = function(x, y) { 
 
    var total = 0; 
 

 
    if (x > 0 && cells[(x - 1)][y] == 1) { 
 
     total++; 
 
    } 
 

 
    if (x < (width - 1) && cells[x + 1][y] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y > 0 && cells[x][y - 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y < (height - 1) && cells[x][y + 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y > 0 && x > 0 && cells[x - 1][y - 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y > 0 && x < (width - 1) && cells[x + 1][y - 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y < (height - 1) && x > 0 && cells[x - 1][y + 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y < (height - 1) && x < (width - 1) && cells[x + 1][y + 1] == 1) { 
 
     total++; 
 
    } 
 

 
    return total; 
 
};

ありがとう!私はより多くのこのようなものでいいと思う

+0

エッジでブロックしているかどうかを確認してください。そうであれば、あなたができないものにアクセスしようとしないでください。私は、それらのすべてがリファクタリングできると思う。そうすることで、ポイント1を簡単に適用できます。 (エッジアクセスをゼロ番目までループする必要がある場合は、モジュラス '%'はあなたの友人です) –

+0

「エッジのブロック」とはどういう意味ですか? 'if'sをリファクタリングする方法に関する提案はありますか?私たちはそれを試して、それはさらに長いハハと判明した。 – Dat8StringGuy

+0

「端にブロックする」とは、1つ以上の面にセルがないセルです(つまり、セルの上にセルがありません、セルの横に、セルの下にセルがあります)。食料品店、私は戻ってそれをリファクタリングで私の手を試すことができます。 (それはもっと長い解決策に終わるかもしれませんが、それはもっと洗練された解決策でなければなりません) –

答えて

3

:あなたが見ることができるように
は、私は少しリファクタリング。

var isvalid = function(x, y) { 
     /* 
     * This returns 1 if cells[x][y] == 1. 
     * Otherwise, we return 0. 
     * NOTE: If cells[x, y] is out of bounds, we return 0. 
     * GLOBALS USED: cells, width, and height. 
     */ 

     //This returns true if (index < size && index >= 0) 
     //Used to check that index is not an invalid index. 
     var inbounds = function (size, index) { 
       return (index >= 0 && index < size); 
     }; 

     //given point is out of bounds 
     if (!inbounds(width, x) || !inbounds(height, y)) { 
       return 0; 
     } 

     //everything is good 
     return (cells[x][y] === 1) ? 1 : 0; 
    }; 

var totalNeighbors = function(x, y) { 
    var total = 0; 

    //cells[x-1][y] 
    total += isvalid(x-1, y); 

    //cells[x + 1][y] 
    total += isvalid(x+1, y); 

    //cells[x][y - 1] 
    total += isvalid(x, y-1); 

    //cells[x][y + 1] 
    total += isvalid(x, y+1); 

    //cells[x - 1][y - 1] 
    total += isvalid(x-1, y-1); 

    //cells[x + 1][y - 1] 
    total += isvalid(x+1, y-1); 

    //cells[x - 1][y + 1] 
    total += isvalid(x-1, y+1); 

    //cells[x + 1][y + 1] 
    total += isvalid(x+1, y+1); 

    return total; 
}; 

PS:あなたのオリジナルのコードサンプルはコメントなし37行です。私のコードサンプルは5230 コメントと33行コメントなしです。

私の知る限りでは、この方法はよりクリーンで短くなります。 ;)

関連する問題