请编出以下代码使用JavaSwing完成一款五子棋小游戏 功能要求: 1. 设计五子棋游戏棋盘 2. 首页菜单要求具备重新开始、悔棋、退出功能 3. 游戏要求具备人人、人机模式 4. 提供帮助菜单 说明游戏规则 5. 游戏玩法需要符合五子棋游戏基本规则

时间: 2024-03-08 22:50:29 浏览: 22
以下是使用JavaSwing完成五子棋小游戏的示例代码: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GobangGame extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private final int ROW = 15, COL = 15; // 棋盘大小 private final int BLOCK_SIZE = 30; // 棋子大小 private final int MARGIN = 30; // 边距 private JPanel jpBoard; // 棋盘面板 private JButton btnStart; // 开始按钮 private JButton btnRegret; // 悔棋按钮 private JButton btnExit; // 退出按钮 private JButton btnHelp; // 帮助按钮 private JLabel lbMessage; // 提示信息 private int[][] board; // 棋盘数组 private int player; // 当前玩家 private boolean gameOver; // 游戏是否结束 private boolean isMan; // 是否人人对战 public GobangGame() { super("五子棋小游戏"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(ROW * BLOCK_SIZE + MARGIN * 2, COL * BLOCK_SIZE + MARGIN * 2 + 50); jpBoard = new JPanel(); jpBoard.setSize(ROW * BLOCK_SIZE, COL * BLOCK_SIZE); jpBoard.setLocation(MARGIN, MARGIN); jpBoard.setBackground(new Color(255, 206, 158)); jpBoard.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (gameOver) return; int x = e.getX() - MARGIN; int y = e.getY() - MARGIN; if (x < 0 || y < 0 || x > ROW * BLOCK_SIZE || y > COL * BLOCK_SIZE) return; int row = y / BLOCK_SIZE; int col = x / BLOCK_SIZE; if (board[row][col] != 0) return; board[row][col] = player; addChessman(row, col, player); if (isWin(row, col, player)) { showResult(player); gameOver = true; return; } player = 3 - player; lbMessage.setText(player == 1 ? "黑子下棋" : "白子下棋"); if (!isMan) { computerAI(); } } }); JPanel jpBtns = new JPanel(); jpBtns.setSize(ROW * BLOCK_SIZE, 50); jpBtns.setLocation(MARGIN, COL * BLOCK_SIZE + MARGIN * 2); jpBtns.setBackground(new Color(255, 206, 158)); btnStart = new JButton("重新开始"); btnStart.addActionListener(this); btnRegret = new JButton("悔棋"); btnRegret.addActionListener(this); btnExit = new JButton("退出"); btnExit.addActionListener(this); btnHelp = new JButton("帮助"); btnHelp.addActionListener(this); lbMessage = new JLabel("黑子下棋"); lbMessage.setFont(new Font("宋体", Font.PLAIN, 20)); lbMessage.setForeground(Color.RED); jpBtns.add(btnStart); jpBtns.add(btnRegret); jpBtns.add(btnExit); jpBtns.add(btnHelp); jpBtns.add(lbMessage); getContentPane().setLayout(null); getContentPane().add(jpBoard); getContentPane().add(jpBtns); initGame(); } // 初始化游戏 private void initGame() { board = new int[ROW][COL]; player = 1; gameOver = false; isMan = true; lbMessage.setText("黑子先下"); jpBoard.removeAll(); jpBoard.repaint(); } // 添加棋子 private void addChessman(int row, int col, int player) { JLabel lbChessman = new JLabel(); lbChessman.setSize(BLOCK_SIZE, BLOCK_SIZE); lbChessman.setLocation(col * BLOCK_SIZE, row * BLOCK_SIZE); lbChessman.setIcon(new ImageIcon(player == 1 ? "black.png" : "white.png")); jpBoard.add(lbChessman); jpBoard.repaint(); } // 判断是否胜利 private boolean isWin(int row, int col, int player) { int count = 1; // 横向 for (int i = col - 1; i >= 0; i--) { if (board[row][i] == player) { count++; } else { break; } } if (count >= 5) return true; for (int i = col + 1; i < COL; i++) { if (board[row][i] == player) { count++; } else { break; } } if (count >= 5) return true; // 纵向 count = 1; for (int i = row - 1; i >= 0; i--) { if (board[i][col] == player) { count++; } else { break; } } if (count >= 5) return true; for (int i = row + 1; i < ROW; i++) { if (board[i][col] == player) { count++; } else { break; } } if (count >= 5) return true; // 左上-右下 count = 1; for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { if (board[i][j] == player) { count++; } else { break; } } if (count >= 5) return true; for (int i = row + 1, j = col + 1; i < ROW && j < COL; i++, j++) { if (board[i][j] == player) { count++; } else { break; } } if (count >= 5) return true; // 右上-左下 count = 1; for (int i = row - 1, j = col + 1; i >= 0 && j < COL; i--, j++) { if (board[i][j] == player) { count++; } else { break; } } if (count >= 5) return true; for (int i = row + 1, j = col - 1; i < ROW && j >= 0; i++, j--) { if (board[i][j] == player) { count++; } else { break; } } if (count >= 5) return true; return false; } // 显示游戏结果 private void showResult(int player) { String message = player == 1 ? "黑方胜利!" : "白方胜利!"; JOptionPane.showMessageDialog(this, message, "游戏结束", JOptionPane.INFORMATION_MESSAGE); } // 悔棋 private void regretChess() { Component[] chessmen = jpBoard.getComponents(); if (chessmen.length == 0) return; JLabel lbChessman = (JLabel) chessmen[chessmen.length - 1]; int row = lbChessman.getY() / BLOCK_SIZE; int col = lbChessman.getX() / BLOCK_SIZE; board[row][col] = 0; jpBoard.remove(lbChessman); jpBoard.repaint(); player = 3 - player; lbMessage.setText(player == 1 ? "黑子下棋" : "白子下棋"); } // 电脑AI下棋 private void computerAI() { int row = 0, col = 0; int maxScore = 0; int[][] scores = new int[ROW][COL]; for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (board[i][j] == 0) { scores[i][j] = getScore(i, j); if (scores[i][j] > maxScore) { maxScore = scores[i][j]; row = i; col = j; } } } } board[row][col] = player; addChessman(row, col, player); if (isWin(row, col, player)) { showResult(player); gameOver = true; return; } player = 3 - player; lbMessage.setText(player == 1 ? "黑子下棋" : "白子下棋"); } // 根据棋盘得分 private int getScore(int row, int col) { int score = 0; // 横向 for (int i = col - 4; i <= col; i++) { if (i < 0 || i + 4 >= COL) continue; int count = 0; for (int j = 0; j < 5; j++) { if (board[row][i + j] == player) count++; } if (count == 0) score += 7; else if (count == 1) score += 35; else if (count == 2) score += 800; else if (count == 3) score += 15000; else if (count == 4) score += 800000; } // 纵向 for (int i = row - 4; i <= row; i++) { if (i < 0 || i + 4 >= ROW) continue; int count = 0; for (int j = 0; j < 5; j++) { if (board[i + j][col] == player) count++; } if (count == 0) score += 7; else if (count == 1) score += 35; else if (count == 2) score += 800; else if (count == 3) score += 15000; else if (count == 4) score += 800000; } // 左上-右下 for (int i = row - 4, j = col - 4; i <= row && j <= col; i++, j++) { if (i < 0 || j < 0 || i + 4 >= ROW || j + 4 >= COL) continue; int count = 0; for (int k = 0; k < 5; k++) { if (board[i + k][j + k] == player) count++; } if (count == 0) score += 7; else if (count == 1) score += 35; else if (count == 2) score += 800; else if (count == 3) score += 15000; else if (count == 4) score += 800000; } // 右上-左下 for (int i = row - 4, j = col + 4; i <= row && j >= col; i++, j--) { if (i < 0 || j < 0 || i + 4 >= ROW || j - 4 >= COL) continue; int count = 0; for (int k = 0; k < 5; k++) { if (board[i + k][j - k] == player) count++; } if (count == 0) score += 7; else if (count == 1) score += 35; else if (count == 2) score += 800; else if (count == 3) score += 15000; else if (count == 4) score += 800000; } return score; } // 处理按钮事件 public void actionPerformed(ActionEvent e) { if (e.getSource() == btnStart) { initGame(); } else if (e.getSource() == btnRegret) { regretChess(); } else if (e.getSource() == btnExit) { System.exit(0); } else if (e.getSource() == btnHelp) { JOptionPane.showMessageDialog(this, "五子棋规则:\n1、黑方先行,双方轮流下子;\n2、每次只能下一子,落子后不能更改;\n3、当一方在横、竖、斜方向上先形成连续的五个子时,游戏结束,该方获胜。", "游戏规则", JOptionPane.INFORMATION_MESSAGE); } } public static void main(String[] args) { GobangGame game = new GobangGame(); game.setVisible(true); } } ``` 在代码中,我们使用JPanel来实现游戏的棋盘面板,并通过MouseListener监听鼠标点击事件,实现玩家下棋。同时,我们还提供了悔棋、重新开始、退出、帮助等功能,以及人人对战和人机对战两种模式。其中,电脑AI下棋的算法采用了一种简单的启发式算法,根据棋盘得分来决定电脑下棋的位置。

