2015-01-17 6 views
0

나는 play 및 hasWon 메서드를 사용하여 Tic Tac Toe 게임 클래스를 만들려고했습니다. 메인 클래스에서 호출 할 때NXN Tic Tac Toe 게임에서 승자 결정

public class TicTacToe { 

private enum State{Blank, X, O} 
private int grid; 
private State[][] board = new State[grid][grid]; 
private int moves; 


//Default Constructor 
public TicTacToe(int grid){ 

    board = new State[grid][grid]; 
    moves = 0; 
} 
public void play(State s, int m, int n){ 

    if (board[m][n] == State.Blank){ 
     board[m][n] = s; 
    } 
    moves++; 
} 




public boolean hasWon(State[][] board){ 

    //check winner in rows 
    boolean state = false; 
    int j = 0; 
    int i = 0; 
    while(j <= grid) { 
     for (i = 0; i <= grid; i++) { 
      if (board[j][i] == board[j][i + 1]) 
       state = true; 
      else state = false; 
      break; 

     } 
     if(state == false) 
      j++; 
     else return true; 

    } 
    //check winner in columns 
    while(j <= grid) { 
     for (i = 0; i < grid; i++) { 
      if (board[i][j] == board[i + 1][j]) 
       state = true; 
      else state = false; 
      break; 

     } 
     if (state == true) 
      j++; 
     else return true; 
    } 
    //check winner in top diagonal 
    while(j <= grid && i <= grid){ 
     if (board[i][j] == board[i+1][j+1]) 
      state = true; 
     else state = false; 
     break; 

     i++; 
     j++; 
     return true; 
    } 


    //check winner in bottom diagonal 
    int k = grid; 
    int l = grid; 
    while(k >= 0 && l >= 0){ 
     if (board[k][l] == board[k-1][l-1]) 
      state = true; 
     else state = false; 
     break; 
     k--; 
     l--; 
     return true; 
    } 


    return false; 
} 

}

그러나 프로그램이 비정상적으로 동작합니다. 코드에 논리적 인 문제가 있습니까?

for (i = 0; i < n; i++) { 
    if (board[j][i] == board[j][i + 1]) 
     state = true; 
} 

하여 행을 검사 할 때 행의 마지막 두 문자는 독립적으로 해당 행의 이전 문자의 같은 경우

+0

무엇을 " 엉뚱한 "뜻은 정확히? – Todd

+0

어떤 경우에는 그렇지 않은 사람에게 승자를줍니다. –

+0

몇 번이나 연속으로 들어야합니까? 삼? – Bubletan

답변

0

이 코드는 항상 true로 상태를 설정합니다.

열과 대각선 (똑같이 Todd가 말한 것만 확인)에 대해서도 마찬가지입니다.

당신은 당신이 동일하지 않은 일부 값을 발견하면 해당 행에 대한 값을 비교 중지하려면 : 행과 대각선 (들)에 대한

for (i = 0; i < n; i++) { 
    if (board[j][i] == board[j][i + 1]) { 
     state = true; 
    } else { 
     state = false; 
     break; 
    } 
} 

동일합니다.

편집 : 는 또한 : 당신은 생성자에서 필드 그리드를 설정하지 않는, 그래서 항상 0이고 당신이 누락 된 완전한 행, 열, 대각선
확인되지 않습니다

this.grid = grid; 
+0

편집 결과 배열을 변경합니다. –

+0

@Clockwork'break' 명령이 루프를 첫 번째 반복에서 직접 멈추게하므로 편집 한 방식대로 작동하지 않습니다. 'break '는 다른 값을 감지 할 때에 만 사용해야합니다. – flo