[英]Noughts & Crosses/Tic Tac Toe Winning condition & clearing the game in Java/Android (long post)
[英]Java - Noughts and Crosses/Tic Tac Toe game winning algorithm not working
最近刚上大学,我们正在教我们如何用Java编程。 如果我们想挑战,建议我们尝试用一段破烂的代码来做一个无与伦比的游戏。
我设法使程序运行正常,X或O显示在板上,并检查行或列中是否存在三个相同的符号,但工作正常,但是出于某种原因,它是否检查是否存在在任何一行上连续三行都行不通,我也不知道为什么。 我问过朋友,他们也不知道为什么它也不起作用(可能是我错过了一些明显的东西)。
为了检查X或O是否获胜,我创建了另一个2D数组,将2放置在板上X的位置,如果放置在O上则将-1放置在-1。然后检查是否存在在行,列和对角线上为-1或1。 如果为-1,则为O的计数器添加1;如果为1,则为X的计数器添加1。
在该函数的末尾,它检查O或X的计数器是否等于3,如果是,则返回true,否则返回false。
这是代码(大约315行代码,以为复制和粘贴整个程序会更容易,因此您可以查看我在其他任何地方是否出错,向下滚动到底部的checkXOrOHasWon
函数,其中损坏的部分是):
代码是:-
import java.util.Scanner;
public class NoughtsAndCrosses {
static int count[][] = new int[4][4];
static char board[][] = new char[4][4];
static String playerOneName;
static String playerTwoName;
static int xCoord;
static int yCoord;
static int noOfMoves;
static int checkO = 0;
static int checkX = 0;
static boolean validMove;
static boolean gameHasBeenWon;
static boolean gameHasBeenDrawn;
static char currentSymbol;
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
initialiseBoard();
System.out.println("What is the name of player one? ");
playerOneName = sc.next();
System.out.println("What is the name of player two? ");
playerTwoName = sc.next();
currentSymbol = 'X';
// Play a game
noOfMoves = 0;
gameHasBeenDrawn = false;
gameHasBeenWon = false;
System.out.println();
displayBoard(board);
System.out.println("\n" + playerOneName + " starts playing " + currentSymbol);
System.out.println();
do { //Play until a player wins or the game is drawn
do { //Get a valid move
xCoord = getX();
yCoord = getY();
System.out.println("");
validMove = checkValidMove(xCoord, yCoord, board);
if (!validMove) {
System.out.println("Coordinates invalid, please try again");
} // end if
} while (!validMove);
board[xCoord][yCoord] = currentSymbol;
displayBoard(board);
gameHasBeenWon = checkXOrOHasWon(board);
noOfMoves++;
if (!gameHasBeenWon) {
// Check if maximum number of allowed moves has been reached
if (noOfMoves == 9) {
gameHasBeenDrawn = true;
} else {
if (currentSymbol == 'X') {
currentSymbol = 'O';
System.out.println(playerTwoName + "'s turn");
} else {
currentSymbol = 'X';
System.out.println(playerOneName + "'s turn");
} // end if/else
} // end if/else
} // end if
} while (!gameHasBeenWon && !gameHasBeenDrawn);
//Display result
if (gameHasBeenWon) {
if ('X' == currentSymbol) {
System.out.println(playerOneName + " congratulations you win!");
} else {
System.out.println(playerTwoName + " congratulations you win!");
}
} else {
System.out.println("A draw this time!");
}
} //end method main
public static void initialiseBoard() {
}
public static void displayBoard(char[][] board) {
int row;
int column;
System.out.println(" | 1 2 3 ");
System.out.println("--+-------");
for (row = 1; row <= 3; row++) {
System.out.print(row + " | ");
for (column = 1; column <= 3; column++) {
System.out.print(board[column][row] + " ");
} // end column
System.out.println();
} // end row
} // end method displayBoard
public static int getX() {
System.out.println("Please enter an X coordinate");
xCoord = sc.nextInt();
return xCoord;
}
public static int getY() {
System.out.println("Please enter an Y coordinate");
yCoord = sc.nextInt();
return yCoord;
}
public static boolean checkValidMove(int xCoordinate, int yCoordinate, char[][] board) {
////
if (xCoordinate > board.length || yCoordinate > board.length || xCoordinate == 0 || yCoordinate == 0 || xCoordinate == 4 || yCoordinate == 4) {
validMove = false;
} else {
validMove = true;
}
if (currentSymbol == 'O') {
count[xCoordinate][yCoordinate] = -1;
} else if (currentSymbol == 'X') {
count[xCoordinate][yCoordinate] = 1;
}
return validMove;
} // end method checkValidMove
//THIS PART HERE IT SEEMS TO BE BROKEN FOR SOME REASON
public static boolean checkXOrOHasWon(char[][] board) {
//ALL OF THE ROWS DON'T WORK
//row 1
for (int i = 1; i < 4; i++) {
if (count[i][1] == -1) {
checkO = checkO + 1;
}
if (count[i][1] == 1) {
checkX = checkX + 1;
}
}
if (checkO != 3) {
checkO = 0;
}
if (checkX != 3) {
checkX = 0;
}
//row 2
for (int i = 1; i < 4; i++) {
if (count[i][2] == -1) {
checkO = checkO + 1;
}
if (count[i][2] == 1) {
checkX = checkX + 1;
}
}
if (checkO != 3) {
checkO = 0;
}
if (checkX != 3) {
checkX = 0;
}
//row 3
for (int i = 1; i < 4; i++) {
if (count[i][3] == -1) {
checkO = checkO + 1;
}
if (count[i][3] == 1) {
checkX = checkX + 1;
}
}
if (checkO != 3) {
checkO = 0;
}
if (checkX != 3) {
checkX = 0;
}
//col 1
for (int i = 1; i < 4; i++) {
if (count[1][i] == -1) {
checkO = checkO + 1;
}
if (count[1][i] == 1) {
checkX = checkX + 1;
}
}
if (checkO != 3) {
checkO = 0;
}
if (checkX != 3) {
checkX = 0;
}
//col 2
for (int i = 1; i < 4; i++) {
if (count[2][i] == -1) {
checkO = checkO + 1;
}
if (count[2][i] == 1) {
checkX = checkX + 1;
}
}
if (checkO != 3) {
checkO = 0;
}
if (checkX != 3) {
checkX = 0;
}
//col 3
for (int i = 1; i < 4; i++) {
if (count[3][i] == -1) {
checkO = checkO + 1;
}
if (count[3][i] == 1) {
checkX = checkX + 1;
}
}
if (checkO != 3) {
checkO = 0;
}
if (checkX != 3) {
checkX = 0;
}
//diag 1
for (int i = 1; i < 4; i++) {
if (count[i][i] == -1) {
checkO = checkO + 1;
break;
}
if (count[i][i] == 1) {
checkX = checkX + 1;
break;
}
}
if (checkO != 3) {
checkO = 0;
}
if (checkX != 3) {
checkX = 0;
}
//diag 2
for (int j = 2; j < 5; j++) {
for (int i = 1; i < 4; i++) {
if (count[i][j - 1] == -1) {
checkO = checkO + 1;
break;
}
if (count[i][j - 1] == 1) {
checkX = checkX + 1;
break;
}
}
}
if (checkO != 3) {
checkO = 0;
}
if (checkX != 3) {
checkX = 0;
}
if (checkX == 3 || checkO == 3) {
gameHasBeenWon = true;
} else {
checkO = 0;
checkX = 0;
gameHasBeenWon = false;
}
return gameHasBeenWon;
}
}
如果它检查在任何一行上是否连续有三个,那是行不通的,而且我不知道为什么。
该代码仅测试是否恰好等于3(或不等于3)的checkX或checkY,但是如果先前检查中它们等于1或2,则可能使它们总数超过3。
checkXOrOHasWon()
方法最简单的解决方法是替换所有这些块(对于checkX和checkO):
if (checkX != 3) {
checkX = 0;
}
改为使用以下语句:
if (checkX == 3) {
return true;
}
您将在每一行和列检查之后重置checkX
和check0
的值。 因此,即使获胜,您也正在检查其他不需要的行或列。
您应该在当前正在检查!=3
的位置返回true。
此外,其他提示/更改:
1.您不需要4x4数组,可以使用3x3,只需正确使用索引即可。
2.通过创建checkRow
和checkCol
方法并从该方法中循环调用它们,可以使CheckXandO()
方法模块化,这将减少程序中的代码行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.