# JAVA飞机大战 **Repository Path**: liao-ruihao/java-airplane-wars ## Basic Information - **Project Name**: JAVA飞机大战 - **Description**: 基于腾讯开源小游戏飞机大战的改版 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-11-22 - **Last Updated**: 2025-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, 小游戏, 飞机大战 ## README # JAVA飞机大战 #### 介绍 基于腾讯开源小游戏飞机大战的改版 #### 软件架构 1. src(源代码文件夹): src文件夹是存放所有源代码的地方。 2. bin(二进制文件夹): bin文件夹用于存放编译后的字节码文件,即.class文件。 - myAudio 播放音乐 - AudioPlayer - Text - 若干音乐文件 - TestShootgameDemo - 一些Java源代码文件,这些文件是游戏的主要逻辑和对象定义。 - Airplane.java:定义了敌机的行为和属性。 - Bullet.java:定义了子弹的行为和属性。 - Hero.java:定义了英雄飞机的行为和属性。 - ShootGame.java:是游戏的入口点和主要游戏逻辑。 - FlyingObject.java:是一个基类,为所有飞行对象提供通用功能。 - Servant.java: 从机类,主角机的小伙伴。 - Bee.java: 小蜜蜂,没有使用到的奖励机制。 - Sky.java: 天空。 - Enemy.java: 敌人基类。 - Award.java: 奖励。 #### 安装教程 1. git clone 2. 打开TestShootgameDemo下面的ShootGame.java,运行即可得到游戏画面 #### 游戏新内容 1. 流动的开机画面,背景有不断经过的敌人 2. 更多的敌人类型——3种 3. 更多奖励——加多生命、三倍子弹、延缓敌人进攻、从机发射子弹、随机奖励 4. 随机出现并流动的不同种的云 5. 主角机的小伙伴——从机 6. 随时间进行敌人越来越多——10s敌人发起一次大进攻 7. 作弊系统——按P开启 8. 更大图标 9. 更好看的UI 10. 击落反馈——用弹幕表现获得的分数及奖励 11. 音乐 #### 游戏逻辑 1. 游戏状态 - 启动状态(START): 游戏初始化,显示启动界面。玩家可以通过点击屏幕开始游戏。 - 运行状态(RUNNING): 游戏正在进行中,玩家可以控制英雄机移动和射击。随着游戏的进行,敌人入场速度会逐渐加快,难度逐渐增加。 - 暂停状态(PAUSE): 游戏暂停,玩家可以继续游戏或重新开始。暂停状态下,英雄机和从机停止移动和射击。 - 结束状态(GAME_OVER): 游戏结束,显示游戏结束界面。如果英雄机的生命值为零,游戏将进入结束状态。玩家可以通过重新开始游戏继续游戏。 2. 游戏实体 - 英雄机(Hero): 玩家的飞机,可以移动和射击。英雄机具有生命值,当生命值为零时,游戏结束。 - 从机(Servant): 辅助英雄机的飞机,也可以射击。从机可以帮助玩家清理一些敌人,但不会增加英雄机的生命值。 - 敌人(Enemy): 游戏中的敌方飞机,包括小敌机、大敌机和蜜蜂。敌人具有生命值,当生命值为零时,敌人死亡。 - 云(Cloud): 游戏中出现的云彩。云彩不会对英雄机造成伤害,但可以遮挡视线。 - 子弹(Bullet): 英雄机和从机发射的子弹。子弹可以对敌人造成伤害。 3. 核心逻辑 - 敌人入场: 随着游戏进行,敌人会不断入场,速度逐渐加快。敌人入场时,英雄机和从机需要及时发现并射击敌人。 - 云入场: 每隔一段时间,会生成新的云彩。云彩可以遮挡视线,玩家需要小心不要被云彩遮挡。 - 子弹入场: 每隔一段时间,英雄机和从机会发射子弹。子弹可以对敌人造成伤害。 - 飞行物移动: 所有飞行物(英雄机、从机、敌人、云、子弹)都会在每一帧进行移动。英雄机和从机需要及时调整位置,以避免被敌人击中。 - 越界处理: 移除所有越界的飞行物。当敌人或云彩越界时,游戏会自动移除它们。 - 碰撞检测: 检测子弹与敌人、英雄机与敌人的碰撞。当子弹击中敌人或英雄机击中敌人时,敌人会受到伤害。 - 游戏结束检测: 检测英雄机的生命值是否为零,如果是,则游戏结束。当英雄机的生命值为零时,游戏会进入结束状态,显示游戏结束界面。 4. 事件监听和处理 - 鼠标事件: 控制英雄机的移动。玩家可以通过移动鼠标来控制英雄机的移动。 - 键盘事件: 控制游戏状态的切换和英雄机的特殊能力。玩家可以通过按下键盘上的按钮来切换游戏状态(开始、暂停、结束),或者使用特殊能力(如双倍火力、增加生命值等)。 5. 绘制图形 - 重写了 JPanel 的 paint() 方法,用于绘制游戏中的所有图形。游戏中的所有图形(如英雄机、从机、敌人、云、子弹等)都会在 paint() 方法中绘制出来。 6. 主方法 - 创建了一个 JFrame 实例,并设置了一些基本属性。 - 创建了一个 ShootGame 实例,并将其添加到 JFrame 中。 - 设置 JFrame 的可见性和关闭操作。 - 启动了游戏的音乐。 这个类实现了射击游戏的整个逻辑,包括敌人的生成、移动、子弹的发射和碰撞检测等。游戏的状态可以通过键盘事件进行切换,例如,按下空格键开始游戏,按下 Esc 键暂停游戏。玩家需要控制英雄机移动和射击,以清除所有敌人并获得高分。当英雄机的生命值为零时,游戏结束。 #### 核心算法 1. 敌人入场算法 - 核心算法: enterAction() 方法负责敌人入场。它会检查一个计数器 enterIndex,当 enterIndex 达到预定值时,生成一个新的敌人并将其添加到敌人数组中。敌人的入场速度会随着游戏进程而增加。 - 随机生成敌人: nextOne() 方法用于随机生成敌人。它使用一个 Random 对象来生成一个随机数,然后根据这个数来决定生成哪种敌人(蜜蜂、小敌机、大敌机)。 2. 云入场算法 - 核心算法: cloudEnterAction() 方法负责云入场。它会检查一个计数器 cloudIndex,当 cloudIndex 达到预定值时,生成一个新的云并将其添加到云数组中。 - 随机生成云: nextCloud() 方法用于随机生成云。它使用一个 Random 对象来生成一个随机数,然后根据这个数来决定生成哪种云。 3. 子弹入场算法 - 核心算法: shootAction() 方法负责子弹入场。它会检查一个计数器 shootIndex,当 shootIndex 达到预定值时,英雄机和从机分别发射子弹,并将子弹添加到子弹数组中。 4. 飞行物移动算法 - 核心算法: stepAction() 方法负责飞行物的移动。它会遍历所有的飞行物(英雄机、从机、敌人、云、子弹),并调用它们的 step() 方法来移动它们。 5. 越界处理算法 - 核心算法: outOfBoundsAction() 方法负责越界处理。它会遍历所有的飞行物,并移除所有越界的飞行物。 6. 碰撞检测算法 - 核心算法: BulletBangAction() 方法负责子弹与敌人的碰撞检测。它会遍历所有的子弹,并检查它们是否击中了敌人。如果击中,则会减少敌人的生命值,并处理碰撞后的逻辑(如加分、奖励等)。 7. 英雄机与敌人碰撞检测算法 - 核心算法: heroBangAction() 方法负责英雄机与敌人的碰撞检测。它会遍历所有的敌人,并检查它们是否与英雄机发生了碰撞。如果发生碰撞,则会减少英雄机的生命值,并处理碰撞后的逻辑(如清除双倍火力等)。 8. 游戏结束检测算法 - 核心算法: checkGameOverAction() 方法负责游戏结束检测。它会检查英雄机的生命值是否为零。如果为零,则游戏结束。 9. 事件监听和处理算法 - 核心算法: action() 方法负责处理鼠标和键盘事件。它会根据不同的状态(启动、运行、暂停、结束)来处理这些事件。 10. 绘制图形算法 - 核心算法: paint() 方法负责绘制图形。它会根据当前状态来绘制相应的图形。 #### 游戏展示 1. 视频演示 ![视频演示](./fig/video.gif) #### 参与贡献 1. 腾讯开源代码 2. @liujiacheng 最先把腾讯代码转成Java代码 3. 本人@liao-ruihao 添加了大量新内容 4. 一些网络音乐(牛尾宪铺)