2016-12-23 3 views
0

여기에 생명의 게임을 만들고 셀의 모든 이웃을 반복하고 점수를 합산하는 함수로 작업합니다 (각 셀은 0 또는 1입니다). 보드는 2 차원 배열로 표현됩니다. 일반적으로 셀에는 8 개의 이웃이 있습니다. 문제는 보드 모서리에있는 셀에는 옆에 3 개의 이웃 셀이 있고 측면에있는 셀에는 5 개가 있습니다. 아래 코드를 사용하여 배열을 반복하면 일부 이웃은 배열에서 정의되지 않은 값을 반환합니다. 나는 0으로 정의되지 않은 변환 점수를 합계하는 것을 사용하려면,하지만 난 오류가 발생합니다 :2 차원 배열로 표현 된 보드에서 셀의 모든 이웃을 반복하는 방법은 무엇입니까?

catch되지 않은 형식 오류 : 속성을 읽을 수 없습니다 '-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 proposition은 많은 문제를 해결합니다. 당신은 기존의 구조를 유지하려면 다음 방법을 고려해

(내가 부울 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 
] 
모든 셀 계산 코드

및 시프트 대응 어레이를 사용

,678,
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); 

    } 

} 

내 코드를 리팩토링 할 때 다른 제안을 시도해보십시오!