初始化AI玩家井字游戏

我正在尝试找一个关于井字游戏的教程。但是我想知道我应该在哪里初始化电脑玩家。

我有一个抽象的AIPlayer类

public abstract class AIPlayer {protected int ROWS = 3;  // 行数protected int COLS = 3;  // 列数protected Cell[][] cells; // 游戏板的ROWS乘COLS的Cell数组protected Seed mySeed;    // 电脑的种子protected Seed oppSeed;   // 对手的种子/** 带有游戏板引用的构造函数 */public AIPlayer(Board board) {  cells = board.cells;}/** 设置/更改电脑和对手使用的种子 */public void setSeed(Seed seed) {   this.mySeed = seed;   oppSeed = (mySeed == Seed.CROSS) ? Seed.NOUGHT : Seed.CROSS;}/** 获取下一步行动的抽象方法。返回int[2]的{row, col} */abstract int[] move();  // 由子类实现}

这是我为电脑找到最佳行动的算法

import AIPlayer;import Board;import Seed;import java.util.*;/** 使用Minimax算法的AIPlayer */public class AIPlayerMinimax extends AIPlayer {/** 带有给定游戏板的构造函数 */public AIPlayerMinimax(Board board) {  super(board);}int[] move() {  int[] result = minimax(2, mySeed); // 深度, 最大回合  return new int[] {result[1], result[2]};   // 行, 列}private int[] minimax(int depth, Seed player) {   //minmax代码}private List<int[]> generateMoves() {   //生成行动}private int evaluate() {   //评估}private int evaluateLine(int row1, int col1, int row2, int col2, int row3, int col3) {   // ..  }private int[] winningPatterns = {       //};private boolean hasWon(Seed thePlayer) {   //   }}

这是我的GameMain类,包含图形界面和所有其他功能

public class GameMain extends JPanel {// 游戏板的命名常量public static final int ROWS = 3;  // ROWS乘COLS的单元格public static final int COLS = 3;public static final String TITLE = "井字游戏";// 用于图形绘制的各种尺寸的命名常量public static final int CELL_SIZE = 100; // 单元格宽度和高度(正方形)public static final int CANVAS_WIDTH = CELL_SIZE * COLS;  // 绘图画布public static final int CANVAS_HEIGHT = CELL_SIZE * ROWS;public static final int GRID_WIDTH = 8;  // 网格线宽度public static final int GRID_WIDHT_HALF = GRID_WIDTH / 2; // 网格线半宽度// 符号(十字/圆圈)在单元格内显示,带有边框填充public static final int CELL_PADDING = CELL_SIZE / 6;public static final int SYMBOL_SIZE = CELL_SIZE - CELL_PADDING * 2;public static final int SYMBOL_STROKE_WIDTH = 8; // 笔划宽度private Board board;            // 游戏板private GameState currentState; // 当前游戏状态private Seed currentPlayer;     // 当前玩家private JLabel statusBar;       // 用于显示状态消息/** 构造函数用于设置UI和游戏组件 */public GameMain() {    // 此JPanel触发MouseEvent    this.addMouseListener(new MouseAdapter() {        @Override        public void mouseClicked(MouseEvent e) {  // 鼠标点击处理程序            int mouseX = e.getX();            int mouseY = e.getY();            // 获取点击的行和列            int rowSelected = mouseY / CELL_SIZE;            int colSelected = mouseX / CELL_SIZE;            if (currentState == GameState.PLAYING) {                if (rowSelected >= 0 && rowSelected < ROWS                    && colSelected >= 0 && colSelected < COLS                && board.cells[rowSelected][colSelected].content == Seed.EMPTY) {                    board.cells[rowSelected][colSelected].content = currentPlayer; // 移动                    updateGame(currentPlayer, rowSelected, colSelected); // 更新currentState                    // 切换玩家                    currentPlayer = (currentPlayer == Seed.CROSS) ? Seed.NOUGHT : Seed.CROSS;                }            } else {        // 游戏结束                initGame();  // 重新开始游戏            }            // 刷新绘图画布            repaint();  // 调用paintComponent()。        }    });    // 设置状态栏(JLabel)以显示状态消息    statusBar = new JLabel("         ");    statusBar.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 14));    statusBar.setBorder(BorderFactory.createEmptyBorder(2, 5, 4, 5));    statusBar.setOpaque(true);    statusBar.setBackground(Color.LIGHT_GRAY);    setLayout(new BorderLayout());    add(statusBar, BorderLayout.PAGE_END); // 相当于SOUTH    setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT + 30));    // 考虑到状态栏的高度    board = new Board();   // 分配游戏板    initGame();  // 初始化游戏变量}/** 初始化游戏板内容和当前状态 */public void initGame() {    for (int row = 0; row < ROWS; ++row) {        for (int col = 0; col < COLS; ++col) {            board.cells[row][col].content = Seed.EMPTY; // 所有单元格为空        }    }    currentState = GameState.PLAYING;  // 准备玩    currentPlayer = Seed.CROSS;        // 十字先玩}/** 在玩家使用"theSeed"在(row, col)放置后更新当前状态 */public void updateGame(Seed theSeed, int row, int col) {    if (board.hasWon(theSeed, row, col)) {  // 检查是否获胜        currentState = (theSeed == Seed.CROSS) ? GameState.CROSS_WON : GameState.NOUGHT_WON;    } else if (board.isDraw()) {  // 检查是否平局        currentState = GameState.DRAW;    }    // 否则,当前状态不变(PLAYING)。}/** 此JPanel上的自定义绘图代码 */@Overridepublic void paintComponent(Graphics g) {  // 通过repaint()调用    super.paintComponent(g);    // 填充背景    setBackground(Color.WHITE); // 设置其背景颜色    board.paint(g);  // 请求游戏板绘制自身    // 打印状态栏消息    if (currentState == GameState.PLAYING) {        statusBar.setForeground(Color.BLACK);        if (currentPlayer == Seed.CROSS) {            statusBar.setText("X的回合");        } else {            statusBar.setText("O的回合");        }    } else if (currentState == GameState.DRAW) {        statusBar.setForeground(Color.RED);        statusBar.setText("平局!点击重新开始。");    } else if (currentState == GameState.CROSS_WON) {        statusBar.setForeground(Color.RED);        statusBar.setText("'X'获胜!点击重新开始。");    } else if (currentState == GameState.NOUGHT_WON) {        statusBar.setForeground(Color.RED);        statusBar.setText("'O'获胜!点击重新开始。");    }}/** 入口"main"方法 */public static void main(String[] args) {    // 在事件调度线程中运行GUI构建代码以确保线程安全    javax.swing.SwingUtilities.invokeLater(new Runnable() {        public void run() {            JFrame frame = new JFrame(TITLE);            // 将JFrame的内容面板设置为main JPanel的实例            frame.setContentPane(new GameMain());            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            frame.pack();            frame.setLocationRelativeTo(null); // 居中显示应用程序窗口            frame.setVisible(true);            // 显示它        }    });}}

所以我的问题是,我如何初始化AIPlayer来与我竞争?目前这是一个多人游戏,人对人。


回答:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注