2014-09-14 6 views
1

은 내가 미친 회전하고 있는지 확실하지 않습니다 그러나 이것은 내 문제가 무엇인지입니다 : 내가 생명의 게임을 programm에 얼마나 많은 주변 필드를 세는 "countalive"방법이게임, 방법 나던 작업

살아있다.

public int countalive(Board board, int yaxis, int xaxis) { //defekt 

    int living = board.getfields()[yaxis - 1][xaxis - 1] + board.getfields()[yaxis - 1][xaxis] + board.getfields()[yaxis - 1][xaxis + 1] + 
      board.getfields()[yaxis][xaxis - 1] + board.getfields()[yaxis][xaxis + 1] + board.getfields()[yaxis + 1][xaxis - 1] + 
      board.getfields()[yaxis + 1][xaxis] + board.getfields()[yaxis + 1][xaxis + 1]; 
    return living; 
} 

이 방법은 완벽하게 정상적으로 작동하는 것 같습니다. 내가이

public Board evolve(Board board) { 
    Board tmpboard = board; 
    System.out.println(countalive(board, 1, 3)); //I test with this. SHOULD AND IS 2!! 
    int aliveneighbours = 0; 
    for (int i = 1; i < board.getfields().length - 1; i++) { 
     for (int j = 1; j < board.getfields()[i].length - 1; j++) { 
      System.out.print("i = " +i); 
      System.out.print("j = " +j +" "); 
      aliveneighbours = countalive(board, i, j); 
      System.out.println(aliveneighbours); 

      if (aliveneighbours == 3) { 
       tmpboard.getfields()[i][j] = 1; 
      } else if (aliveneighbours < 2 || aliveneighbours > 3) { 
       tmpboard.getfields()[i][j] = 0; 
      } 
     } 
     System.out.println(""); 
    } 
    return tmpboard; 
} 

을 할 때 나는 콘솔이 얻을 : 전 = 1, J = 3이 아니라 1이어야한다

2 
i = 1j = 1 1 
i = 1j = 2 1 
i = 1j = 3 1 
i = 1j = 4 1 
i = 1j = 5 0 
... 

비록 당신이합니다 (메소드 countalive를 참조로 board, 1, 3)은 작동하지만 for 루프에서는 다른 결과를 얻는다. 내 오류를 찾을 수 있습니까?

+0

테스트 보드의 상태를 확인해야 할 수도 있습니다. 그러나 이상하게 여겨지는'(Y, X)'에 접근 할 필요가 있음을 언급 할 가치가 있습니다. (컨벤션은'(X, Y)'입니까?) –

+1

이 줄은'Board tmpboard = board; * 현재 게시판? 어떻게 든'tmpboard == board'라고하면 결과가 * 설명 될 수도 있습니다. 즉,'tmpboard '를 변경하여 보드를 변경하고있는 것입니다. 자바의 규칙이 분명하지 않다면 (내가 아닌),'tmpboard'에서 무엇인가를 변경하고'board' 자체를 검사함으로써 테스트 할 수 있습니다. – usr2564301

+0

@Jongware Yes board tmpboard = board에서 나에게 복사본을 제공합니다. 매 반복마다 게시판과 tmpboard를 인쇄 했으므로 옳은 것 같습니다. 또한 보드가 바뀌지 않아도된다. – Peter111

답변

2

반복하는 동안 셀의 활성을 변경하고 있습니다. 당신이해야 할 일은 다음 세대를위한 별도의 배열을 가지고이 세대에 기반한 것을 업데이트하고, 현재 세대를 완전히 보았을 때 그것들을 교환하는 것입니다.

+0

슬프게도, 저는 tmpboard에서 alivnes를 변경하지만, 변경되지 않은 보드에서 이웃들을 돌 봅니다. 결코 보드를 변경하지 않습니다. 그 복사본 (tmpboard) 및 복사본을 반환합니다 편집 : 확인 당신이 옳은 것 같습니다. 왜 원래, 또한 변경 내용을 알 수 없습니다. – Peter111

+1

배열 자바에서 개체입니다. 만약 당신이 배열에 '보드'포인터가 'tmpBoard'를 만들면 둘 다 같은 배열을 가리키게됩니다. 왜 진짜 복사본이 필요한지. – donmarkusi