用Java写一个可视化的五子棋人机对弈小程序

时间: 2023-12-05 13:03:32 浏览: 53
好的,下面是一个简单的五子棋人机对弈小程序的示例代码,基于 Java Swing 编写。 ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gobang extends JFrame implements ActionListener, MouseListener { private static final long serialVersionUID = 1L; private JPanel panel; private JButton button; private JLabel label1, label2; private int[][] chessBoard; private boolean isBlack = true; private boolean gameOver = false; private final int ROWS = 15; private final int COLS = 15; private final int SIZE = 30; private final int MARGIN = 30; public Gobang() { setTitle("五子棋"); setSize(600, 600); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); init(); setVisible(true); } private void init() { panel = new JPanel(); panel.setBackground(new Color(255, 204, 102)); panel.setLayout(null); panel.addMouseListener(this); button = new JButton("重新开始"); button.addActionListener(this); button.setBounds(450, 120, 100, 40); label1 = new JLabel("黑方先手"); label1.setFont(new Font("宋体", Font.BOLD, 20)); label1.setBounds(450, 200, 150, 40); label2 = new JLabel("轮到黑方"); label2.setFont(new Font("宋体", Font.BOLD, 20)); label2.setBounds(450, 250, 150, 40); panel.add(button); panel.add(label1); panel.add(label2); add(panel); chessBoard = new int[ROWS][COLS]; } private void drawChessBoard(Graphics g) { for (int i = 0; i <= ROWS; i++) { g.drawLine(MARGIN, MARGIN + i * SIZE, MARGIN + COLS * SIZE, MARGIN + i * SIZE); } for (int i = 0; i <= COLS; i++) { g.drawLine(MARGIN + i * SIZE, MARGIN, MARGIN + i * SIZE, MARGIN + ROWS * SIZE); } } private void drawChessPiece(Graphics g, int row, int col, boolean isBlack) { int x = MARGIN + col * SIZE; int y = MARGIN + row * SIZE; g.setColor(isBlack ? Color.BLACK : Color.WHITE); g.fillOval(x - SIZE / 2, y - SIZE / 2, SIZE, SIZE); } private boolean checkWin(int row, int col) { int count = 1; int color = chessBoard[row][col]; int r, c; // 检查水平方向 r = row; c = col - 1; while (c >= 0 && chessBoard[r][c] == color) { count++; c--; } c = col + 1; while (c < COLS && chessBoard[r][c] == color) { count++; c++; } if (count >= 5) { return true; } // 检查竖直方向 count = 1; r = row - 1; c = col; while (r >= 0 && chessBoard[r][c] == color) { count++; r--; } r = row + 1; while (r < ROWS && chessBoard[r][c] == color) { count++; r++; } if (count >= 5) { return true; } // 检查左斜方向 count = 1; r = row - 1; c = col - 1; while (r >= 0 && c >= 0 && chessBoard[r][c] == color) { count++; r--; c--; } r = row + 1; c = col + 1; while (r < ROWS && c < COLS && chessBoard[r][c] == color) { count++; r++; c++; } if (count >= 5) { return true; } // 检查右斜方向 count = 1; r = row - 1; c = col + 1; while (r >= 0 && c < COLS && chessBoard[r][c] == color) { count++; r--; c++; } r = row + 1; c = col - 1; while (r < ROWS && c >= 0 && chessBoard[r][c] == color) { count++; r++; c--; } if (count >= 5) { return true; } return false; } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == button) { chessBoard = new int[ROWS][COLS]; isBlack = true; gameOver = false; label1.setText("黑方先手"); label2.setText("轮到黑方"); panel.repaint(); } } @Override public void mouseClicked(MouseEvent e) { if (gameOver) { return; } int x = e.getX(); int y = e.getY(); if (x < MARGIN || x > MARGIN + COLS * SIZE || y < MARGIN || y > MARGIN + ROWS * SIZE) { return; } int row = Math.round((float) (y - MARGIN) / SIZE); int col = Math.round((float) (x - MARGIN) / SIZE); if (chessBoard[row][col] != 0) { return; } chessBoard[row][col] = isBlack ? 1 : 2; panel.repaint(); if (checkWin(row, col)) { gameOver = true; String winner = isBlack ? "黑方" : "白方"; JOptionPane.showMessageDialog(panel, winner + "获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE); return; } isBlack = !isBlack; label1.setText(isBlack ? "黑方先手" : "白方先手"); label2.setText(isBlack ? "轮到黑方" : "轮到白方"); if (!isBlack) { // AI 下棋 int[] pos = computeNextMove(); row = pos[0]; col = pos[1]; chessBoard[row][col] = 2; panel.repaint(); if (checkWin(row, col)) { gameOver = true; JOptionPane.showMessageDialog(panel, "白方获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE); return; } isBlack = !isBlack; label1.setText(isBlack ? "黑方先手" : "白方先手"); label2.setText(isBlack ? "轮到黑方" : "轮到白方"); } } private int[] computeNextMove() { int[] pos = new int[2]; // TODO: AI 算法 return pos; } @Override public void paint(Graphics g) { super.paint(g); drawChessBoard(g); for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (chessBoard[i][j] == 1) { drawChessPiece(g, i, j, true); } else if (chessBoard[i][j] == 2) { drawChessPiece(g, i, j, false); } } } } @Override public void mousePressed(MouseEvent e) {} @Override public void mouseReleased(MouseEvent e) {} @Override public void mouseEntered(MouseEvent e) {} @Override public void mouseExited(MouseEvent e) {} public static void main(String[] args) { new Gobang(); } } ``` 这个程序由一个主窗口和一个 JPanel 组成。主窗口负责创建并显示 JPanel,JPanel 则绘制棋盘和棋子,并处理用户交互和游戏逻辑。 在 JPanel 的构造函数中,我们初始化了棋盘数组 `chessBoard`,表示棋盘上每个格子的状态。1 表示黑子,2 表示白子,0 表示空格。我们还添加了一个按钮和两个标签,用于重新开始游戏和显示游戏状态。 在 `drawChessBoard` 方法中,我们使用 Graphics 类的 `drawLine` 方法绘制棋盘的线条。 在 `drawChessPiece` 方法中,我们使用 Graphics 类的 `fillOval` 方法绘制棋子。黑子用黑色填充,白子用白色填充。 在 `checkWin` 方法中,我们检查棋盘上某个格子所处的行、列、左斜方向和右斜方向是否有连续五个相同颜色的棋子。如果有,则游戏结束。 在 `actionPerformed` 方法中,我们对重新开始按钮的点击事件进行处理。重新初始化棋盘数组、重置游戏状态和标签,并调用 JPanel 的 `repaint` 方法刷新界面。 在 `mouseClicked` 方法中,我们处理鼠标点击事件。如果游戏已经结束或点击了棋盘外部或已经有棋子存在,则不做任何处理。否则,我们根据鼠标点击坐标计算出所在的行和列,将这个位置设为当前玩家下的棋子。然后检查游戏是否结束,并切换当前玩家。如果当前玩家是电脑,则调用 `computeNextMove` 方法计算出下一个位置,并执行相同的操作。 在 `paint` 方法中,我们使用 Graphics 类的 `paint` 方法绘制棋盘和棋子。 在 `computeNextMove` 方法中,我们需要实现一个 AI 算法,来计算出电脑下一步应该走的位置。这里我们暂时留空,可以自己实现一个简单的算法,比如随机生成一个空白位置,作为电脑的下一步。 最后,在 `main` 方法中,我们创建一个新的 Gobang 对象,启动程序。

相关推荐

最新推荐

recommend-type

Java web数据可视化实现原理解析

主要介绍了Java web数据可视化实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

用Pandas和Folium做一个新冠数据可视化

目录数据集介绍可视化步骤1. 导入pandas等需要的库2. 读取数据,查看基本情况3. 读取城市坐标数据4. 按省份统计人数5. 合并城市坐标数据 与 省份数据6. 绘制地图写入HTML文件,并用浏览器打开完整代码 数据集介绍 1...
recommend-type

java实现可视化界面肯德基(KFC)点餐系统代码实例

主要介绍了java肯德基点餐系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

CODESYS之可视化控件属性(一).docx

前面已经讲解了控件的移动以及控件颜色的...X表示距离可视化界面左侧的距离,Y表示距离可视化界面上侧距离 Width表示矩形框宽度,Height表示矩形框高度,Angle表示矩形框的旋转角度 Center中心指的是矩形框黑点的中心
recommend-type

使用pytorch实现可视化中间层的结果

今天小编就为大家分享一篇使用pytorch实现可视化中间层的结果,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

去除字符串s="ab23cde"中的数字,构成一个新的字符串"abcde"。

可以使用正则表达式来匹配并替换字符串中的数字: ```python import re s = "ab23cde" new_s = re.sub(r'\d+', '', s) print(new_s) # 输出:abcde ``` 其中,`\d` 表示匹配数字,`+` 表示匹配一个或多个数字,`re.sub()` 函数用来替换匹配到的数字为空字符串。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。