Skip to content

Tmq244/xiaoxiaole2_java_project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

消消乐 2 —— Java 版三消益智游戏

基于 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.swingjavax.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

快速开始

1. 克隆或下载项目

git clone <仓库地址>
cd xiaoxiaole2_java_project

2. 使用 IntelliJ IDEA 打开

  1. 打开 IntelliJ IDEA,选择 Open → 选择项目根目录 xiaoxiaole2_java_project
  2. 确认 SDK 已配置为 JDK 11 或以上
  3. src 目录标记为 Sources Root(右键 → Mark Directory as → Sources Root)
  4. 运行 src/Main.java 中的 main 方法

3. 使用命令行编译运行

# 编译(在项目根目录执行)
javac -encoding UTF-8 -d out/production/xiaoxiaole2 -sourcepath src src/Main.java

# 运行
java -cp out/production/xiaoxiaole2 Main

注意:运行时工作目录需为项目根目录,否则图片和音效路径会找不到。


游戏玩法

基本操作

  1. 选中棋子:鼠标左键单击棋盘上的任意棋子,被选中的棋子会高亮显示
  2. 选择目标:再次单击与第一个棋子相邻(上下左右)的棋子
  3. 确认交换:点击右侧 Confirm Swap 按钮,若此次交换能形成三连,交换成功并自动消除
  4. 棋子下落:消除后点击 Next Step 按钮,使上方棋子下落填补空位
  5. 补充棋子:再次点击 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 按钮(重置道具)

点击 Props 按钮将消耗一次道具使用机会(初始 3 次),直接重新随机生成整个棋盘,适合在棋盘陷入僵局时使用。


存档与读档

游戏支持将当前局面保存为纯文本 .txt 文件,便于随时暂停和恢复。

保存游戏

  1. 点击 Save 按钮
  2. 在弹出的输入框中填写保存路径,例如:D:/save/game1.txt
  3. 文件将自动创建并写入当前游戏数据

读取存档

  1. 点击 Load 按钮
  2. 在弹出的输入框中填写存档文件路径,例如:D:/save/game1.txt
  3. 游戏将恢复存档时的棋盘状态、分数、步数、道具数量和难度

存档文件格式

存档文件共 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                                     │
│  · 存储棋盘状态                                      │
│  · 执行消除、下落、补充、存读档逻辑                  │
└─────────────────────────────────────────────────────┘

事件流转路径:

  1. 玩家点击棋子 → ChessboardComponent 捕获鼠标事件
  2. 调用 GameListener 接口 → 转发给 GameController
  3. GameController 调用 Chessboard(Model)执行逻辑
  4. 逻辑执行完毕后 GameController 刷新 ChessboardComponent(View)

核心类说明

Chessboard(棋盘模型)

棋盘的核心数据模型,包含以下关键方法:

方法 说明
initPieces() 随机初始化棋盘,确保初始状态无三连
boardCheck() 检查棋盘是否存在三连,返回 true 表示有可消除棋子
clearAllChess() 扫描全棋盘,标记并清除所有可消除棋子,返回消除数量
downAfterClear(i, j) 使 (i,j) 位置的棋子向下移动一格(带动画延迟)
creatChess() 在空位随机补充新棋子
canSwap(p1, p2) 判断交换两个位置后是否产生三连
convertBoardToList() 将棋盘序列化为字符串列表(用于存档)
convertListToBoard(list) 从字符串列表反序列化棋盘(用于读档)

num1 状态机说明:

num1 含义
1 下一步执行棋子下落
2 下一步执行补充新棋子
3 补充新棋子后检测到新三连,继续消除

GameController(游戏控制器)

负责协调 Model 和 View,核心职责包括:

  • 维护分数(score)、步数(steps)、难度等级(level
  • 管理三种道具的数量(bombNum / firecrackerNum / crossBombNum
  • 胜负判定与难度晋级逻辑
  • 存读档的序列化 / 反序列化调用
  • 自动模式的多线程控制(Thread + Thread.sleep

ChessGameFrame(主窗口)

游戏界面的容器类,负责:

  • 创建并布局所有 UI 组件(按钮、标签、棋盘、道具栏)
  • 添加菜单栏(难度选择、道具商城)
  • 初始化背景图片和背景音乐
  • 将 UI 组件与 GameController 绑定

MusicTool1(音效工具)

基于 javax.sound.sampled 的音效播放工具:

  • 支持音量控制(MASTER_GAIN
  • 消除音效(clear1~7.wav)每次播放时随机选择,增加游戏趣味性
  • 通过 Clip 实现非阻塞异步播放

About

the project of java in sustech

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages