Java课程设计——五子棋游戏
一、课程设计目的
本次Java课程设计以五子棋双人对战小游戏为开发项目,综合运用大一Java基础语法、面向对象编程、Swing图形界面、二维数组存储、鼠标事件监听、循环与分支结构等知识点。
通过完成整个项目的设计、编码、调试与总结,掌握Java桌面小程序开发流程,提升逻辑分析、代码编写、Bug调试以及课程设计文档写作能力,将课本理论知识应用到实际编程实践中。
二、开发环境
1. 操作系统:Windows 10、Windows 11
2. 开发工具:IntelliJ IDEA、Eclipse
3. 开发语言:Java SE
4. 界面技术:Swing GUI图形用户界面
5. 运行方式:桌面窗口可视化运行
三、系统功能概述
1. 绘制标准15×15五子棋棋盘网格界面;
2. 黑白棋子双人交替落子对战;
3. 禁止棋盘外落子、禁止同一位置重复落子;
4. 自动判断横、竖、两条斜线四个方向五子连珠;
5. 一方获胜弹窗提示,自动结束本局游戏;
6. 界面简洁美观,程序运行稳定无报错。
四、核心技术与知识点
1. 面向对象:类、成员方法、内部类、代码封装;
2. 二维数组:存储棋盘空位、黑棋、白棋状态;
3. Swing:JFrame窗口、JPanel画布、Graphics绘图;
4. 鼠标事件:MouseListener监听鼠标点击位置;
5. 流程控制:for循环遍历、if-else逻辑判断;
6. repaint()界面重绘,实时刷新棋盘和棋子。
五、总体设计思路
创建主窗口类,设置窗口大小、标题、居中显示与关闭属性。自定义画布类继承JPanel,重写绘图方法绘制棋盘线条和黑白棋子。
使用二维数组记录棋盘每个点位状态,监听鼠标点击坐标并换算为棋盘行列,做边界和重复落子合法性校验。合法落子后切换玩家,同时调用五子连珠判断算法。
从横向、纵向、斜向四个方向双向统计连续同色棋子,达到5颗及以上则判定胜利,弹窗提示游戏结束。
六、完整源代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* 大一Java五子棋课程设计 双人对战完整版
*/
public class FiveChess extends JFrame {
public static final int SIZE = 15;
public static final int CELL = 40;
public static final int OFFSET = 20;
private int[][] board = new int[SIZE][SIZE];
private int currentPlayer = 1;
private boolean isGameOver = false;
private ChessPanel panel;
public FiveChess() {
setTitle("Java五子棋课程设计");
setSize(OFFSET * 2 + CELL * SIZE + 20, OFFSET * 2 + CELL * SIZE + 50);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(false);
panel = new ChessPanel();
add(panel);
panel.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if (isGameOver) return;
int x = e.getX();
int y = e.getY();
int row = (y - OFFSET + CELL / 2) / CELL;
int col = (x - OFFSET + CELL / 2) / CELL;
if (row < 0 || row >= SIZE || col < 0 || col >= SIZE) return;
if (board[row][col] != 0) return;
board[row][col] = currentPlayer;
panel.repaint();
if (checkWin(row, col)) {
isGameOver = true;
String winner = currentPlayer == 1 ? "黑棋" : "白棋";
JOptionPane.showMessageDialog(null, winner + "获胜,游戏结束!");
return;
}
currentPlayer = currentPlayer == 1 ? 2 : 1;
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
});
}
// 五子连珠胜负判断
private boolean checkWin(int row, int col) {
int val = board[row][col];
int[][] dir = {{0,1},{1,0},{1,1},{1,-1}};
for (int[] d : dir) {
int count = 1;
int r = row + d[0], c = col + d[1];
while (r >= 0 && r < SIZE && c >= 0 && c < SIZE && board[r][c] == val) {
count++;
r += d[0];
c += d[1];
}
r = row - d[0];
c = col - d[1];
while (r >= 0 && r < SIZE && c >= 0 && c < SIZE && board[r][c] == val) {
count++;
r -= d[0];
c -= d[1];
}
if (count >= 5) return true;
}
return false;
}
// 棋盘绘图画布
private class ChessPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(Color.BLACK);
for(int i = 0; i < SIZE; i++){
g.drawLine(OFFSET, OFFSET + i*CELL,
OFFSET+(SIZE-1)*CELL, OFFSET+i*CELL);
g.drawLine(OFFSET + i*CELL, OFFSET,
OFFSET+i*CELL, OFFSET+(SIZE-1)*CELL);
}
for(int i = 0; i < SIZE; i++){
for(int j = 0; j < SIZE; j++){
int p = board[i][j];
if(p == 0) continue;
if(p == 1) g.setColor(Color.BLACK);
else g.setColor(Color.WHITE);
g.fillOval(OFFSET+j*CELL-15, OFFSET+i*CELL-15,30,30);
if(p == 2){
g.setColor(Color.BLACK);
g.drawOval(OFFSET+j*CELL-15, OFFSET+i*CELL-15,30,30);
}
}
}
}
}
public static void main(String[] args) {
new FiveChess().setVisible(true);
}
}
七、程序运行说明
1. 新建Java项目,创建类 FiveChess,粘贴上述代码;
2. 运行 main 方法,自动弹出五子棋游戏窗口;
3. 鼠标点击棋盘交叉点落子,黑白双方轮流下棋;
4. 率先连成五子一方弹窗获胜,游戏结束。
八、开发中遇到的问题及解决方法
1. 鼠标点击位置与棋盘错位
解决:通过固定格子大小和偏移量,精准换算鼠标坐标为棋盘行列。
2. 支持重复位置落子
解决:判断二维数组点位状态,已有棋子禁止再次落子。
3. 斜线五子无法识别
解决:设置四个方向,正反双向遍历统计连续棋子数量。
4. 棋子画面不刷新
解决:落子后调用 repaint() 方法重绘画布。
