井字游戏 java 用户 vs 计算机

tic tac toe java user vs computer

我正在为我的 class 编写井字游戏。一切正常,但我无法弄清楚如何让我的电脑播放器只选择可用的空间。我的代码出现故障并允许计算机选择其他玩家空间或根本不玩。任何帮助将不胜感激。

import java.util.Random;
import java.util.Scanner;

public class TicTacToe1 {

public static void main(String[] args) {
    welcome();
    initializeBoard();
    printBoard();

    while ((!checkWin()) && (!checkDraw())) {
        playerMove();
        printBoard();
        System.out.println();
        computerMove();
        printBoard();
    }
    System.out.println();
    if (checkWin() == true) {
        System.out.println("The winner is " + currentTurn);
    }
    if (checkDraw() == true) {
        System.out.println("Draw");
    }
}

private static String[][] board = new String[3][3];

private static int row, column;

public static Scanner scan = new Scanner(System.in);

public static String currentTurn = "X";

// public static String computerTurn = "O";

public static String turn() {
    if (currentTurn == "X") {
        currentTurn = "O";
    } else {
        currentTurn = "X";
    }
    return currentTurn;
}

private static void welcome() {
    System.out.println("Tic Tac Toe");
    System.out.println("Please enter your coordinates for your location row (1-3) column (1-3):");
}

public static void initializeBoard() { // initialize tic tac toe
    for (int i = 0; i < board.length; i++) {
        for (int j = 0; j < board.length; j++) {
            board[i][j] = "-";
        }
    }
}

public static void printBoard() {

    for (int i = 0; i < board.length; i++) {
        System.out.println();
        for (int j = 0; j < board.length; j++) {
            if (j == 0) {
                System.out.print("| ");
            }
            System.out.print(board[i][j] + " | ");
        }
    }
}

public static void playerMove() {
    System.out.println();
    System.out.println("Your Move: ");
    row = scan.nextInt() - 1;
    column = scan.nextInt() - 1;
    if (board[row][column] == "-") {
        board[row][column] = turn();
    } else {
        System.out.println("Invalid entry. Please go again");
        row = scan.nextInt() - 1;
        column = scan.nextInt() - 1;
        board[row][column] = turn();
    }

}

// public static void computerMove() {
// Random computerMove = new Random();
// row = computerMove.nextInt(3);
// column = computerMove.nextInt(3);
// if (board[row][column] == "-") {
// board[row][column] = turn();
// } else {

// }

// }

public static void computerMove() {
    Random computerMove = new Random();
    row = computerMove.nextInt(3);
    column = computerMove.nextInt(3);
    while (board[row][column] != "-") {
        // Random computerMove = new Random();
        // row = computerMove.nextInt(3);
        // column = computerMove.nextInt(3);
        if (board[row][column] == "-") {
            board[row][column] = turn();
        } else {
            row = computerMove.nextInt(3);
            column = computerMove.nextInt(3);
            board[row][column] = turn();
        }

    }

}

public static boolean checkWin() {
    return (checkDiagonalWin() || checkHorizontalWin() || checkVerticalWin());

}

public static boolean checkDiagonalWin() {
    if ((board[0][0] == board[1][1]) && (board[0][0] == board[2][2]) && (board[1][1] != "-")) {
        return true;
    }
    if ((board[0][2] == board[1][1]) && (board[0][2] == board[2][0]) && (board[1][1] != "-")) {
        return true;
    }
    return false;
}

public static boolean checkHorizontalWin() {
    // for (int i = 0; i < board.length; i++) {
    if ((board[0][0] == board[0][1]) && (board[0][0] == board[0][2]) && (board[0][0] != "-")) {
        return true;
    }
    if ((board[1][0] == board[1][1]) && (board[1][0] == board[1][2]) && (board[1][0] != "-")) {
        return true;
    }
    if ((board[2][0] == board[2][1]) && (board[2][0] == board[2][2]) && (board[2][0] != "-")) {
        return true;
    }
    // }
    return false;
}

public static boolean checkVerticalWin() {
    // for (int j = 0; j < board.length; j++) {
    if ((board[0][0] == board[1][0]) && (board[0][0] == board[2][0]) && (board[0][0] != "-")) {
        return true;
    }
    if ((board[0][1] == board[1][1]) && (board[0][1] == board[2][1]) && (board[0][1] != "-")) {
        return true;
    }
    if ((board[0][2] == board[1][2]) && (board[0][2] == board[2][2]) && (board[0][2] != "-")) {
        return true;
    }
    // }
    return false;
}

public static boolean checkDraw() {
    for (int i = 0; i < board.length; i++) {
        for (int j = 0; j < board.length; j++) {
            if (board[i][j] == "-") {
                return false;
            }
        }
    }
    return true;
}

}

问题出在您的计算机移动逻辑中。

    public static void computerMove() {
    Random computerMove = new Random();
    row = computerMove.nextInt(3);
    column = computerMove.nextInt(3);
    while (board[row][column] != "-") {
        row = computerMove.nextInt(3);
        column = computerMove.nextInt(3);
    }
    board[row][column] = turn();
}

这应该适合您,只需将其复制粘贴到您的计算机位置即可移动。

现在说说为什么您的代码不起作用:- 您的代码:

    while (board[row][column] != "-") {

    if (board[row][column] == "-") {
        board[row][column] = turn();
    } else {
        row = computerMove.nextInt(3);
        column = computerMove.nextInt(3);
        board[row][column] = turn();
    }

}

while 循环查看位置并发现没有 '-',因此 运行s。然后在你的 while 循环中你有一个 if 语句来检查你是否在那个位置有'-'。这永远不可能是真的,因为我们的 while 循环不会 运行 否则。

最好的办法是让您的代码不断更改行和列,直到您获得带有“-”的位置,然后使用您的 while 循环来执行此操作。一旦你得到'-',你的while循环就不会再运行了,所以你可以在while循环之外设置board[row][columns] = turn(),你的代码就可以正常工作了。

P.S。花了很大的意志力才没有让机器起义参考你的

My code is glitching and allowing the computer to choose either the other players spaces or not playing at all

玩得开心你的程序:)

~HelpfulWhosebugCommunity