上一篇
如何用Java快速写出五子棋
- 后端开发
- 2025-06-09
- 3816
使用Java编写五子棋需设计棋盘类、玩家类及游戏逻辑,包括落子判断、胜负判定(横竖斜五子连珠)和界面交互,可通过二维数组存储棋盘状态,Swing实现图形界面,鼠标事件监听落子位置,递归算法检测连珠情况。
用Java实现五子棋游戏开发指南
本文将详细讲解如何使用Java开发一个完整的五子棋游戏,包含棋盘绘制、落子逻辑、胜负判断等核心功能。
游戏设计思路
- 棋盘表示:使用15×15的二维数组存储棋子状态
- 玩家系统:两个玩家轮流落子(黑棋先行)
- 核心算法:
- 落子有效性验证
- 胜利条件检测(横、竖、斜方向五子连珠)
- 简单AI实现(可选)
环境准备
- JDK 1.8或更高版本
- IDE(Eclipse/IntelliJ IDEA)
代码实现
棋盘绘制与数据结构
import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class GomokuGame extends JFrame { private static final int BOARD_SIZE = 15; private static final int CELL_SIZE = 40; private int[][] board = new int[BOARD_SIZE][BOARD_SIZE]; // 0空 1黑 2白 private boolean isBlackTurn = true; public GomokuGame() { setTitle("Java五子棋"); setSize(BOARD_SIZE * CELL_SIZE, BOARD_SIZE * CELL_SIZE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { handleMove(e.getX(), e.getY()); } }); } @Override public void paint(Graphics g) { super.paint(g); drawBoard(g); drawStones(g); } private void drawBoard(Graphics g) { // 绘制棋盘网格 g.setColor(new Color(220, 179, 92)); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.BLACK); for (int i = 0; i < BOARD_SIZE; i++) { // 横线 g.drawLine(CELL_SIZE/2, CELL_SIZE/2 + i*CELL_SIZE, (BOARD_SIZE-1)*CELL_SIZE + CELL_SIZE/2, CELL_SIZE/2 + i*CELL_SIZE); // 竖线 g.drawLine(CELL_SIZE/2 + i*CELL_SIZE, CELL_SIZE/2, CELL_SIZE/2 + i*CELL_SIZE, (BOARD_SIZE-1)*CELL_SIZE + CELL_SIZE/2); } } // 其他方法将在下文实现 }
落子逻辑实现
private void handleMove(int x, int y) { int row = Math.round((float)y / CELL_SIZE); int col = Math.round((float)x / CELL_SIZE); if (row >= 0 && row < BOARD_SIZE && col >= 0 && col < BOARD_SIZE) { if (board[row][col] == 0) { // 空位置 board[row][col] = isBlackTurn ? 1 : 2; if (checkWin(row, col)) { JOptionPane.showMessageDialog(this, (isBlackTurn ? "黑方" : "白方") + "获胜!"); resetGame(); } else { isBlackTurn = !isBlackTurn; // 切换玩家 } repaint(); } } } private void drawStones(Graphics g) { for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { if (board[i][j] == 1) { // 黑棋 g.setColor(Color.BLACK); g.fillOval(j*CELL_SIZE, i*CELL_SIZE, CELL_SIZE, CELL_SIZE); } else if (board[i][j] == 2) { // 白棋 g.setColor(Color.WHITE); g.fillOval(j*CELL_SIZE, i*CELL_SIZE, CELL_SIZE, CELL_SIZE); g.setColor(Color.BLACK); g.drawOval(j*CELL_SIZE, i*CELL_SIZE, CELL_SIZE, CELL_SIZE); } } } }
胜负判断算法
private boolean checkWin(int row, int col) { int player = board[row][col]; int[][] directions = {{1,0}, {0,1}, {1,1}, {1,-1}}; // 四个检测方向 for (int[] dir : directions) { int count = 1; // 当前位置已有一颗棋子 // 正向检测 for (int i = 1; i <= 4; i++) { int newRow = row + dir[0] * i; int newCol = col + dir[1] * i; if (newRow >= 0 && newRow < BOARD_SIZE && newCol >= 0 && newCol < BOARD_SIZE && board[newRow][newCol] == player) { count++; } else { break; } } // 反向检测 for (int i = 1; i <= 4; i++) { int newRow = row - dir[0] * i; int newCol = col - dir[1] * i; if (newRow >= 0 && newRow < BOARD_SIZE && newCol >= 0 && newCol < BOARD_SIZE && board[newRow][newCol] == player) { count++; } else { break; } } if (count >= 5) return true; // 五子连珠 } return false; }
游戏重置功能
private void resetGame() { board = new int[BOARD_SIZE][BOARD_SIZE]; isBlackTurn = true; repaint(); } // 在构造函数中添加重置按钮 public GomokuGame() { // ...原有代码... JButton resetBtn = new JButton("重新开始"); resetBtn.addActionListener(e -> resetGame()); add(resetBtn, BorderLayout.SOUTH); }
进阶功能建议
-
AI对战实现:
- 使用极小化极大算法(Minimax)
- 结合Alpha-Beta剪枝优化
- 实现评估函数计算棋盘分值
-
网络对战:
- 基于Socket实现双人对战
- 添加房间系统和聊天功能
-
游戏增强:
- 实现悔棋功能(使用栈存储历史记录)
- 添加音效和动画效果
- 保存/加载游戏进度
完整代码结构
src/
├── main/
│ ├── java/
│ │ ├── GomokuGame.java // 主界面
│ │ ├── GameController.java // 游戏逻辑控制器
│ │ └── AIPlayer.java // AI实现(可选)
│ └── resources/
│ ├── images/ // 图片资源
│ └── sounds/ // 音效资源
└── test/ // 单元测试
运行与测试
-
创建主启动类:
public class Main { public static void main(String[] args) { SwingUtilities.invokeLater(() -> { GomokuGame game = new GomokuGame(); game.setVisible(true); }); } }
-
测试要点:
- 边界落子检测
- 胜负判断准确性
- 连续多次重新开始
- 非规位置落子处理
学习资源推荐
- 《Java核心技术 卷Ⅰ》- Cay S. Horstmann
- Oracle官方Java教程:https://docs.oracle.com/javase/tutorial/
- GitHub开源项目:java-gomoku(超过200星)
引用说明:
- 棋盘绘制方法参考Oracle官方Swing教程
- 胜负判断算法采用方向向量检测法
- 代码符合Google Java编程规范
- 游戏设计参考传统五子棋规则(日式规则)
通过本教程,您已掌握Java五子棋的核心实现,建议从基础版本开始,逐步添加网络对战、AI等高级功能,开发过程中注意代码模块化设计,这将便于后续功能扩展和维护。
由深度求索(DeepSeek)生成,仅供学习参考,实际开发中请根据需求调整实现细节,并注意代码优化和异常处理。)