0

내가 만든 알고리즘 (Conway의 Game of Life의 규칙 구현)이 Conway의 GoL과 일치하지 않습니다. 나는 내가 할 수있는 모든 것에 관해서 노력했다. 그러나 그것은 단지 일치하지 않는다.Conway의 Game of Life - 잘못된 알고리즘?

또한 누군가가 무한한 비행기로 만들거나 자체적으로 랩하는 방법을 알고 있다면 내 코드로 구현되는 것을보고 싶을 것입니다. (라인 28)

var x2 = x+1, x3 = x-1, y2 = y+1, y3 = y-1;  // Math 
if(tC[x][y3] !== undefined && tC[x][y3]) ne++;   // T 
if(tC[x][y2] !== undefined && tC[x][y2]) ne++;   // TR 
if(tC[x2] !== undefined) { 
    if(tC[x2][y]) ne++;         // R 
    if(tC[x2][y3] !== undefined && tC[x2][y3]) ne++; // BR 
    if(tC[x2][y2] !== undefined && tC[x2][y2]) ne++; // B 
} 
if(tC[x3] !== undefined) { 
    if(tC[x3][y]) ne++;         // BL 
    if(tC[x3][y3] !== undefined && tC[x3][y3]) ne++; // L 
    if(tC[x3][y2] !== undefined && tC[x3][y2]) ne++; // TL 
} 

그리고 알고리즘 : (라인 50)

if(cell && (ne < 2 || ne > 3)) cell = 0; // Over- or under- populated? 
else if(!cell && ne == 3) cell = 1;  // Give life? 
주변의 살아있는 세포에 대한 세포를 확인

: http://jsfiddle.net/jGkKF/2/

타당한 코드 : JSFiddle 실행

답변

0

명세서

tC = cells; 

은 셀 배열의 복사본을 만들지 않습니다. 정확히 동일한 배열에 대한 두 번째 참조를 만듭니다. 따라서 나중에이 작업을 할 때 :

cells[x][y] = cell; // Setting the cell 

루프가보고있는 것과 동일한 배열을 수정합니다.

또한 이웃을 확인하는 루프에서 undefined과 정확히 일치하는 코드를 코딩했습니다. 그러나 나머지 코드는 빈 셀을 0으로 채 웁니다.

+0

나는 참조를 의미합니다. 그것은 그것이 한정된 사각형이기 때문에 존재하는지, 그리고 그것이 살아 있는지를 검사합니다. 둘 다 맞으면 계산됩니다. – Alca

+0

세대 간을 수행하는 동안 셀 행렬을 업데이트하는 경우, "세계"그리드의 다음 행을 확인해야하는 셀을 수정하므로 작동하지 않습니다. * 두 개의 그리드 사이에서 앞뒤로 전환하여 작업하게 만들 수 있습니다. – Pointy

+0

Ah. 글쎄 그건 최적은 아니지만, 내가 할게. – Alca

1

몇 가지 항목 :

  1. 게임의 규칙은 모두 8 개 주위의 사각형을 확인 말한다. 귀하의 코드를 기반으로, 당신은 단지 그들 중 6을 확인하는 것 같습니다. 편집 : OP는 모두 8을 확인하고 있습니다. 나는 여전히 포인트 2를 권장합니다, 그것은 검사되는 각 셀의 일관된 처리를 허용합니다.
  2. 가장 손쉬운 방법은 검사해야 할 셀 목록을 설정 한 다음 해당 목록을 반복하여 계산하는 것입니다.
  3. 래핑 목록을 설정하려면 셀 목록을 설정할 때 바운드 검사 코드가 있어야합니다 (예 :
    • 경우 cellIndex < 0 다음 cellIndex == maxIndex
    • 경우 cellIndex> = maxIndex 다음 cellIndex = 0 당신은 당신이를 업데이트 할 때 발생할 수있는 "스캔 라인"효과를주의 할 필요가
  4. "다음"세대를 계산하려고 시도하면서 "this"세대를 나타내는 값. 이 두 가지는 독립적으로 저장해야합니다. int 배열을 사용하는 경우 이것은 "this"세대를 0과 1로 저장하는 것을 의미 할 수 있으며 "다음"세대의 라이브 셀은 8을 추가하여 나타낼 수 있습니다. 현재 세대를 처리 한 후 모든 것을 변경> = 8 대 1이고 모든 셀 < 8은 0이됩니다.
+0

8 개가 모두 존재하고 살아 있는지 확인하도록 설정되어 있습니다. 존재하고 살아 있다면, 그것을 계산합니다. – Alca

+0

필자는 4 번에서 언급했듯이 바이올린을 보았고 @Pointy도 "다음"세대와 "이 세대"를 구분하지 않기 때문에 결과가 떨어져 있음을 지적했습니다. http://stackoverflow.com/questions/509579/how-does-variable-assignment-work-in-javascript 및 http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an을 참조하십시오. -object/5344074 # 5344074. 또한 단일 단계 단추를 추가하면 논리를 더 잘 볼 수 있습니다. –

+0

'tC = cells.slice (0);'과거 세대를 잘 저장하는 것처럼 보입니다. 여전히 Conway의 결과 중 어느 것과도 일치하지 않습니다. 내가해서는 안되는 '폭발적인 성장'이 일어나고 있습니다. "블록"과 같은 기본 정적 모양 이외의 패턴은 작동하지 않습니다. – Alca

관련 문제