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 学习之路提供帮助,也欢迎大家基于此代码进行二次开发,打造更具特色的黄金矿工游戏!

相关推荐
lichong9514 小时前
Android studio 修改包名
android·java·前端·ide·android studio·大前端·大前端++
一只叫煤球的猫4 小时前
建了索引还是慢?索引失效原因有哪些?这10个坑你踩了几个
后端·mysql·性能优化
lichong9515 小时前
Git 检出到HEAD 再修改提交commit 会消失解决方案
java·前端·git·python·github·大前端·大前端++
@yanyu6665 小时前
Tomcat安装与HTML响应实战
java·tomcat·html
Chen-Edward6 小时前
有了Spring为什么还有要Spring Boot?
java·spring boot·spring
magic334165636 小时前
Springboot整合MinIO文件服务(windows版本)
windows·spring boot·后端·minio·文件对象存储
开心-开心急了6 小时前
Flask入门教程——李辉 第一、二章关键知识梳理(更新一次)
后端·python·flask
掘金码甲哥6 小时前
调试grpc的哼哈二将,你值得拥有
后端
陈小桔7 小时前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven