【附源码】java17实现飞机大战游戏

79 阅读7分钟

hello大家好,用java实现小游戏真的很锻炼编程技术,而且很有成就感。比起做增删改查的管理系统来说,简直是不同的两个阶层的程序员。

今天我就教大家用JDK17原生库来实现一个简单的飞机大战,初始编程的你,只要用心就能学会。会大大加深你对面向对象的理解!

 

视频演示

www.bilibili.com/video/BV149…

 

视频里面游戏本来是是实现了音效的,时录制时忘记开了扬声器设置,导致电脑播放的声音没有录进去,只录进去了人声!!!

图片演示

 

 

 

 

技术栈描述

项目框架

  • Java SE 17 - 主要编程语言
  • Swing - GUI框架(JFrame、JPanel、Timer等)
  • Java 2D API - 图形渲染(Graphics2D、BufferedImage)
  • Java Sound API - 音效处理(Clip、AudioSystem)
  • Maven - 项目构建管理

关键技术特性

  • 双缓冲渲染 - 消除画面闪烁
  • 60 FPS游戏循环 - 流畅的游戏体验
  • 资源缓存机制 - 图片和音效缓存
  • 多线程音频 - 并发音效播放

设计模式

1. 单例模式 (Singleton)

  • GameManager - 游戏核心管理器
  • ImageLoader - 图片资源管理
  • SoundManager - 音效管理

2. 工厂模式 (Factory)

  • Enemy.createEnemy() - 敌机创建
  • PowerUp.createRandomPowerUp() - 道具生成
  • Bullet.createPlayerBullet() - 子弹创建

3. 策略模式 (Strategy)

  • 敌机移动模式(直线、之字形、正弦波、圆形)
  • 不同类型子弹的行为策略

4. 状态模式 (State)

  • GameState 枚举管理游戏状态
  • 菜单、游戏中、暂停、结束等状态切换

5. 模板方法模式 (Template Method)

  • GameObject 抽象基类定义通用行为
  • 子类实现具体的 update() 和 draw() 方法

6. 享元模式 (Flyweight)

  • 图片和音效资源缓存
  • 减少内存占用,提高性能

 

完整游戏源码,我已经整理清楚,移步:

 gitcode.com/hadluo2/jav…

 

 

游戏实现的功能

玩家控制系统

  • WASD键位控制 :W(上)、S(下)、A(左)、D(右)移动
  • 空格键射击 :连续射击功能
  • P键暂停 :游戏暂停/继续切换

生命与血量系统

  • 多生命机制 :玩家拥有3条生命
  • 血量系统 :每条生命有10点血量
  • 无敌时间 :受击后2秒无敌保护
  • 血条显示 :实时显示当前血量状态

武器系统

  • 基础射击 :200毫秒射击间隔
  • 武器升级 :通过道具提升武器等级
  • 子弹类型 :普通子弹和强化子弹,伤害和外观不同

敌机系统

  • 三种敌机类型 :
  • 小型敌机:血量1,速度快,分数10
  • 中型敌机:血量3,中等速度,分数30,可射击
  • 大型敌机:血量5,速度慢,分数50,可射击
  • 爆炸动画 :每种敌机都有专属的爆炸动画序列

道具类型

  1. 生命恢复 :瞬间恢复1点血量
  2. 护盾 :10秒无敌保护
  3. 武器升级 :15秒武器等级提升

分数与统计

  • 实时分数显示 :击败敌机获得分数
  • 高分记录 :自动保存和加载历史最高分
  • 击杀统计 :记录消灭的敌机数量
  • 游戏时间 :显示当前游戏进行时间
  • 关卡系统 :随时间推进增加游戏难度

 

 

游戏实现原理

本小结将讲解游戏中各大类的具体功能,每个类都是实现游戏不可或缺的部分,他们紧密相连来实现一个完整的游戏系统。

 

程序入口与初始化-Main.java

Main.java 是游戏的主入口类:

  • 负责系统环境检查和初始化
  • 创建必要的资源目录
  • 初始化核心管理器(ImageLoader、SoundManager、GameManager)
  • 启动游戏主窗口

复制代码

public static void main(String[] args) {
        try {
            // 设置系统属性
            setupSystemProperties();
            
            // 检查系统要求
            checkSystemRequirements();
            
            // 创建资源目录
            createResourceDirectories();
            
            // 初始化游戏组件
            initializeGameComponents();
            
            // 启动游戏界面
            SwingUtilities.invokeLater(() -> {
                try {
                    startGame();
                } catch (Exception e) {
                    handleStartupError(e);
                }
            });
            
        } catch (Exception e) {
            handleStartupError(e);
        }
    }

复制代码

 

初始化游戏组件是非常重要的, 游戏的图片加载,音效播放,游戏循环都是在这里初始化的。

复制代码

