Java Swing 实战:从零打造经典黄金矿工游戏

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. 游戏流程

  1. 准备阶段:启动游戏后进入准备状态,右键点击开始第一关

  2. 游戏阶段:钩爪自动摇摆,左键发射钩爪抓取金块,右键使用药水(加速或丢弃石块)

  3. 关卡切换:20 秒内达到目标积分则进入商店,可购买药水;未达标则失败

  4. 通关条件:完成 5 个关卡挑战,即可获得游戏胜利

五、代码运行与扩展建议

1. 运行准备

  1. 创建com.sxt包,将上述 8 个类按包结构放置

  2. 在项目根目录创建imgs文件夹,放入游戏所需图片(bg.jpg、bg1.jpg、peo.png、water.png、gold.png、gold_mini.png、gold_plus.png、rock1.png)

  3. 运行TestGame类的main方法,启动游戏

2. 功能扩展建议

  • 增加音效系统:在钩爪发射、抓取物体、通关失败时添加音效,提升游戏体验

  • 优化关卡难度:随关卡提升增加石块数量或减少时间限制,增强挑战性

  • 新增道具:如磁铁(吸引周围金块)、炸弹(清除范围内石块),丰富游戏玩法

  • 排行榜系统:使用文件存储玩家最高分数,实现排行榜功能

六、总结

本项目通过 Java Swing 实现了经典黄金矿工游戏的完整功能,涵盖 GUI 绘图、事件处理、碰撞检测、游戏循环等核心技术。代码采用面向对象设计,结构清晰、易于扩展,适合 Java 初学者学习桌面应用开发与游戏逻辑设计。

通过本项目,你可以掌握:

  • Swing 组件的使用与自定义绘图

  • 双缓冲技术解决画面闪烁

  • 基于坐标与矩形的碰撞检测

  • 游戏状态机与流程控制

  • 面向对象的封装、继承与多态特性

希望本文能为你的 Java 学习之路提供帮助,也欢迎大家基于此代码进行二次开发,打造更具特色的黄金矿工游戏!

相关推荐
葫芦和十三3 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp3 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑4 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯4 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan7 小时前
多Agent之间的区别
后端
青石路8 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充9 小时前
1.面向对象设计思想
后端
IT_陈寒9 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro10 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗10 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端