井字游戏程序循环问题

Tic Tac Toe Program Loop Problems

编辑:我注意到当您为 TicTacToe table 输入不正确的数字时,我的程序输出 "Invalid move"。什么会导致这个?我只使用了一次我的 move(row, col) 方法,所以它不应该重复 Invalid Input 两次。

我一直在构建一个 Tic Tac Toe 程序,我相信我已经完成了 99.9%。有一个我无法弄清楚的讨厌循环,一段时间以来我一直在添加一些东西来尝试修复它。我认为这只是一个我自己似乎无法注意到的小错误。

无论如何,问题是一旦我完成游戏并输入“是”,程序就会终止并结束。可能是什么原因造成的,因为我将我的 while 循环放在另一个 do while 循环中,这样我就可以跳出它,然后立即返回它。

这是我的全部代码。

import java.util.Scanner;

public class TicTacToe {

// These two variables are for placing the X's and O's in the TicTacToe
// table.
static int row;
static int col;

// This array is for the TicTacToe table.
static char[][] table = new char[3][3];

// This is for ending the while statement that controls the game
static boolean continuePlaying = true;
static boolean quitGame = false;

// These will store the names for player 1 and 2
static String p1;
static String p2;

// This variable is to count the number of games played
static int gamesCounter = 0;

// This variable is to count the number of moves
static int moveCounter = 0;

// These two variables are to keep track of the wins each player has
static int p1Wins = 0;
static int p2Wins = 0;

static void clearTable() {
    for (int i = 0; i < table.length; i++) {
        table[0][i] = ' ';
        table[1][i] = ' ';
        table[2][i] = ' ';

    }
}

// This method will determine if the game is a tie.
static boolean checkTie() {
    for (int i = 0; i < table.length; i++) {
        for (int j = 0; j < table[i].length; j++) {
            if (table[i][j] == ' ') {
                return false;
            }
        }
    }
    return true;
}

// This is my displayTable() method. This will show the table and the X's or
// O's each player has played
static void displayTable() {
    System.out.println("  0  1  2");
    System.out.println("0[" + table[0][0] + "][" + table[0][1] + "]["
            + table[0][2] + "]");
    System.out.println("1[" + table[1][0] + "][" + table[1][1] + "]["
            + table[1][2] + "]");
    System.out.println("2[" + table[2][0] + "][" + table[2][1] + "]["
            + table[2][2] + "]");
}

// This is my move(int row,int col) method. This will record the moves each
// player takes and insert X's or O's depending on which player
static boolean move(int row, int col) {
    // This if statement will return false if the user enters in coordinates
    // outside the 3x3 zone.
    if (row > 2 || row < 0) {
        System.out.println("Invalid move.");
        return false;
    }
    // This if statement checks if the array already has an X or O in the
    // chosen space. If the array is already filled it will return false.
    else if (table[row][col] == 'X' || table[row][col] == 'O') {
        System.out.println("Not available.");
        return false;
    } else
        return true;
}

// This is my checkRow method. It checks for 3 X's or O's in a row. If there
// are 3 in a row it will return true, if not, it returns false.
static boolean checkRow(int row) {
    if ((table[row][0] & table[row][1] & table[row][2]) == 'X')
        return true;
    if ((table[row][0] & table[row][1] & table[row][2]) == 'O')
        return true;
    else
        return false;
}

// This is my checkCol method. It checks for 3 X's or O's in a row. If there
// are 3 in a row it will return true, if not, it returns false.
static boolean checkCol(int col) {
    if ((table[0][col] & table[1][col] & table[2][col]) == 'X')
        return true;
    if ((table[0][col] & table[1][col] & table[2][col]) == 'O')
        return true;
    else
        return false;
}

// This is my checkDiagonal method. It checks for 3 X's or O's in a row. If
// there are 3 in a row it will return true, if not, it returns false.
static boolean checkDiagonal() {
    if ((table[0][0] & table[1][1] & table[2][2]) == 'X')
        return true;
    if ((table[2][0] & table[1][1] & table[0][2]) == 'X')
        return true;
    if ((table[0][0] & table[1][1] & table[2][2]) == 'O')
        return true;
    if ((table[2][0] & table[1][1] & table[0][2]) == 'O')
        return true;
    else
        return false;
}

// This is my checkWinner method. It runs all the other checks to see if
// anyone won.
// If there is a winner the method returns true. If there is no winner yet,
// the method returns false.
static boolean checkWinner() {
    if (checkRow(0) == true)
        return true;
    if (checkRow(1) == true)
        return true;
    if (checkRow(2) == true)
        return true;
    if (checkCol(0) == true)
        return true;
    if (checkCol(1) == true)
        return true;
    if (checkCol(2) == true)
        return true;
    if (checkDiagonal() == true)
        return true;
    else
        return false;
}

public static void main(String[] args) {
    // The Scanner for asking each player's names
    Scanner s = new Scanner(System.in);

    // The beginning structure of the TicTacToe program
    System.out.println("TicTextToe");
    System.out.print("Name of player 1: ");
    p1 = s.nextLine();

    // Asks for Player 2's name
    System.out.print("Name of player 2: ");
    p2 = s.nextLine();

    do {

        // The TicTacToe table set up, coordinates provided around the
        // squares
        // The displayTable() method will be used to display the table here.
        while (continuePlaying == true) {
            displayTable();
            System.out.print("Player " + p1 + ":");
            row = s.nextInt();
            col = s.nextInt();
            move(row, col);

            // This will display the table again and ask for proper
            // coordinates.
            while (move(row, col) == false) {
                displayTable();
                System.out.println("Player " + p1 + ":");
                row = s.nextInt();
                col = s.nextInt();
                move(row, col);
            }

            // This inputs the X into the table if move(row, col) returns
            // true.
            if (move(row, col) == true) {
                moveCounter++;
                table[row][col] = 'X';
            }

            // This will check if p1 just won the game or if the game needs
            // to
            // continue
            checkRow(0);
            // System.out.println(checkRow(0)); //This prints out if row 0
            // is
            // true or false
            checkRow(1);
            // System.out.println(checkRow(1)); //This prints out if row 1
            // is
            // true or false
            checkRow(2);
            // System.out.println(checkRow(2)); //This prints out if row 2
            // is
            // true or false
            checkCol(0);
            // System.out.println(checkCol(0)); //This prints out if column
            // 0 is
            // true or false
            checkCol(1);
            // System.out.println(checkCol(1)); //This prints out if column
            // 1 is
            // true or false
            checkCol(2);
            // System.out.println(checkCol(2)); //This prints out if column
            // 2 is
            // true or false
            checkDiagonal();
            // System.out.println(checkDiagonal()); //This prints out true
            // or
            // false depending on the diagonals
            checkWinner();
            // System.out.println(checkWinner()); //This prints out if
            // checkWinner is true or false. If it's true the while loop
            // should
            // end

            // This will check if there is a tie
            // checkTie();
            if (moveCounter == 9) {
                displayTable();
                System.out.println("It's a tie!");
                gamesCounter++;
                clearTable();
                moveCounter = 0;
                System.out.println("Another Game? Yes/No :");
                String answer = s.next();
                if (answer.equals("Yes")) {
                    break;
                }
                if (answer.equals("No")) {
                    continuePlaying = false;
                    clearTable();
                    System.out.println("Statistics:");
                    System.out.println(p1 + p1Wins + "/" + gamesCounter);
                    System.out.println(p2 + p2Wins + "/" + gamesCounter);
                    quitGame = false;
                    break;
                }
            }

            if (checkWinner() == true) {
                displayTable();
                System.out.println("Player " + p1 + " wins!");
                gamesCounter++;
                p1Wins++;
                clearTable();
                moveCounter = 0;
                System.out.println(p1 + " " + p1Wins + "/" + gamesCounter);
                System.out.println(p2 + " " + p2Wins + "/" + gamesCounter);
                System.out.println("Another game? Yes/No :");
                String answer = s.next();
                if (answer.equals("Yes")) {
                    break;
                } else if (answer.equals("No")) {
                    continuePlaying = false;
                    System.out.println("Statistics:");
                    System.out.println(p1 + p1Wins + "/" + gamesCounter);
                    System.out.println(p2 + p2Wins + "/" + gamesCounter);
                    quitGame = false;
                    break;
                }
            }

            displayTable();
            System.out.print("Player " + p2 + ":");
            row = s.nextInt();
            col = s.nextInt();
            move(row, col);

            // This will display the table again and ask for proper
            // coordinates.
            while (move(row, col) == false) {
                displayTable();
                System.out.println("Player " + p2 + ":");
                row = s.nextInt();
                col = s.nextInt();
                move(row, col);
            }

            // This inputs the O into the table if move(row, col) returns
            // true.
            if (move(row, col) == true) {
                moveCounter++;
                table[row][col] = 'O';
            }

            // This will check if p2 just won the game or if the game needs
            // to
            // continue
            // checkRow(0);
            // System.out.println(checkRow(0)); //This prints out if row 0
            // is
            // true or false
            checkRow(1);
            // System.out.println(checkRow(1)); //This prints out if row 1
            // is
            // true or false
            checkRow(2);
            // System.out.println(checkRow(2)); //This prints out if row 2
            // is
            // true or false
            checkCol(0);
            // System.out.println(checkCol(0)); //This prints out if column
            // 0 is
            // true or false
            checkCol(1);
            // System.out.println(checkCol(1)); //This prints out if column
            // 1 is
            // true or false
            checkCol(2);
            // System.out.println(checkCol(2)); //This prints out if column
            // 2 is
            // true or false
            checkDiagonal();
            // System.out.println(checkDiagonal()); //This prints out true
            // or
            // false depending on the diagonals
            checkWinner();
            // System.out.println(checkWinner()); //This prints out if
            // checkWinner is true or false. If it's true the while loop
            // should
            // end

            // This will check if there is a tie
            // checkTie();
            if (moveCounter == 9) {
                displayTable();
                System.out.println("It's a tie!");
                gamesCounter++;
                clearTable();
                moveCounter = 0;
                System.out.println("Another Game? Yes/No :");
                String answer = s.next();
                if (answer.equals("Yes")) {
                    break;
                }
                if (answer.equals("No")) {
                    continuePlaying = false;
                    clearTable();
                    System.out.println("Statistics:");
                    System.out.println(p1 + p1Wins + "/" + gamesCounter);
                    System.out.println(p2 + p2Wins + "/" + gamesCounter);
                    quitGame = false;
                    break;
                }
            }

            if (checkWinner() == true) {
                displayTable();
                System.out.println("Player " + p2 + " wins!");
                gamesCounter++;
                p2Wins++;
                clearTable();
                System.out.println(p1 + " " + p1Wins + "/" + gamesCounter);
                System.out.println(p2 + " " + p2Wins + "/" + gamesCounter);
                System.out.println("Another game? Yes/No :");
                String answer = s.next();
                if (answer.equals("Yes")) {
                    break;
                }
                if (answer.equals("No")) {
                    continuePlaying = false;
                    clearTable();
                    System.out.println("Statistics:");
                    System.out.println(p1 + p1Wins + "/" + gamesCounter);
                    System.out.println(p2 + p2Wins + "/" + gamesCounter);
                    quitGame = true;
                    break;
                }

            }

        }

    } while (quitGame = false);
}
}

您的条件检查有效:

while (quitGame = false);

应该是:

while (quitGame == false);

双等号。