/**
     * 初始化游戏组件
     */
    private static void initializeGameComponents() {
        System.out.println("初始化游戏组件...");
        
        try {
            // 初始化图片加载器
            ImageLoader imageLoader = ImageLoader.getInstance();
            System.out.println("图片加载器初始化完成");
            

            // 初始化音效管理器
            SoundManager soundManager = SoundManager.getInstance();
            System.out.println("音效管理器初始化完成");
            
            // 初始化游戏管理器
            GameManager gameManager = GameManager.getInstance();
            System.out.println("游戏管理器初始化完成");
            
            System.out.println("所有游戏组件初始化完成");
            
        } catch (Exception e) {
            System.err.println("初始化游戏组件时出错: " + e.getMessage());
            throw new RuntimeException("游戏组件初始化失败", e);
        }
    }

复制代码

 

窗口与界面管理-GameFrame.java

GameFrame.java 继承自JFrame,管理游戏主窗口:

  • 设置窗口属性(标题、大小、居中等)

  • 创建菜单栏(游戏、设置、帮助菜单)

  • 集成游戏面板(GamePanel)

  • 处理窗口事件和键盘输入
    GamePanel.java 继承自JPanel,是游戏的核心显示组件:

  • 实现60 FPS的游戏循环(使用Timer)

  • 双缓冲渲染技术,提供流畅的画面

  • 根据游戏状态渲染不同场景(菜单、游戏、暂停、结束等)

  • 集成调试信息显示

 

 

游戏逻辑管理-GameManager.java

GameManager.java 采用单例模式,是游戏的核心控制器:

  • 游戏状态管理 :控制菜单、游戏中、暂停、结束等状态转换
  • 对象生命周期管理 :管理玩家、敌机、子弹、道具、爆炸等游戏对象
  • 游戏逻辑更新 :处理移动、碰撞检测、生成控制、关卡进度
  • 数据统计 :分数、高分、击杀数、游戏时间等
  • 输入处理 :键盘事件响应和玩家控制
  • 渲染协调 :调用各对象的绘制方法

 

资源管理系统-ImageLoader.java

ImageLoader.java 单例模式的图片资源管理器:

  • 智能加载 :支持从资源文件和文件系统加载图片

  • 缓存机制 :避免重复加载,提高性能

  • 默认图片生成 :当资源缺失时自动生成默认图片

  • 图片处理 :提供缩放、旋转、翻转等功能
    SoundManager.java 单例模式的音效管理器:

  • 音效播放 :支持音效和背景音乐播放

  • 音量控制 :独立的音效和音乐音量控制

  • 并发播放 :支持多个音效同时播放

  • 资源管理 :音效缓存和预加载机制

基础游戏对象-GameObject.java

GameObject.java 抽象基类,定义所有游戏实体的通用属性和行为:

  • 基础属性 :位置、尺寸、速度、生存状态、可见性
  • 抽象方法 :update()和draw(),强制子类实现
  • 通用功能 :碰撞检测、移动、边界检查、销毁等

玩家系统-Player.java

Player.java 继承自GameObject:

  • 生命系统 :血量、生命数、无敌状态管理
  • 移动控制 :响应键盘输入,支持对角线移动速度调整
  • 武器系统 :射击控制、武器等级、多重射击
  • 特殊状态 :护盾、无敌闪烁效果
  • 视觉效果 :受击状态显示、状态指示

敌机系统-Enemy.java

Enemy.java 继承自GameObject:

  • 敌机类型 :小型、中型、大型敌机,各有不同属性
  • 移动模式 :直线、之字形、正弦波、圆形等多种移动模式
  • 战斗系统 :血量、射击能力、受击效果
  • 爆炸动画 :完整的爆炸动画序列
  • AI行为 :自动射击、移动模式切换

子弹系统-Bullet.java

Bullet.java 继承自GameObject:

  • 子弹类型 :玩家子弹(普通、强化)和敌机子弹(普通、快速)
  • 视觉效果 :轨迹效果、粒子效果
  • 伤害系统 :不同类型子弹造成不同伤害
  • 碰撞处理 :精确的碰撞检测和响应

道具系统-PowerUp.java

PowerUp.java 继承自GameObject:

  • 道具类型 :生命恢复、护盾、武器升级、速度提升、多重射击、分数加成、无敌、快速射击
  • 稀有度系统 :不同道具有不同的稀有度和出现概率
  • 视觉效果 :旋转动画、脉冲效果、光环、闪烁警告
  • 磁性效果 :稀有道具具有吸引玩家的磁性
  • 持续时间 :不同道具有不同的效果持续时间

配置与工具系统

常量配置-Constants.java

Constants.java 集中管理游戏配置:

  • 窗口设置 :尺寸、标题、FPS等
  • 游戏对象属性 :各类实体的尺寸、速度、血量、分数等
  • 资源路径 :图片和音效文件路径
  • 游戏平衡 :生成间隔、掉落概率、持续时间等
  • 控制键位 :键盘映射定义

游戏状态管理-GameState.java

GameState.java 枚举类定义游戏状态:

  • 状态定义 :菜单、游戏中、暂停、结束、设置、关于、加载、退出
  • 状态查询 :提供便捷的状态检查方法
  • 状态转换 :支持状态间的逻辑转换

 

 

游戏启动

将源码导入到idea中,这个项目就是一个普通的maven管理的项目, 导入前,请设置好maven的仓库配置。

 

设置好JDK的环境为17

 

等待编译好,启动Main就可以了。游戏图片,声音素材资源在resource目录下面。