繁体   English   中英

Java-Noughts and Crosss /井字游戏获胜算法不起作用

[英]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;
}

您将在每一行和列检查之后重置checkXcheck0的值。 因此,即使获胜,您也正在检查其他不需要的行或列。

您应该在当前正在检查!=3的位置返回true。

此外,其他提示/更改:
1.您不需要4x4数组,可以使用3x3,只需正确使用索引即可。
2.通过创建checkRowcheckCol方法并从该方法中循环调用它们,可以使CheckXandO()方法模块化,这将减少程序中的代码行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM