基于 Java Swing 开发的经典三消益智游戏,采用 MVC 架构,包含多难度关卡、道具系统、音效系统与存档功能。
本项目是一款使用 Java Swing 开发的三消益智游戏(类似"开心消消乐")。玩家在 8×8 的棋盘上,通过交换相邻棋子使同类棋子连成三个或以上来消除得分,在规定步数内达到目标分数即可通关。
游戏采用经典的 MVC(Model-View-Controller) 架构,代码结构清晰,并配备了完整的背景音乐、音效、道具购买、游戏存档等系统。
- 经典三消玩法:交换相邻棋子,形成横向或纵向三连及以上即可消除
- 5 种棋子类型:蜗牛 🐌、鲸鱼 🐳、青蛙 🐸、小鸡 🐔、螃蟹 🦀
- 4 档难度等级:简单 / 普通 / 困难 / 地狱,难度层层递进
- 3 种特殊道具:炸弹、鞭炮、十字炸弹,可用分数购买
- 提示功能:一键显示当前棋盘上可交换的棋子对
- 自动模式:AI 自动寻找并执行最优交换,适合观察游戏逻辑
- 游戏存档:支持将当前局面保存为
.txt文件,并随时读取恢复 - 完整音效:包含背景音乐、消除音效、道具音效、胜负音效等
- 连锁消除奖励:单次消除 5 个或以上时触发连锁奖励,随机消除额外 5 个棋子并加分
- 死胡同检测:棋盘无法继续消除时自动提示玩家使用道具
| 依赖项 | 版本要求 |
|---|---|
| JDK | 11 或以上 |
| IDE | IntelliJ IDEA(推荐)/ Eclipse / VS Code |
| 操作系统 | Windows / macOS / Linux |
项目无第三方依赖,仅使用 Java 标准库(
javax.swing、javax.sound.sampled)。
xiaoxiaole2_java_project/
├── src/
│ ├── Main.java # 程序入口
│ ├── controller/
│ │ └── GameController.java # 游戏控制器(核心逻辑)
│ ├── listener/
│ │ └── GameListener.java # 游戏事件监听接口
│ ├── model/
│ │ ├── Cell.java # 单元格模型
│ │ ├── Chessboard.java # 棋盘模型(消除、下落、存档逻辑)
│ │ ├── ChessboardPoint.java # 棋盘坐标
│ │ ├── ChessPiece.java # 棋子模型
│ │ ├── Constant.java # 常量(棋盘尺寸、棋子颜色映射)
│ │ └── Util.java # 工具类(随机选取)
│ ├── view/
│ │ ├── CellComponent.java # 单元格 UI 组件
│ │ ├── ChessboardComponent.java # 棋盘 UI 组件
│ │ ├── ChessComponent.java # 棋子 UI 组件
│ │ ├── ChessGameFrame.java # 主窗口(按钮、菜单、布局)
│ │ └── MusicTool1.java # 音效播放工具
│ └── music/
│ ├── bgm.wav # 背景音乐
│ ├── bomb.wav # 炸弹音效
│ ├── firework1.wav # 鞭炮音效
│ ├── firework2.wav # 十字炸弹音效
│ ├── win.wav # 胜利音效
│ ├── fail.wav # 失败音效
│ ├── click1.wav / click2.wav # 点击音效
│ ├── clear1~7.wav # 消除音效(随机播放)
│ ├── fall.wav # 棋子下落音效
│ └── loadOrSave.wav # 存读档音效
├── pictures/
│ ├── *.jpg # 游戏背景图
│ └── *.png # 道具图标 / 标题图片
├── xiaoxiaole2.iml # IntelliJ 模块配置
└── README.md
git clone <仓库地址>
cd xiaoxiaole2_java_project- 打开 IntelliJ IDEA,选择 Open → 选择项目根目录
xiaoxiaole2_java_project - 确认 SDK 已配置为 JDK 11 或以上
- 将
src目录标记为 Sources Root(右键 → Mark Directory as → Sources Root) - 运行
src/Main.java中的main方法
# 编译(在项目根目录执行)
javac -encoding UTF-8 -d out/production/xiaoxiaole2 -sourcepath src src/Main.java
# 运行
java -cp out/production/xiaoxiaole2 Main注意:运行时工作目录需为项目根目录,否则图片和音效路径会找不到。
- 选中棋子:鼠标左键单击棋盘上的任意棋子,被选中的棋子会高亮显示
- 选择目标:再次单击与第一个棋子相邻(上下左右)的棋子
- 确认交换:点击右侧 Confirm Swap 按钮,若此次交换能形成三连,交换成功并自动消除
- 棋子下落:消除后点击 Next Step 按钮,使上方棋子下落填补空位
- 补充棋子:再次点击 Next Step,系统自动在空位补充新棋子
| 按钮 | 功能 |
|---|---|
| Confirm Swap | 确认交换选中的两个相邻棋子 |
| Next Step | 执行下一步骤(棋子下落 → 补充新棋子) |
| Restart | 重新开始当前难度的游戏 |
| Props | 使用一次性道具(重置棋盘,消耗一个道具次数) |
| Tips | 显示当前棋盘上一个可交换的棋子对坐标 |
| Load | 从指定路径读取存档文件 |
| Save | 将当前游戏状态保存到指定路径 |
| Automatically | 开启/关闭 AI 自动模式 |
| use it(道具栏) | 使用对应道具(炸弹 / 鞭炮 / 十字炸弹) |
- 难度选择:在游戏过程中随时切换简单 / 普通 / 困难 / 地狱四种难度
- 道具商城:用分数购买道具
- 炸弹:消耗 10 分
- 鞭炮:消耗 30 分
- 十字炸弹:消耗 50 分
| 显示区域 | 含义 |
|---|---|
| 左上角计数器 | 当前关卡目标分数(targetScore)和总步数限制(totalSteps) |
| 右侧 Mod 标签 | 当前难度(Easy / Normal / Hard / Impossible) |
| 右侧 Score/Step | 当前已得分数和已用步数 |
| 左侧道具栏 | 三种道具的图标、剩余数量及使用按钮 |
| 难度 | 显示名称 | 目标分数 | 步数限制 |
|---|---|---|---|
| 简单 | Easy | 10 分 | 10000 步 |
| 普通 | Normal | 100 分 | 50 步 |
| 困难 | Hard | 200 分 | 50 步 |
| 地狱 | Impossible | 500 分 | 30 步 |
- 通关后游戏会询问是否进入下一难度,选择"是"则自动升级
- 在地狱难度通关后会显示特别提示"太6了"
- 失败(超过步数限制且未达目标分数)后自动重置当前难度重开
游戏共有三种特殊道具,每局开始时各持有 1 个,可通过消耗分数在道具商城中购买补充。
注意:所有道具均需在棋盘棋子全部落下后才能使用,否则会提示失败并退还道具。
- 效果:以最后一个选中棋子为中心,消除周围 3×3 范围内的所有棋子(最多 9 个)
- 得分:固定 +9 分
- 购买价格:10 分
- 效果:随机消除棋盘上 10 个棋子
- 得分:固定 +10 分
- 购买价格:30 分
- 效果:消除最后一个选中棋子所在整行和整列的所有棋子(最多 15 个)
- 得分:固定 +17 分
- 购买价格:50 分
普通交换消除时,若单次消除数量达到 5 个或以上,会触发连锁爆炸效果:
- 播放炸弹音效
- 额外随机消除棋盘上 5 个棋子
- 额外 +5 分
点击 Props 按钮将消耗一次道具使用机会(初始 3 次),直接重新随机生成整个棋盘,适合在棋盘陷入僵局时使用。
游戏支持将当前局面保存为纯文本 .txt 文件,便于随时暂停和恢复。
- 点击 Save 按钮
- 在弹出的输入框中填写保存路径,例如:
D:/save/game1.txt - 文件将自动创建并写入当前游戏数据
- 点击 Load 按钮
- 在弹出的输入框中填写存档文件路径,例如:
D:/save/game1.txt - 游戏将恢复存档时的棋盘状态、分数、步数、道具数量和难度
存档文件共 15 行,格式如下:
第 1~8 行:棋盘数据,每行 8 个棋子 Emoji,空位用 0 表示,空格分隔
第 9 行:当前分数
第 10 行:当前步数
第 11 行:剩余 Props 次数
第 12 行:炸弹数量
第 13 行:鞭炮数量
第 14 行:十字炸弹数量
第 15 行:当前难度等级(1=简单, 2=普通, 3=困难, 4=地狱)
示例:
🐌 🐳 🐸 🐔 🦀 🐌 🐳 🐸
🐔 🦀 🐌 🐳 🐸 🐔 🦀 🐌
...(共8行棋盘数据)
42
18
2
1
1
1
2
点击 Automatically 按钮可开启 AI 自动模式:
- AI 会自动扫描棋盘,找到当前可以产生消除的棋子对
- 高亮显示目标棋子(黄色)约 2 秒后自动执行交换和消除
- 持续循环直到棋盘无法继续自动消除,届时提示玩家手动使用道具
- 再次点击 Automatically 并选择"否"可关闭自动模式
提示:自动模式下步数和分数照常计算,不影响游戏进程。
| 音效文件 | 触发时机 |
|---|---|
bgm.wav |
游戏启动后持续播放背景音乐 |
click1.wav |
第一次点击选中棋子 |
click2.wav |
取消选中 / 切换选中棋子 |
clear1~7.wav |
消除棋子时随机播放其中一首 |
bomb.wav |
使用炸弹道具 / 触发连锁奖励 |
firework1.wav |
使用鞭炮道具 |
firework2.wav |
使用十字炸弹道具 |
fall.wav |
棋子下落动画 |
win.wav |
达到目标分数(胜利) |
fail.wav |
超过步数限制(失败) |
loadOrSave.wav |
读取或保存存档 |
本项目采用经典 MVC 三层架构:
┌─────────────────────────────────────────────────────┐
│ View(视图层) │
│ ChessGameFrame · ChessboardComponent · ChessComponent │
│ CellComponent · MusicTool1 │
└──────────────────────┬──────────────────────────────┘
│ 事件通知 / 界面更新
┌──────────────────────▼──────────────────────────────┐
│ Controller(控制器层) │
│ GameController │
│ · 处理玩家输入(点击、交换、道具、存读档) │
│ · 调用 Model 执行业务逻辑 │
│ · 通知 View 刷新界面 │
└──────────────────────┬──────────────────────────────┘
│ 数据读写
┌──────────────────────▼──────────────────────────────┐
│ Model(模型层) │
│ Chessboard · Cell · ChessPiece · ChessboardPoint │
│ Constant · Util │
│ · 存储棋盘状态 │
│ · 执行消除、下落、补充、存读档逻辑 │
└─────────────────────────────────────────────────────┘
事件流转路径:
- 玩家点击棋子 →
ChessboardComponent捕获鼠标事件 - 调用
GameListener接口 → 转发给GameController GameController调用Chessboard(Model)执行逻辑- 逻辑执行完毕后
GameController刷新ChessboardComponent(View)
棋盘的核心数据模型,包含以下关键方法:
| 方法 | 说明 |
|---|---|
initPieces() |
随机初始化棋盘,确保初始状态无三连 |
boardCheck() |
检查棋盘是否存在三连,返回 true 表示有可消除棋子 |
clearAllChess() |
扫描全棋盘,标记并清除所有可消除棋子,返回消除数量 |
downAfterClear(i, j) |
使 (i,j) 位置的棋子向下移动一格(带动画延迟) |
creatChess() |
在空位随机补充新棋子 |
canSwap(p1, p2) |
判断交换两个位置后是否产生三连 |
convertBoardToList() |
将棋盘序列化为字符串列表(用于存档) |
convertListToBoard(list) |
从字符串列表反序列化棋盘(用于读档) |
num1 状态机说明:
num1 值 |
含义 |
|---|---|
1 |
下一步执行棋子下落 |
2 |
下一步执行补充新棋子 |
3 |
补充新棋子后检测到新三连,继续消除 |
负责协调 Model 和 View,核心职责包括:
- 维护分数(
score)、步数(steps)、难度等级(level) - 管理三种道具的数量(
bombNum/firecrackerNum/crossBombNum) - 胜负判定与难度晋级逻辑
- 存读档的序列化 / 反序列化调用
- 自动模式的多线程控制(
Thread+Thread.sleep)
游戏界面的容器类,负责:
- 创建并布局所有 UI 组件(按钮、标签、棋盘、道具栏)
- 添加菜单栏(难度选择、道具商城)
- 初始化背景图片和背景音乐
- 将 UI 组件与
GameController绑定
基于 javax.sound.sampled 的音效播放工具:
- 支持音量控制(
MASTER_GAIN) - 消除音效(
clear1~7.wav)每次播放时随机选择,增加游戏趣味性 - 通过
Clip实现非阻塞异步播放