2016-10-26 3 views
3

학교 프로젝트를 위해 Conway 's Game of Life의 JavaScript 버전을 프로그래밍해야하지만 가장자리를 반복해야합니다. 모든 것은 잘 작동하지만 정의되지 않은 배열 외부의 값을 평가해야하기 때문에 이웃 수를 계산하는 함수는 가장자리에있는 셀에서 작동하지 않습니다. 우리는 몇 가지 옵션을 시도했지만 프로그램의 나머지 기능을 모두 변경합니다.Stuck programming JS의 Conway 's "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

가장자리가 블록인지 확인하십시오. 그렇다면 접근 할 수없는 것들에 접근하려고 시도하지 마십시오. 나는 모든'if'가 리팩토링 될 수 있다고 생각합니다. 그렇게하면 포인트 1을 쉽게 적용 할 수 있습니다. (가장자리 접근을 제로까지 순환시켜야한다면, 모듈러스 '%'는 당신의 친구입니다.) –

+0

"가장자리의 블록"이란 무엇을 의미합니까? 'if's를 리팩토링하는 방법에 대한 제안? 우리는 그것을 시험해 보았다. 그리고 그것은 심지어 더 오랫동안 haha로 밝혀졌다. – Dat8StringGuy

+0

"가장자리에있는 블록"이란 말은 하나 이상의면에 셀이없는 셀입니다 (즉, 셀 위나 아래에 셀이 없음). 식료품 점에 가서 리팩토링 할 때 다시 손을 잡을 수 있습니다. (더 길어진 해결책 * line *으로 끝날 수도 있지만, 더 깨끗한 솔루션이어야합니다.) –

답변

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; 
}; 

추신 : 원래 코드 샘플은 코멘트를하지 않고 37 라인 입니다. 내 코드 샘플은 012 라인이고 이고, 라인은 이고 코멘트가없는 라인은입니다.

내가 할 수있는 한 가까이에서,이 방법은 더 깨끗하고 짧습니다. ;)

관련 문제