2016-12-23 7 views
0

ライフゲームをここに構築し、セルのすべての隣接セルをループし、スコアを合計する(各セルは0または1)関数に取り組んでいます。ボードは2次元配列で表されます。通常、セルには8つの隣接セルがあります。問題は、ボードのコーナーにあるセルには3つの近傍しかなく、側にあるセルには5があるということです。以下のコードを使用して配列をループすると、配列内で未定義のセルが返されます。私は0に未定義の変換とスコアを合計することを利用したいが、私はエラーを取得:2次元配列で表されるボード内のセルのすべての近傍をループする方法は?

キャッチされない例外TypeError:プロパティを読み取ることができません「-1」あなたの助けを

未定義のおかげで!

var array = [ 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1], 
    [0,0,1,0,1,0,1,0,1,1] 
] 

for(var i=0; i < array.length; i++){ 
    for(var j=0; j < array[i].length; j++){ 

    var totalScore = 0;   
    var scores = [ 
     //i = row in loop 
     //j = column nested loop 
     array[i-1][j-1], 
     //upper left corner 
     array[i-1][j], 
     //top side 
     array[i-1][j+1], 
     //upper right corner 
     array[i][j-1], 
     //left side 
     array[i][j+1], 
     //right side 
     array[i+1][j-1], 
     //bottom left corner 
     array[i+1][j], 
     //bottom side 
     array[i+1][j+1] 
     //bottom right corner 
     ]; 

     scores.forEach(function(item){ 

       var score = item; 
       if(score === "undefined"){ 

       score = 0; 

       } 

       totalScore += score; 

      }) 

      console.log(totalScore);  

    } 

} 
+0

'array [i-1] [j-1]'は最初の反復では存在しない配列内の '-1'インデックスを探します。 – Mairaj

+0

'array [i + 1] [j + 1]'は最後の繰り返しに対しても存在しない '10番目のインデックス 'を探します。 – Mairaj

+0

ありがとうございますが、要素が存在しないときにスコア0を設定する方法はありますか? – chemook78

答えて

1

@Matt Timmermansの命題は、多くの問題を解決します。あなたは、既存の構造を維持したい場合は、次のアプローチを検討してください。

(私はブール値が0/1として評価されたと仮定)マトリックス内のセルの位置を記述したフォームコード:すべての可能な組み合わせを含む

dxdy_code = (y==0) + (x==0)<<1 + (y==height-1)<<2 + (x==width-1)<<3; 

ビルド配列(近隣のサイズ16、バイナリ0b0000..0b1111)はシフト:

var dxdy = [ 
[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]], //all 
[[0,-1],[0,1],[1,-1],[1,0],[1,1]], //y=0 
[[-1,0],[-1,1],[0,1],[1,0],[1,1]], //x=0 
[[0,1],[1,0],[1,1]], //y=0,x=0 
[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1]], //y=max 
[[0,-1],[0,1]], //one row 
[[-1,0],[-1,1],[0,1]], //y=max,x=0 
.. 
[] //one row, one column 
] 
各セルの計算コードについて

及びシフトの対応するアレイを使用

for(var i=0; i < array.length; i++){ 
    for(var j=0; j < array[i].length; j++){ 
    var totalScore = 0; 
    code = dxdy_code(i, j); 
    sh = dxdy[code]; 
    for (var k=0; k < sh.length; k++){ 
     totalscore += array[i+sh[k][0]][j+sh[k][1]]; 
    } 
2

境界チェックのだけたくさん:

var scores = [ 
    i > 0 && j > 0 ? array[i-1][j-1] : 0, 
    i > 0 ? array[i-1][j] : 0, 
    i > 0 && j < array[i].length-1 ? array[i-1][j+1] : 0, 
    j > 0 ? array[i][j-1] : 0, 
    j < array[i].length-1 ? array[i][j+1] : 0, 
    i < array.length-1 && j > 0 ? array[i+1][j-1] : 0, 
    i < array.length-1 ? array[i+1][j] : 0, 
    i < array.length-1 && j < array[i].legnth-1 ? array[i+1][j+1] : 0 
]; 

また、仲介者として機能し、それによってアレイにアクセスするための関数を作成することができます。

function getCell(x,y) { 
    if(y < 0 || y >= array.length || x < 0 || x >= array[0].length) { 
    return 0; 
    } 
    return array[y][x]; 
} 
0

みんなありがとうを。あなたの助けを借りて私は以下のように解決しました:

var array = [ 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1], 

    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1] 

] 

for (var i = 0; i < array.length; i++) { 

    for (var j = 0; j < array[i].length; j++) { 

    var scores = [ 
     i > 0 && j > 0 ? array[i - 1][j - 1] : 0, 
     i > 0 ? array[i - 1][j] : 0, 
     i > 0 && j < array[i].length - 1 ? array[i - 1][j + 1] : 0, 
     j > 0 ? array[i][j - 1] : 0, 
     j < array[i].length - 1 ? array[i][j + 1] : 0, 
     i < array.length - 1 && j > 0 ? array[i + 1][j - 1] : 0, 
     i < array.length - 1 ? array[i + 1][j] : 0, 
     i < array.length - 1 && j < array[i].length - 1 ? array[i + 1][j + 1] : 0 
    ] 

    var totalScore = scores.reduce(function(total, currentValue) { 

     return total += currentValue; 

    }) 

    console.log(totalScore); 

    } 

} 

私のコードをリファクタリングする際に他の提案を試してみましょう!

関連する問題