Java Swing 实战:从零打造经典黄金矿工游戏
在 Java GUI 开发领域,Swing 是构建桌面应用的经典工具。本文将带大家基于 Swing 开发一款童年经典游戏 ------ 黄金矿工,涵盖游戏核心逻辑设计、图形渲染、交互控制等关键技术,最终实现一个包含关卡挑战、道具系统、碰撞检测的完整游戏案例。
文章目录
- [Java Swing 实战:从零打造经典黄金矿工游戏](#Java Swing 实战:从零打造经典黄金矿工游戏)
-
- 一、游戏整体介绍
- 二、核心类结构设计
-
- [1. 游戏主窗口类:GameWin](#1. 游戏主窗口类:GameWin)
- [2. 背景与界面类:Bg](#2. 背景与界面类:Bg)
- [3. 钩爪与绳子类:Line](#3. 钩爪与绳子类:Line)
- [4. 游戏物体基类:Object](#4. 游戏物体基类:Object)
- [5-7. 具体物体类:Gold、GoldMini、GoldPlus、Rock](#5-7. 具体物体类:Gold、GoldMini、GoldPlus、Rock)
- 三、关键技术难点与解决方案
-
- [1. 双缓冲解决画面闪烁](#1. 双缓冲解决画面闪烁)
- [2. 钩爪角度与运动控制](#2. 钩爪角度与运动控制)
- [3. 物体碰撞检测](#3. 物体碰撞检测)
- 四、游戏玩法与操作说明
-
- [1. 操作指南](#1. 操作指南)
- [2. 游戏流程](#2. 游戏流程)
- 五、代码运行与扩展建议
-
- [1. 运行准备](#1. 运行准备)
- [2. 功能扩展建议](#2. 功能扩展建议)
- 六、总结

一、游戏整体介绍
这款黄金矿工游戏具备以下核心功能:
-
多关卡挑战:共 5 个关卡,关卡难度随等级提升,目标积分逐步增加
-
丰富道具系统:包含三种规格金块(小金块、普通金块、大金块)和石块,不同物体对应不同积分与重量
-
药水道具:可使用药水加速金块回收,或丢弃抓取的石块
-
完整游戏流程:支持游戏开始、运行、商店购买、失败重试、胜利通关全流程
-
流畅视觉效果:采用双缓冲技术解决画面闪烁,实现钩爪平滑摇摆与抓取动画
游戏技术栈:Java SE + Swing GUI + AWT 绘图,无需第三方框架,纯原生 API 开发,适合 Java 初学者学习 GUI 编程与游戏逻辑设计。

二、核心类结构设计
游戏采用面向对象设计思想,将功能拆分为 7 个核心类,各模块职责清晰,便于维护与扩展。
1. 游戏主窗口类:GameWin
作为游戏入口,负责窗口初始化、事件监听、游戏循环与关卡切换,是整个游戏的 "总指挥"。

java
public class GameWin extends JFrame {
// 游戏状态常量:0-未开始 1-运行中 2-商店 3-失败 4-胜利
static int state;
// 存储所有游戏物体(金块、石块)
List<Object> objectList = new ArrayList<>();
// 背景对象与钩爪对象
Bg bg = new Bg();
Line line = new Line(this);
// 关键方法:
// launch():初始化窗口与事件监听
// nextLevel():关卡切换逻辑
// paint():双缓冲绘图,解决画面闪烁
}
核心技术点:
-
双缓冲绘图:通过
createImage
创建缓冲画布,先在缓冲画布绘制所有元素,再一次性渲染到窗口,彻底解决 Swing 绘图闪烁问题 -
鼠标事件监听:通过
MouseAdapter
处理左键(发射钩爪 / 购买道具)与右键(开始游戏 / 使用药水)操作 -
游戏循环:通过
while(true)
循环 +Thread.sleep(10)
控制游戏帧率(约 100FPS),保证画面流畅
2. 背景与界面类:Bg
负责绘制游戏背景、UI 信息(积分、时间、关卡)及商店逻辑,是游戏的 "信息展示中心"。
java
public class Bg {
static int level = 1; // 当前关卡
static int count = 0; // 总积分
static int waterNum = 3; // 药水数量
long startTime; // 关卡开始时间
// 关键方法:
// paintSelf():根据游戏状态绘制对应UI
// gameTime():判断关卡倒计时是否结束
// drawWord():封装文字绘制,统一UI风格
}
核心功能:
-
动态 UI 展示:实时显示积分、剩余时间、药水数量与当前关卡
-
商店系统:关卡胜利后进入商店,可消耗积分购买药水(价格随机)
-
倒计时机制:每关限时 20 秒,超时未达目标积分则游戏失败
3. 钩爪与绳子类:Line
实现游戏最核心的交互逻辑 ------ 钩爪摇摆、发射、抓取与回收,是玩家操作的 "核心载体"。
java
public class Line {
// 绳子起点(矿工位置)与终点(钩爪位置)
int x = 380, y = 180;
int endx = 500, endy = 500;
// 绳长范围与角度控制
double length = 100, MIN_length = 100, MAX_length = 750;
double n = 0; // 角度百分比
// 状态:0-摇摆 1-发射 2-回收 3-抓取返回
int state;
// 关键方法:
// logic():碰撞检测,判断钩爪是否抓取物体
// lines():绘制绳子与钩爪
// paintSelf():根据状态更新钩爪位置与动画
}
核心逻辑解析:
-
钩爪摇摆:通过角度变量
n
与方向变量dir
控制,在 0.1~0.9 弧度范围内左右摇摆 -
碰撞检测:通过坐标判断钩爪终点是否在物体矩形范围内,触发抓取逻辑
-
抓取回收:根据物体质量调整回收速度(石块重、速度慢;金块轻、速度快),使用药水可加速金块回收或丢弃石块
4. 游戏物体基类:Object
定义所有游戏物体(金块、石块)的共同属性与方法,实现代码复用。
java
public class Object {
int x, y; // 坐标
int width, height; // 宽高
Image img; // 物体图片
boolean flag; // 是否被抓取
int m; // 质量
int count; // 积分
int type; // 类型:1-金块 2-石块
// 关键方法:
// paintSelf():绘制物体
// getRec():获取物体碰撞矩形,用于碰撞检测
}
5-7. 具体物体类:Gold、GoldMini、GoldPlus、Rock
继承自Object
类,分别实现不同规格金块与石块的个性化属性,体现面向对象的继承特性。
物体类型 | 尺寸 | 质量 | 积分 | 特点 |
---|---|---|---|---|
小金块(GoldMini) | 30x30 | 5 | 2 | 体积小、重量轻、积分少 |
普通金块(Gold) | 50x50 | 10 | 5 | 均衡属性,游戏主要积分来源 |
大金块(GoldPlus) | 70x70 | 20 | 10 | 体积大、重量重、积分高 |
石块(Rock) | 71x71 | 50 | 1 | 重量大、积分低,建议使用药水丢弃 |
物体生成逻辑 :在GameWin
初始化时,通过随机数生成 11 个金块(30% 小金块、40% 普通金块、30% 大金块)与 5 个石块,同时通过碰撞检测确保物体不重叠。
三、关键技术难点与解决方案
1. 双缓冲解决画面闪烁
Swing 默认绘图直接在窗口组件上进行,当频繁重绘时会出现闪烁。解决方案:
java
// 1. 创建缓冲画布
offScreenImage = this.createImage(768, 1000);
Graphics gImage = offScreenImage.getGraphics();
// 2. 在缓冲画布上绘制所有元素
bg.paintSelf(gImage);
if(state==1){
for(Object obj:objectList) obj.paintSelf(gImage);
line.paintSelf(gImage);
}
// 3. 将缓冲画布一次性渲染到窗口
g.drawImage(offScreenImage,0,0,null);
2. 钩爪角度与运动控制
通过三角函数计算钩爪位置,实现平滑摇摆与发射:
java
// 根据角度n与绳长length计算钩爪终点坐标
endx = (int) (x + length*Math.cos(n* Math.PI));
endy = (int) (y + length*Math.sin(n*Math.PI));
// 摇摆控制:通过dir变量切换方向,n在0.1~0.9之间循环
if(n<0.1) dir=1;
else if(n>0.9) dir=-1;
n += 0.005*dir;
3. 物体碰撞检测
利用Rectangle
类的intersects
方法判断物体是否重叠,确保生成物体不重叠:
java
// 检测新生成的金块是否与已有物体重叠
for(Object obj:objectList){
if(gold.getRec().intersects(obj.getRec())){
isPlace=false; // 重叠则标记不可放置
}
}
if(isPlace) objectList.add(gold);
else {isPlace=true;i--;} // 重叠则重新生成
四、游戏玩法与操作说明
1. 操作指南
操作 | 功能 | 适用场景 |
---|---|---|
鼠标右键 | 开始游戏 / 使用药水 | 未开始状态(启动游戏)、抓取返回时(加速回收) |
鼠标左键 | 发射钩爪 / 购买药水 | 运行中(发射钩爪)、商店界面(购买药水) |
2. 游戏流程
-
准备阶段:启动游戏后进入准备状态,右键点击开始第一关
-
游戏阶段:钩爪自动摇摆,左键发射钩爪抓取金块,右键使用药水(加速或丢弃石块)
-
关卡切换:20 秒内达到目标积分则进入商店,可购买药水;未达标则失败
-
通关条件:完成 5 个关卡挑战,即可获得游戏胜利
五、代码运行与扩展建议
1. 运行准备
-
创建
com.sxt
包,将上述 8 个类按包结构放置 -
在项目根目录创建
imgs
文件夹,放入游戏所需图片(bg.jpg、bg1.jpg、peo.png、water.png、gold.png、gold_mini.png、gold_plus.png、rock1.png) -
运行
TestGame
类的main
方法,启动游戏
2. 功能扩展建议
-
增加音效系统:在钩爪发射、抓取物体、通关失败时添加音效,提升游戏体验
-
优化关卡难度:随关卡提升增加石块数量或减少时间限制,增强挑战性
-
新增道具:如磁铁(吸引周围金块)、炸弹(清除范围内石块),丰富游戏玩法
-
排行榜系统:使用文件存储玩家最高分数,实现排行榜功能
六、总结
本项目通过 Java Swing 实现了经典黄金矿工游戏的完整功能,涵盖 GUI 绘图、事件处理、碰撞检测、游戏循环等核心技术。代码采用面向对象设计,结构清晰、易于扩展,适合 Java 初学者学习桌面应用开发与游戏逻辑设计。
通过本项目,你可以掌握:
-
Swing 组件的使用与自定义绘图
-
双缓冲技术解决画面闪烁
-
基于坐标与矩形的碰撞检测
-
游戏状态机与流程控制
-
面向对象的封装、继承与多态特性
希望本文能为你的 Java 学习之路提供帮助,也欢迎大家基于此代码进行二次开发,打造更具特色的黄金矿工游戏!