【问题标题】:Why is the line printed twice?为什么行打印两次?
【发布时间】:2014-07-10 10:25:09
【问题描述】:

我创建了一个简单的井字游戏。一切都运行得很完美,除了在游戏结束时,当程序决定结果时,它会打印最后一行两次。例如,如果玩家 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;

    }
}

}

【问题讨论】:

  • 你调用了两次方法:checkWin(board, player1); checkWin(board, player2);
  • 您之前在代码中使用相同的 checkWin 调用,在您的 while 循环中
  • @Stultuske 这不是问题。
  • @JamesB 确实,我在他的 while 循环定义中使用相同的调用错过了他。

标签: java


【解决方案1】:

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

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.
}

【讨论】:

  • 修复了它。非常感谢
  • @user3824975 如果这解决了您的问题,请将此标记为答案:)
【解决方案2】:

这是由于你的 while 循环:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多