当前位置: 首页 > news >正文

Java学习第四周博客

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() 方法重绘画布。

http://www.jsqmd.com/news/791844/

相关文章:

  • 别再手动拷贝文件了!HBuilder云打包APK的两种高效工作流对比(本地嵌入 vs. 远程URL)
  • QMC音频转换工具终极指南:快速免费解锁加密音乐文件
  • Blue Archive自动脚本:Mumu模拟器检测问题终极解决指南
  • 深入剖析`ReentrantReadWriteLock`源码——虚拟线程时代机遇、挑战与演进
  • AcFun视频离线保存:3个关键场景下的智能下载解决方案
  • 111.YOLOv1手动复现完整代码,从网络定义到NMS后处理
  • Python: Condition Variable Pattern
  • LinkSwift:八大网盘直链下载终极解决方案,告别客户端束缚
  • 2025届毕业生推荐的六大降AI率神器解析与推荐
  • LinkSwift:免费网盘直链下载的完整解决方案
  • WPS-Zotero插件终极指南:5步实现科研写作效率翻倍的完整教程
  • 从LTE到5G NR:同步信号设计演进全解析,SSB为何是性能提升的关键
  • 2026淮北干洗店大测评,权威排名帮你省心选优店! - GrowthUME
  • DLSS Swapper深度解析:游戏性能优化利器实战指南
  • 5步优化DXVK配置:告别游戏卡顿与兼容性问题
  • 5.6 springboot项目配置
  • 抖音评论数据采集神器:3分钟零代码获取完整评论数据
  • NPYViewer终极指南:如何5分钟快速可视化NumPy数组数据
  • 长期使用Taotoken平台对于模型选型决策效率的实际影响
  • LinkSwift:九大网盘直链下载,告别限速烦恼
  • 从Eclipse转战IDEA?这份无缝迁移指南和习惯养成清单请收好
  • LinkSwift:免费网盘直链下载的终极指南
  • ClawTrust:基于ERC-8004与ERC-8183构建AI智能体链上声誉与任务市场
  • Win10桌面美化避坑指南:从MyDock安装到任务栏隐藏,这些细节决定成败
  • 聚合测评:2026年值得关注的15家上海及周边SEO与网站建设公司 - 速递信息
  • 告别窗口切换烦恼:PinWin让你的Windows工作流焕然一新
  • QtMqtt模块编译实战:从源码到集成的关键步骤与排错指南
  • 在Node.js服务中集成Taotoken实现稳定的大模型调用方案
  • 观察 Taotoken 账单明细如何助力项目成本分析与优化
  • 避开5G上行同步的坑:手把手调试Timing Advance相关参数(含TATimer配置)