2013-05-30 5 views
2

프로그래밍 클래스를 사용했는데 제대로되지 않은 이전 프로그램을 다시 방문합니다. 이 게임은 Game of Life 프로그램이며 코드 정리에 대한 질문이 있습니다.요소가 부울 배열에 존재하는지 확인

인접 요소의 부울 값이 true 또는 false인지 확인하기 전에 배열 요소가 경계에 있는지 확인해야합니다. firstGen[0][0]의 왼쪽 위 (한 행 위쪽, 왼쪽 하나의 열)가 범위 내에 있는지 확인하는 설명이 있습니다. 요소가 경계에 있는지 확인하거나 if 문당 && 개의 조건을 사용하지 않고 요소 검사를 지정된 배열의 경계로 제한하는보다 쉽고 세련된 방법이 있습니까?

여기까지는 처음으로 if 문을 변경 했으므로 다른 곳에서는 오류가있을 수 있습니다. 나는 또한 다른 이웃들에 대한 경계 검사를 제외했다.

public static boolean[][] generation(boolean[][] firstGen) 
    { 
    int length = firstGen.length; 
    boolean[][] newGen = new boolean[length][length]; 

    for (int j = 0; j < firstGen[0].length; j++) 
     { for (int i = 1; i < firstGen.length; i++) 
      { 
       int count = 0; 
       if ((i-1 >= 0) && (i-1 < length) && (j-1 >= 0) && (j-1 < length)) //top-left element exists 
        { if (newGen[i-1][j-1] == true) count++; } //increment `count` if top-left element is true 

       if ((newGen[i][j] == false) && (count == 3)) newGen[i][j] = true; 
       else if ((newGen[i][j] == true) && (count == 1)) newGen[i][j] = false; 
       else if ((newGen[i][j] == true) && (count > 3)) newGen[i][j] = false; 
       else break; 
      } 
     } 
     return newGen; 
     } 

답변

3

ij가 경계에있는 경우, 당신은 i - 1 < lengthj - 1 < length 모두에 해당하는지 확실히 알고있다. 또한

:

  • i - 1 >= 0i > 0
  • if (condition == true)을 쓸 수는 그래서 당신은 대체 할 수

if (cond)를 다시 작성할 수 있습니다 :

if ((i-1 >= 0) && (i-1 < length) && (j-1 >= 0) && (j-1 < length)) //top-left element exists 
    { if (newGen[i-1][j-1] == true) count++; } //increment `count` if top-left element is true 

기준 :

//increment `count` if top-left element is true 
if (i > 0 && j > 0 && newGen[i-1][j-1]) count++; 
+0

+1 갑자기 간단합니다 .--) 나는 그가 다음 단계에서 필요로하는 것을 추가로 추천 할 것입니다 : 코드 반복없이 모든 이웃을 통과하는 우아한 방법. –

+0

@assylias 때때로 자바 솔루션은 매우 간단합니다. 그들은 일을 불필요하게 복잡하게 만들기 위해 머리를 벽에 부딪히는 것을 원하는 종류의 tat입니다.또한 진실하고 틀린 부울 조건에 대한 알림을 보내 주셔서 감사드립니다. 다시 말하지만, 그런 데드. – rice2007

+0

@Marko 아주 잘 풀리지는 못하지만, 다음 단계도 처리 할 정신적 인 해결책이 있습니다. 중첩 된 'for'루프를 생각하고 있습니다. – rice2007

1

그 범위를 벗어나지 만, 일반적으로 대체 방법이 무엇인지, 그리고 Game of Life와 같은 프로그램이 더 흥미 진진한 결과를 낳을 것이라고 생각하는 가장 좋은 방법은주기적인 경계를 추가하는 것입니다. 기본적으로 이는 한쪽 가장자리에서 벗어나면 다른 쪽에서 끝납니다 (pac-man과 같습니다). 그것은 복잡하게 들리지만 실제로 필요한 것은 두 함수 사이의 나눗셈의 나머지를 반환하는 % 함수입니다. 그래서

:

27 % 5 = 2; 

그래서 정기적 인 boundries을 추가하기 위해이 같은 x와 y 위치를 업데이트 할 것입니다 :

x = (x + xStep + horizontalSize) % horizontalSize; 
y = (y + yStep + verticalSize) % verticalSize; 
xStep 및 yStep는 1 또는입니다

-1 어떤 방향에 따라 가고 싶다. (이것은 for 루프와 잘 어울립니다.) 크기의 추가는 테두리에 가까워지면 0 아래로 가도록하는 것입니다.

다음 지저분한 경계 조건에 대해 걱정할 필요가 없습니다. 모든 것이 단순히 겹칩니다. 각 국경을 확인할 필요가 없습니다. 나는 이것이 의미가 있기를 바랍니다. 그렇지 않은 경우 명확하게 설명하십시오. 랜덤 보행기 프로그램에이 기능을 더 많이 사용했지만 생각은 같습니다.