为什么线打印两次?

时间:2014-07-10 10:25:09

标签: java

我创造了一个简单的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;

    }
}

}

2 个答案:

答案 0 :(得分: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 :(得分:0)

这是因为你的while循环:

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