ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

python-mini-projects 太空射击小游戏:基于 Pygame 的 Space Bullet Shooter 实现与源码解析

python-mini-projects 太空射击小游戏:基于 Pygame 的 Space Bullet Shooter 实现与源码解析 示例工程【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址https://gitcode.com/gh_mirrors/py/python-mini-projects点击查看免费下载本文以 python-mini-projects 仓库中的 Space Bullet Shooter 小游戏为对象从 readme.md 的操作说明出发结合 space_bullet_shooter.py 完整源码讲解这款基于 Pygame 的 2D 射击游戏的环境搭建、玩法操作、核心机制玩家移动、敌人 AI、子弹发射、碰撞检测、计分与结束流程以及各游戏资源的用途。读完本文你既能直接运行这款小游戏也能理解其背后约 300 行的经典游戏循环实现并具备在此基础上扩展游戏功能的思路。一、项目概览一个简约但完整的 Pygame 射击小游戏Space Bullet Shooter 是 python-mini-projects 仓库中收录的一款使用Pygame编写的 2D 太空射击小游戏完整目录位于 projects/Space_bullet_shooter_game。该目录同时包含游戏主程序、运行截图与全部音效/图片素材是一个不依赖网络、开箱即玩的迷你项目。从 readme.md 的说明可知其设计定位是面向电脑PC键盘操作的简单游戏使用**方向键Arrows**控制飞船上下左右移动按Enter发射子弹。说明readme 中标注射击键为 Enter但查看 space_bullet_shooter.py 的实际事件监听代码源码监听的是pygame.K_SPACE空格键因此实际生效的射击键是空格键本文后续以源码实现为准。游戏运行后的效果可参考官方截图位于 spacegame.png画面为深紫色星空背景包含玩家飞船、6 个橙色幽灵状敌人、左上角计分板底部显示作者版权信息。二、运行环境与启动方式2.1 依赖安装游戏唯一的外部依赖是Pygame。主程序在 space_bullet_shooter.py 中通过以下方式导入import pygame import random import math import time from pygame import mixer其中random、math、time均为 Python 标准库无需额外安装pygame及pygame.mixer负责背景音乐与音效播放需要单独安装pip install pygame兼容性提示本游戏源码编写于 2020 年源码头部注明Date : 6/09/2020基于 Pygame 的传统 API如pygame.image.load、pygame.mixer.music。在新版 Pygame 下可正常运行但该目录未提供独立的 requirements.txt仓库根目录的 requirementsALL.txt 中也未列出 pygame因此运行时请自行安装对应平台的 pygame 版本。若在 macOS/Linux 上遇到音频驱动问题可先尝试更新 pygame 或安装系统音频依赖。2.2 启动游戏确保所有素材文件与主程序位于同一目录即 projects/Space_bullet_shooter_game 内然后在终端执行python space_bullet_shooter.py启动后程序会依次完成加载背景音乐并循环播放、创建 800×600 的游戏窗口、设置窗口标题与图标、加载背景与飞船贴图、生成敌人队列最后进入游戏主循环。关闭窗口点击右上角关闭按钮即可退出游戏。2.3 所需素材清单游戏启动依赖同目录下的图片与音频资源缺少任一文件都会在加载时报错。资源清单如下文件类型用途img2.png图片800×600 星空背景铺满整个游戏窗口icond.png图片窗口图标通过pygame.display.set_icon设置pl4.png图片玩家飞船贴图初始位于窗口底部中央ens.png图片敌人贴图6 个敌人共用同一张图bullet.png图片子弹贴图bg.wav音频背景音乐mixer.music.play(-1)无限循环播放bulletout.wav音频发射子弹时的音效bulletshoot.wav音频子弹命中敌人时的音效sample.mp3音频附加音频素材主程序未引用从资源清单可以看出本项目刻意把图片、音效与代码分离存放是 Pygame 小型项目的典型组织方式。三、玩法与操作三个按键驱动的完整游戏循环按照 readme.md 的说明游戏只使用键盘即可完成全部操作按键功能← / →左右方向键控制飞船左右移动每次按键将水平速度设为 ±5 像素/帧↑ / ↓上下方向键readme 声称支持上下移动但源码中未监听K_UP/K_DOWN实际仅左右移动有效详见下文源码分析空格readme 标注为 Enter发射子弹每次只能有一发子弹在飞行途中经典单发模式3.1 移动机制的源码实现在游戏主循环的事件处理段space_bullet_shooter.py中KEYDOWN事件把playerx_change设置为 ±5KEYUP事件将其归零实现按住移动、松开停止if event.type pygame.KEYDOWN: if event.key pygame.K_LEFT: playerx_change -5 if event.key pygame.K_RIGHT: playerx_change 5 if event.key pygame.K_SPACE: if bullet_state ready: bulletX playerx bulletsound mixer.Sound(bulletout.wav) bulletsound.play() fire_bullet(bulletX, bulletY) if event.type pygame.KEYUP: if event.key pygame.K_LEFT or event.key pygame.K_LEFT: playerx_change 0循环末尾第 279-284 行将位移累加到坐标上并对窗口边界做钳制防止飞船飞出画面playerx playerx_change if playerx 0: playerx 0 elif playerx 730: playerx 730需要指出两点与 readme 的出入其一readme 说支持up and down移动但源码只处理了K_LEFT/K_RIGHTplayery在初始化后不再变化飞船实际只能在水平方向移动其二readme 的射击键描述为 Enter源码实际为K_SPACE。这两处均为源码事实读者以运行实际效果为准。3.2 射击机制的源码实现射击采用经典的单发子弹 ready/fire 状态机设计。全局变量bullet_state只有两个状态ready子弹就绪可以发射。按下空格时把子弹初始 x 坐标对准飞船位置播放音效并调用fire_bullet将状态切换为firefire子弹已在飞行途中此时再次按空格不会重复发射因为bullet_state ready判断不通过。飞行逻辑位于主循环尾部第 294-299 行子弹每帧向上移动bulletY_change 20像素一旦bulletY 0飞出屏幕顶部子弹重置回bulletY 480并恢复ready状态等待下一次发射if bulletY 0: bulletY 480 bullet_state ready if bullet_state fire: fire_bullet(bulletX, bulletY) bulletY - bulletY_changefire_bullet函数第 101-104 行在(x53, y10)处绘制子弹贴图53的偏移用于让子弹从飞船中央射出def fire_bullet(x, y): global bullet_state bullet_state fire screen.blit(bulletimg, (x 53, y 10))四、游戏核心机制逐层拆解4.1 玩家与窗口初始化程序启动阶段第 21-50 行完成了一系列初始化初始化 pygame、创建时钟、加载并循环播放背景音乐、创建 800×600 窗口、设置标题 Space Bullet Shooter 与窗口图标、加载背景图与飞船贴图并将飞船初始坐标定为(370, 460)窗口底部中央偏左。4.2 敌人系统6 个随机出生、来回巡逻的敌人敌人使用四个平行列表管理第 68-83 行enemyimg贴图、enemyX/enemyY坐标、enemyX_change/enemyY_change速度共 6 个敌人number_of_enemy 6 for i in range(number_of_enemy): enemyimg.append(pygame.image.load(ens.png)) enemyX.append(random.randint(0, 736)) enemyY.append(random.randint(50, 150)) enemyX_change.append(4) enemyY_change.append(30)敌人的运动规则第 210-217 行为水平方向每帧移动 4 像素碰到左右边界x≤0 或 x≥736时水平速度反向同时enemyY下移 30 像素形成左右巡逻、逐行下压的经典太空侵略者式 AIenemyX[i] enemyX_change[i] if enemyX[i] 0: enemyX_change[i] 4 enemyY[i] enemyY_change[i] elif enemyX[i] 736: enemyX_change[i] -4 enemyY[i] enemyY_change[i]4.3 碰撞检测基于欧几里得距离的命中判定is_collision函数第 109-116 行使用两点间距离公式判断子弹与敌人是否相撞当距离小于阈值 27 像素时判定命中def is_collision(enemyX, enemyY, playerx, playery): distance math.sqrt((math.pow(enemyX - bulletX, 2)) (math.pow(enemyY - bulletY, 2))) if distance 27: return True else: return False命中后的处理第 222-234 行播放命中音效bulletshoot.wav、将子弹重置到bulletY 480并恢复ready、score_value加 1随后把被击中的敌人随机重生到顶部区域(0~736, 50~150)继续参与游戏collision is_collision(enemyX[i], enemyY[i], bulletX, bulletY) if collision: bulletsound mixer.Sound(bulletshoot.wav) bulletsound.play() bulletY 480 bullet_state ready score_value 1 enemyX[i] random.randint(0, 736) enemyY[i] random.randint(50, 150)值得注意的是is_collision函数签名接收了 4 个参数但函数体实际只用enemyX、enemyY与全局bulletX、bulletY计算playerx、playery未被使用——这是源码中一个可以简化的冗余参数设计。4.4 计分与游戏结束流程计分系统通过全局变量score_value累积showscore函数第 125-127 行使用freesansbold.ttfPygame 内置字体在左上角 (10, 10) 渲染白色文字Score : n。游戏结束条件为任一敌人的enemyY超过 440逼近飞船所在高度。触发时第 194-203 行将所有敌人坐标移到 y2000移出屏幕显示蓝色 GAME OVER 大字time.sleep(2)暂停 2 秒后显示绿色最终得分并跳出敌人更新循环if enemyY[i] 440: for j in range(number_of_enemy): enemyY[j] 2000 game_over() time.sleep(2) final_score() break之后主循环仍会继续运行游戏画面定格在 GAME OVER 与 Total Score : n 上玩家只能关闭窗口退出没有重新开始逻辑——这是源码层面可以扩展的方向之一。五、主循环结构Pygame 游戏的标准骨架整个游戏围绕一个while running:主循环第 157-311 行运转每帧依次执行清屏与绘制背景screen.fill((0,0,0))填充黑色再screen.blit(bg,(0,0))绘制星空背景事件处理遍历pygame.event.get()处理退出事件、按键按下/松开事件更新敌人逐敌人执行巡逻移动、越界下压、碰撞检测与重生更新玩家累加水平位移并做边界钳制更新子弹上移子弹、处理飞出屏幕后的重置绘制全部对象依次blit玩家、计分板、作者版权文字刷新画面pygame.display.update()将绘制结果提交到窗口。这七步构成了 Pygame 游戏开发的标准帧循环骨架理解它可以迁移到任何 2D Pygame 项目中。六、从源码出发的扩展建议在保留现有代码结构的前提下可以低成本地为这款小游戏加入以下能力修复 readme 与实现不一致的操作在KEYDOWN中补上K_UP/K_DOWN对playery_change的处理并同步更新飞船纵向边界钳制让 readme 声称的上下左右移动真正生效加入重新开始将主循环封装为函数在 GAME OVER 后监听按键如K_RETURN重置敌人、分数与子弹状态敌人开火与生命系统为敌人增加向下发射的子弹为玩家引入lives计数难度递增命中一定数量敌人后提高enemyX_change速度或增加number_of_enemy优化单发限制把bullet_state状态机扩展为子弹列表实现连发音量与暂停控制利用mixer.music.set_volume与事件循环中的暂停标志完善游戏体验。七、小结Space Bullet Shooter 虽然代码量不足 300 行却完整覆盖了 Pygame 2D 游戏的全部基础要素窗口与素材加载、键盘事件驱动、精灵绘制、距离碰撞检测、计分渲染、音效播放与游戏结束流程是理解 Pygame 游戏循环与经典太空侵略者式玩法的绝佳迷你示例。本文所有结论均来自 projects/Space_bullet_shooter_game 目录下的 readme.md 与 space_bullet_shooter.py 源码读者可直接对照源码逐行验证如需进一步学习该仓库中的其他游戏实现可参考同仓库的 Tic_tac_toe、RockPaperScissors_Game、Number_guessing_game 等项目的文档与源码。赞分享示例工程【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址https://gitcode.com/gh_mirrors/py/python-mini-projects点击查看免费下载相关推荐探索太空的像素射击游戏Space Shooter探索太空的像素射击游戏Space Shooter 如果你是游戏爱好者或者对编程和游戏开发有浓厚的兴趣那么这个开源项目【Space Shooter】值得你一Space Shooter跨平台C语言太空射击游戏开发实战Space Shooter跨平台C语言太空射击游戏开发实战 Space Shooter是一款采用纯C语言开发的跨平台2D太空射击游戏仅依赖平台原生库实现图形用 Flame 引擎从零构建太空射击游戏六步实战教程Space Shooter Tutorial用 Flame 引擎从零构建太空射击游戏六步实战教程Space Shooter Tutorial 本教程以 Flame 游戏引擎一个基于 Flutter游戏开发图形学创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表