Java-Noughts和Cross/Tic-Tac-Toe游戏获胜算法不起作用
最近刚开始上大学,我们正在学习如何用Java编程。如果我们想要挑战的话,有人建议我们尝试用一段残破的代码制作一个零和十字形游戏 我设法让程序正常运行,X或O显示在电路板上,检查一行或一列中是否有三个相同的符号可以正常工作,但是出于某种原因,如果它检查任何一行上是否有三个相同的符号,它就不工作了,我无法找出原因。我问过朋友,他们也不明白为什么它不起作用(可能是我错过的一些明显的东西) 为了检查X或O是否赢了,我创建了另一个2D数组,将1放在板上X的位置,如果板上的位置是O,则将a-1放在板上。然后检查行、列和对角线上是否有-1或1。如果存在-1,则为O向计数器添加1;如果存在-1,则为X向计数器添加1 在函数的末尾,它检查O或X的计数器是否等于三,如果等于三,则返回true,如果不等于,则返回false 下面是代码(大约315行代码,可以更容易地复制和粘贴整个程序,这样您就可以看到我是否在其他地方出错,向下滚动到底部,查看Java-Noughts和Cross/Tic-Tac-Toe游戏获胜算法不起作用,java,arrays,if-statement,Java,Arrays,If Statement,最近刚开始上大学,我们正在学习如何用Java编程。如果我们想要挑战的话,有人建议我们尝试用一段残破的代码制作一个零和十字形游戏 我设法让程序正常运行,X或O显示在电路板上,检查一行或一列中是否有三个相同的符号可以正常工作,但是出于某种原因,如果它检查任何一行上是否有三个相同的符号,它就不工作了,我无法找出原因。我问过朋友,他们也不明白为什么它不起作用(可能是我错过的一些明显的东西) 为了检查X或O是否赢了,我创建了另一个2D数组,将1放在板上X的位置,如果板上的位置是O,则将a-1放在板上。然后
checkxorhowaswan
函数中的损坏部分):
代码是:-
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;
}
}
import java.util.Scanner;
新公共阶级{
静态整数计数[][]=新整数[4][4];
静态字符板[][]=新字符[4][4];
静态字符串名称;
静态字符串播放器名称;
静态int xCoord;
静态内部协调;
静态int noOfMoves;
静态int checkO=0;
静态整数校验x=0;
静态布尔有效移动;
静态布尔对策;
静态布尔对策;
静态字符符号;
静态扫描仪sc=新扫描仪(System.in);
公共静态void main(字符串[]args){
initialiseBoard();
System.out.println(“玩家一的名字是什么?”);
PlayerName=sc.next();
System.out.println(“玩家二的名字是什么?”);
playerTwoName=sc.next();
currentSymbol='X';
//玩游戏
noOfMoves=0;
gameHasBeenDrawn=false;
gameHasBeenWon=false;
System.out.println();
显示板;
System.out.println(“\n”+PlayerName+“开始播放”+currentSymbol);
System.out.println();
玩{//,直到一名玩家获胜或比赛平局
{//是否得到有效的移动
xCoord=getX();
yCoord=getY();
System.out.println(“”);
validMove=检查validMove(xCoord、yCoord、board);
如果(!validMove){
System.out.println(“坐标无效,请重试”);
}//如果结束,则结束
}而(!validMove);
线路板[xCoord][yCoord]=当前符号;
显示板;
gameHasBeenWon=checkXOrOHasWon(董事会);
noOfMoves++;
如果(!gameHasBeenWon){
//检查是否已达到允许的最大移动次数
如果(noOfMoves==9){
gameHasBeenDrawn=true;
}否则{
如果(currentSymbol='X'){
currentSymbol='O';
System.out.println(playerTwoName+“’的回合”);
}否则{
currentSymbol='X';
System.out.println(PlayerName+“’s turn”);
}//如果结束/else
}//如果结束/else
}//如果结束,则结束
}而(!gameHasBeenWon&!gameHasBeenDrawn);
//显示结果
如果(gameHasBeenWon){
如果('X'==currentSymbol){
System.out.println(playerName+“恭喜你赢了!”);
}否则{
System.out.println(playerTwoName+“恭喜你赢了!”);
}
}否则{
System.out.println(“这次是抽签!”;
}
}//结束方法main
公共静态无效initialiseBoard(){
}
公共静态无效显示板(字符[][]板){
int行;
int列;
系统输出打印号(“| 1 2 3”);
System.out.println(“--+----”;
对于(row=1;row board.length | | xCoordinate==0 | | yCoordinate==0 | | xCoordinate==4 | | yCoordinate==4){
validMove=false;
}否则{
validMove=true;
}
如果(currentSymbol='O'){
计数[xCoordinate][yCoordinate]=-1;
}else if(currentSymbol=='X'){
计数[xCoordinate][yCoordinate]=1;
}
返回有效移动;
}//结束方法checkValidMove
//这里的这部分似乎因为某种原因而断裂了
公共静态布尔checkxorhoaswon(char[][]板){
//所有的行都不起作用
//第1行
对于(int i=1;i<4;i++){
如果(计数[i][1]=-1){
checkO=checkO+1;
}
如果(计数[i][1]==1){
checkX=checkX+1;
}
}
如果(检查!=3){
checkO=0;
}
如果(检查x!=3){
checkX=0;
}
//第2排
对于(int i=1;i<4;i++){
如果(计数[i][2]=-1){
checkO=checkO+1;
}
如果(计数[i][2]==1){
checkX=checkX+1;
}
}
如果(检查!=3){
checkO=0;
}
如果(检查x!=3){
checkX=0;
}
//第3排
对于(int i=1;i<4;i++){
如果(计数[i][3]=-1){
checkO=checkO+1;
}
如果(计数[i][3]==1){
checkX=checkX+1;
}
}
如果(检查!=3){
checkO=0;
}
如果(检查x!=3){
checkX=0;
}
//第1列
对于(int i=1;i<4;i++){
如果(计数[1][i]=-1){
checkO=checkO+1;
}
如果(计数[1][i]==1){
checkX=checkX+1;
}
}
如果(检查!=3){
checkO=0;
}
如果(检查x!=3){
checkX=0;
}
//第2列
用于(int i)=
if (checkX != 3) {
checkX = 0;
}
if (checkX == 3) {
return true;
}