相关推荐

最新推荐

recommend-type

基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本116.0.5808.0)

资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom116.0.5808.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver116.0.5808.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)
recommend-type

2024消费趋势报告.pdf

2024消费趋势报告.pdf
recommend-type

PCB的电磁兼容设计+电子设计领域

1、EMC由EMI和EMS组成 2、EMS常见的整改措施 3、干扰=共模干扰+差模干扰 4、元器件的摆放 5、缝隙影响
recommend-type

给排水施工图全套.xdw.pdf

给排水施工图全套.xdw
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

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

MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差

![MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差](https://site.cdn.mengte.online/official/2021/11/20211128213137293.png) # 1. 正态分布概述 正态分布,又称高斯分布,是统计学中最重要的连续概率分布之一。它广泛应用于自然科学、社会科学和工程领域。 正态分布的概率密度函数为: ``` f(x) = (1 / (σ√(2π))) * exp(-(x - μ)² / (2σ²)) ``` 其中: - μ:正态分布的均值 - σ:正态分布的标准差 - π:圆周率 正态分布具有以下特性: - 对称性:
recommend-type

我正在开发一款个人碳足迹计算app,如何撰写其需求分析文档,请给我一个范例

为了更全面、清晰地定义个人碳足迹计算app的需求,需求分析文档应该包含以下内容: 1.项目简介:对该app项目的概述及目标进行说明。 2.用户分析:包括目标用户群、用户需求、行为等。 3.功能需求:对app的基本功能进行定义,如用户登录、数据录入、数据统计等。 4.非功能需求:对使用app的性能和质量等进行定义,如界面设计、数据安全、可扩展性等。 5.运行环境:包括app的开发环境和使用环境。 下面是一个范例: 需求分析文档 1. 项目简介 该app项目旨在为用户提供一款方便、易用、可定制的个人碳足迹计算平台,以促进环保和可持续性发展。 2. 用户分析 目标用户群:全球关
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依