我想使用Java语言中的minimax算法将代码Tic Tac Toe (Caro) 3x3升级为5x5

问题描述 投票:0回答:0

我想使用Java语言中的minimax算法将代码Tic Tac Toe (Caro) 3x3升级为5x5 Caro minimax 5x5,java netbeans,人类与计算机

package CaroMinimax;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//3x3 minimax
public class TicTacToeGUI implements ActionListener {

    private static final int BOARD_SIZE = 3;
    private static final char HUMAN_PLAYER = 'X';
    private static final char COMPUTER_PLAYER = 'O';
    private static final char EMPTY_SPACE = ' ';
    private static final int WINNING_SCORE = 100;
    private static final int LOSING_SCORE = -100;
    private static final int DRAW_SCORE = 0;
    private JButton[][] board;
    private JFrame frame;
    private boolean isHumanTurn;
    private boolean isGameOver;

    public TicTacToeGUI() {
        // Create the game board
        board = new JButton[BOARD_SIZE][BOARD_SIZE];
        frame = new JFrame("Tic Tac Toe");
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(BOARD_SIZE, BOARD_SIZE));
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                JButton button = new JButton("");
                button.setFont(new Font("Arial", Font.PLAIN, 50));
                button.addActionListener(this);
                board[i][j] = button;
                frame.add(button);
            }
        }
        isHumanTurn = true;
        isGameOver = false;
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (isGameOver) {
            return;
        }
        JButton button = (JButton)e.getSource();
        int row = -1;
        int col = -1;
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                if (board[i][j] == button) {
                    row = i;
                    col = j;
                }
            }
        }
        if (board[row][col].getText().equals("")) {
            if (isHumanTurn) {
                board[row][col].setText(Character.toString(HUMAN_PLAYER));
                if (isWinner(HUMAN_PLAYER)) {
                    JOptionPane.showMessageDialog(frame, "You win!");
                    isGameOver = true;
                } else if (isBoardFull()) {
                    JOptionPane.showMessageDialog(frame, "Draw!");
                    isGameOver = true;
                } else {
                    isHumanTurn = false;
                    computerMove();
                    if (isWinner(COMPUTER_PLAYER)) {
                        JOptionPane.showMessageDialog(frame, "Computer wins!");
                        isGameOver = true;
                    } else if (isBoardFull()) {
                        JOptionPane.showMessageDialog(frame, "Draw!");
                        isGameOver = true;
                    } else {
                        isHumanTurn = true;
                    }
                }
            }
        }
    }

    private boolean isWinner(char player) {
        // Check rows
        for (int i = 0; i < BOARD_SIZE; i++) {
            int count = 0;
            for (int j = 0; j < BOARD_SIZE; j++) {
                if (board[i][j].getText().equals(Character.toString(player))) {
                    count++;
                }
            }
            if (count == BOARD_SIZE) {
                return true;
            }
        }

        // Check columns
    for (int j = 0; j < BOARD_SIZE; j++) {
        int count = 0;
        for (int i = 0; i < BOARD_SIZE; i++) {
            if (board[i][j].getText().equals(Character.toString(player))) {
                count++;
            }
        }
        if (count == BOARD_SIZE) {
            return true;
        }
    }
        // Check diagonals
    int count = 0;
    for (int i = 0, j = 0; i < BOARD_SIZE && j < BOARD_SIZE; i++, j++) {
        if (board[i][j].getText().equals(Character.toString(player))) {
            count++;
        }
    }
    if (count == BOARD_SIZE) {
        return true;
    }

    count = 0;
    for (int i = 0, j = BOARD_SIZE - 1; i < BOARD_SIZE && j >= 0; i++, j--) {
        if (board[i][j].getText().equals(Character.toString(player))) {
            count++;
        }
    }
    if (count == BOARD_SIZE) {
        return true;
    }

    return false;
}

private boolean isBoardFull() {
    for (int i = 0; i < BOARD_SIZE; i++) {
        for (int j = 0; j < BOARD_SIZE; j++) {
            if (board[i][j].getText().equals("")) {
                return false;
            }
        }
    }
    return true;
}

private void computerMove() {
    int bestScore = Integer.MIN_VALUE;
    int bestRow = -1;
    int bestCol = -1;
    for (int i = 0; i < BOARD_SIZE; i++) {
        for (int j = 0; j < BOARD_SIZE; j++) {
            if (board[i][j].getText().equals("")) {
                board[i][j].setText(Character.toString(COMPUTER_PLAYER));
                int score = minimax(false);
                board[i][j].setText("");
                if (score > bestScore) {
                    bestScore = score;
                    bestRow = i;
                    bestCol = j;
                }
            }
        }
    }
    board[bestRow][bestCol].setText(Character.toString(COMPUTER_PLAYER));
}

    private int minimax(boolean isMaximizing) {
        if (isWinner(HUMAN_PLAYER)) {
            return LOSING_SCORE;
        } else if (isWinner(COMPUTER_PLAYER)) {
            return WINNING_SCORE;
        } else if (isBoardFull()) {
        return DRAW_SCORE;
    }
        if (isMaximizing) {
        int bestScore = Integer.MIN_VALUE;
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                if (board[i][j].getText().equals("")) {
                    board[i][j].setText(Character.toString(COMPUTER_PLAYER));
                    int score = minimax(false);
                    board[i][j].setText("");
                    bestScore = Math.max(bestScore, score);
                }
            }
        }
        return bestScore;
        } else {
        int bestScore = Integer.MAX_VALUE;
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                if (board[i][j].getText().equals("")) {
                    board[i][j].setText(Character.toString(HUMAN_PLAYER));
                    int score = minimax(true);
                    board[i][j].setText("");
                    bestScore = Math.min(bestScore, score);
                }
            }
            }
            return bestScore;
        }
    }
    public static void main(String[] args) {
        TicTacToeGUI game = new TicTacToeGUI();
    }

}

我已尽一切努力将我的游戏从 3x3 升级到 5x5,但我遇到错误任何人都可以帮助我,谢谢 我已尽一切努力将我的游戏从 3x3 升级到 5x5,但我遇到错误任何人都可以帮助我,谢谢 我已尽一切努力将我的游戏从 3x3 升级到 5x5,但我遇到错误任何人都可以帮助我,谢谢

tic-tac-toe minimax
© www.soinside.com 2019 - 2024. All rights reserved.