井字游戏程序循环问题
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);
双等号。
编辑:我注意到当您为 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);
双等号。