# java多线程游戏 **Repository Path**: jiang-fengji/java-multi-threaded-game ## Basic Information - **Project Name**: java多线程游戏 - **Description**: 这是一个关于java多线程的幸运红包雨游戏 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-06 - **Last Updated**: 2025-05-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java多线程游戏 #### 介绍 这是一个关于java多线程的幸运红包雨游戏 #### 软件架构 一、整体架构分层 1. 表现层(Presentation Layer) 职责:负责用户界面展示与交互,处理用户输入输出 实现: 核心类:RedPacketGame(继承 JFrame) 组件: 输入组件:文本框(参与人数、红包数、金额)、按钮(确认 / 开始 / 重置) 显示组件: statusLabel:使用 HTML 标签实现富文本显示(居中、加粗、颜色样式) logArea:滚动文本区域显示抢红包日志 布局:BorderLayout 分区(顶部输入区、中部状态 / 日志区、底部按钮区) 技术点: 通过 SwingUtilities.invokeLater() 保证 UI 更新在事件调度线程执行 透明背景面板与自定义图片渲染(paintComponent 方法) 2. 业务逻辑层(Business Logic Layer) 职责:处理抢红包核心逻辑(分配算法、线程控制、状态更新) 实现: 核心类: GameUtil:静态工具类,存储共享数据(剩余金额、红包数、参与者列表),提供初始化方法 GrabRedPacketThread:内部线程类(实现 Runnable),封装抢红包具体逻辑(随机分配、数据更新) 关键逻辑: 红包分配算法:支持最后一个红包全金额分配,非最后红包随机生成(最小 0.01 元) 线程安全:通过 synchronized (GrabRedPacketThread.class) 保证共享数据(money、count)的原子性操作 设计模式: 简单 策略模式 雏形(可扩展不同分配策略,但当前代码未抽象策略接口) 3. 数据层(Data Layer) 职责:存储游戏状态数据,提供数据访问接口 实现: 数据载体: GameUtil 中的静态变量: static double money; // 剩余金额 static int count; // 剩余红包数 static LinkedList participants; // 全部参与者 static Map winnerAmounts; // 中奖金额记录 数据操作: 初始化:GameUtil.initParticipants(num) 生成参与者列表 动态更新:抢红包线程中修改 money、count、winnerAmounts 二、关键技术点 1. UI 与逻辑解耦(MVC 体现) 模型(Model):GameUtil 存储状态数据(独立于界面) 视图(View):RedPacketGame 负责界面渲染(statusLabel、logArea) 控制器(Controller):事件监听器(ActionListener)处理用户操作(如 “开始抢红包” 按钮触发线程启动) 2. 多线程处理 每个抢红包操作在独立线程(GrabRedPacketThread)中执行,通过同步块保证线程安全: class GrabRedPacketThread implements Runnable { @Override public void run() { synchronized (GrabRedPacketThread.class) { // 操作 GameUtil 共享数据(money/count) } } } 3. 富文本界面实现 使用 HTML 标签在 JLabel 中实现复杂样式: statusLabel.setText("
...""); 支持居中、加粗、颜色(color:#FFD700)、字体大小(font-size:30px)等效果 三、架构优缺点 1. 优点 清晰的模块化:UI、逻辑、数据分层,便于维护和扩展(如新增红包类型只需修改 GameUtil 算法) 线程安全保障:通过同步块避免多线程数据竞争,确保红包分配原子性 灵活的界面配置:HTML 标签实现动态样式调整,无需修改组件逻辑 2. 缺点 静态变量依赖:GameUtil 使用静态变量存储数据,可能导致全局状态污染(可通过单例模式优化) 策略模式缺失:红包分配算法硬编码在 GrabRedPacketThread 中,新增分配策略需修改核心代码 Swing 单线程限制:UI 更新必须通过 invokeLater(),复杂交互可能导致响应延迟 四、架构优化方向 引入策略模式:抽象红包分配接口 RedPacketStrategy,实现类(随机分配、平均分配)封装不同算法,提升扩展性。 数据持久化:添加 GameRecord 类,通过文件 / 数据库存储历史记录,配合 GameUtil 提供数据查询接口。 MVC 严格化:分离控制器逻辑到独立类(如 GameController),避免事件监听与视图耦合。 该架构适用于轻量级桌面应用,通过分层设计和简单多线程处理,在保证核心功能的同时具备一定可维护性,适合作为学习 Swing 开发、多线程编程和基础架构设计的入门案例。