2014-07-10 208 views
0

我创建了一个简单的Tic Tac Toe游戏。除了在游戏结束时,程序决定最终打印最后一行两次的结果时,所有内容都运行完美。例如,如果球员1胜它打印:为什么这行打印两次?

播放器1赢得了

播放器1赢得了

我试着写input.nextLine();在用户输入整数之后但没有运气。 在此先感谢。

这里是我的代码:

public static void main(String[] args) { 

    //The board 
    char board[][] = new char [3][3]; 


    //Players' characters 
    char player1 = 'X'; 
    char player2 = 'O'; 
    char turn = 0; 

    int rowNumber; 
    int columnNumber; 
    int count = 0; 

    //Welcome mesage 
    System.out.println("This is a tic tac toe game! \n\n"); 
    System.out.println("Player1 - X \nPlayer 2 - O \n\n"); 

    Scanner input = new Scanner(System.in); 

    //We display the board 
    board(board); 
    while (checkWin(board, player1) && checkWin(board, player2) 
      && fullBoard(board)) { 
     count = count % 2; 
     if (count == 0) { 
      System.out.println("Player 1 turn! \n"); 

      turn = player1; 
      count++; 
     } else if (count == 1) { 
      System.out.println("Player 2 turn!"); 

      turn = player2; 
      count++; 
     } 
     while (true) { 
      System.out.println("Enter a row(1-3):"); 
      rowNumber = input.nextInt(); 
      System.out.println("Enter a column(1-3):"); 
      columnNumber = input.nextInt(); 

      if (board[rowNumber - 1][columnNumber - 1] != 'X' 
        && board[rowNumber - 1][columnNumber - 1] != 'O') { 
       board[rowNumber - 1][columnNumber - 1] = turn; 
       break; 
      } else { 
       System.out.println("Place already taken. Enter again!"); 
      } 
     } 
     board(board); 

     checkWin(board, player1); 
     checkWin(board, player2); 
     fullBoard(board); 
    } 
    System.out.println("Just checking;"); 

} 

public static void board(char board[][]) { 
    System.out.println(board[0][0] + " | " + board[0][1] + " | " 
      + board[0][2]); 
    System.out.println(board[1][0] + " | " + board[1][1] + " | " 
      + board[1][2]); 
    System.out.println(board[2][0] + " | " + board[2][1] + " | " 
      + board[2][2]); 
} 

public static boolean checkWin(char board[][], char player) { 
    if (board[0][0] == player && board[0][1] == player && board[0][2] == player || 
      board[1][0] == player && board[1][1] == player && board[1][2] == player || 
      board[2][0] == player && board[2][1] == player && board[2][2] == player || 
      board[0][0] == player && board[1][0] == player && board[2][0] == player || 
      board[0][1] == player && board[1][1] == player && board[2][1] == player || 
      board[0][2] == player && board[1][2] == player && board[2][2] == player || 
      board[0][0] == player && board[1][1] == player && board[2][2] == player || 
      board[2][0] == player && board[1][1] == player && board[0][2] == player){ 
     if(player == 'X'){ 
      System.out.println("Player 1 has won!"); 
     } 
     else if(player == 'O'){ 
      System.out.println("Player 2 has won!"); 
     } 
     return false; 

    }else { 

     return true; 
    } 

} 

public static boolean fullBoard(char board[][]) { 
    if ((board[0][0] == 'X' || board[0][0] == 'O') 
      && (board[0][1] == 'X' || board[0][1] == 'O') 
      && (board[0][2] == 'X' || board[0][2] == 'O') 
      && (board[1][0] == 'X' || board[1][0] == 'O') 
      && (board[1][1] == 'X' || board[1][1] == 'O') 
      && (board[1][2] == 'X' || board[1][2] == 'O') 
      && (board[2][0] == 'X' || board[2][0] == 'O') 
      && (board[2][1] == 'X' || board[2][1] == 'O') 
      && (board[2][2] == 'X' || board[2][2] == 'O')){ 

     System.out.println("It's a tie!"); 
     return false; 

    }else { 

     return true; 

    } 
} 

}

+1

调用方法两次:checkWin(板,PLAYER1); checkWin(board,player2); – Stultuske

+0

您在代码中使用相同的checkWin调用,在while循环中 – Stultuske

+0

@Stultuske这不是问题。 – JamesB

回答

2

因为你调用方法两次,一次是在循环条件和第二内环。

while (checkWin(board, player1) && checkWin(board, player2) 
     && fullBoard(board)) { 

    .... 

    checkWin(board, player1); 
    checkWin(board, player2); 

} 

你不需要在循环内调用它,条件是它是足够的。 将其更改为以下...

while (checkWin(board, player1) && checkWin(board, player2) 
     && fullBoard(board)) { 

    .... 
    // Remove method call from here. 
} 
+1

修复它。非常感谢您 – Mailat1021

+2

@ user3824975如果此问题解决了您的问题,请将此标记为答案:) –

0

这是由于while循环在这里:

while (checkWin(board, player1) && checkWin(board, player2) 
     && fullBoard(board)){ 
    // stuff 
    // and then again... 
    checkWin(board, player1); 
    checkWin(board, player2); 
    fullBoard(board); 
}