用 Python 与 Pygame 从零构建 Space Rocks 小行星游戏:源码解析与实战指南
示例工程教程【免费下载链接】materialsBonus materials, exercises, and example projects for our Python tutorials项目地址https://gitcode.com/gh_mirrors/ma/materials点击查看免费下载导读本文以 asterioids-pygame-project/source_code_final/README.md 中描述的 Space Rocks 项目为主线结合仓库内从第 1 步到第 10 步的完整渐进式源码讲解如何用 Python 3 与 Pygame 2.0 实现一款可运行的小行星射击游戏。读完本文你将掌握 Pygame 游戏循环、精灵渲染、碰撞检测、边界环绕、键盘输入与音效播放的完整实现方案并能直接运行、修改与扩展这套源码。图Space Rocks 使用的 800×600 宇宙背景贴图source_code_final/assets/sprites/space.png作为游戏窗口的背景层在每一帧绘制时被铺满整个屏幕。项目概览一个麻雀虽小五脏俱全的 Pygame 游戏Space Rocks太空岩石是使用Python 3与Pygame编写的一款简单太空射击游戏玩家操控一艘飞船在宇宙中飞行用激光击碎随机出现的小行星小行星被击中后会分裂成更小的个体清空所有小行星即获胜飞船被撞到则游戏失败。仓库中该项目位于asterioids-pygame-project/目录下结构非常清晰README.md 说明了这是 Pygame 小行星游戏教程的配套代码共包含10 个分步源码目录source_code_step_1至source_code_step_10加一个最终完整版source_code_final每个步骤对应教程中的一个开发阶段每步目录都包含space_rocks/包与requirements.txt依赖清单随着步骤推进assets/目录逐步加入飞船、小行星、子弹精灵与激光音效。最终版代码source_code_final采用四个 Python 模块构成一个规范的包职责划分明确文件职责space_rocks/main.py包入口创建SpaceRocks实例并启动主循环space_rocks/game.py游戏主类初始化、事件处理、游戏逻辑、绘制space_rocks/models.py游戏对象模型GameObject、Spaceship、Asteroid、Bulletspace_rocks/utils.py工具函数加载精灵/音效、边界环绕、随机位置与速度、文本渲染环境准备与运行方式根据项目文档运行本游戏需要Python 3。依赖仅有一个 Pygame且锁定在 2.0.0 版本见 requirements.txtpygame2.0.0安装与启动命令如下在source_code_final目录下执行pip install -r requirements.txt python space_rockspython space_rocks之所以可以直接运行是因为space_rocks/__main__.py提供了包级入口它从game模块导入SpaceRocks类在if __name__ __main__:保护下实例化并调用主循环from game import SpaceRocks if __name__ __main__: space_rocks SpaceRocks() space_rocks.main_loop()运行后弹出的窗口标题为Space Rocks分辨率为800×600。操作方式与键位如下按键功能←/→逆时针 / 顺时针旋转飞船↑沿当前方向加速推进空格发射激光Esc或关闭窗口退出游戏游戏主循环Pygame 应用的骨架所有版本的game.py都遵循同一个经典 Pygame 主循环模式这是理解整个项目的基础。以 最终版 game.py 为例def main_loop(self): while True: self._handle_input() self._process_game_logic() self._draw()每一帧按顺序执行三步处理输入 → 更新游戏逻辑 → 绘制画面。其中_draw()在渲染完成后调用pygame.display.flip()将缓冲区内容呈现到屏幕并用self.clock.tick(60)将帧率锁定在 60 FPS见 game.pydef _draw(self): self.screen.blit(self.background, (0, 0)) for game_object in self._get_game_objects(): game_object.draw(self.screen) if self.message: print_text(self.screen, self.message, self.font) pygame.display.flip() self.clock.tick(60)从源码结构可以看到SpaceRocks.__init__完成了以下初始化工作game.py调用pygame.init()并设置窗口标题通过pygame.display.set_mode((800, 600))创建 800×600 的游戏窗口用load_sprite(space, False)加载宇宙背景第二个参数False表示不需要 alpha 通道纯色背景直接convert()即可提升绘制性能创建pygame.time.Clock()用于控制帧率创建字号为 64 的默认字体pygame.font.Font(None, 64)用于显示胜负消息初始化小行星列表self.asteroids、子弹列表self.bullets并在屏幕中央(400, 300)生成飞船。资源加载与工具函数utils.py 的四个核心能力utils.py 封装了游戏所需的底层工具共四个函数1. 精灵加载load_sprite(name, with_alphaTrue)按assets/sprites/{name}.png路径加载图片with_alpha为True时调用convert_alpha()保留透明通道适用于飞船、小行星、子弹为False时调用convert()去掉透明通道适用于整幅背景。2. 音效加载load_sound(name)按assets/sounds/{name}.wav路径加载并返回pygame.mixer.Sound对象。3. 边界环绕wrap_position(position, surface)这是小行星飞出屏幕又从另一侧回来的关键实现def wrap_position(position, surface): x, y position w, h surface.get_size() return Vector2(x % w, y % h)对坐标分别对窗口宽高取模物体移出屏幕一侧后自然从对侧重新出现。4. 随机生成get_random_position与get_random_velocity(min_speed, max_speed)前者返回窗口范围内的随机坐标后者生成速度大小在[min_speed, max_speed]区间、方向随机0°~359°的速度向量——实现方式是先构造一个指向 0° 的速度向量Vector2(speed, 0)再旋转随机角度def get_random_velocity(min_speed, max_speed): speed random.randint(min_speed, max_speed) angle random.randrange(0, 360) return Vector2(speed, 0).rotate(angle)此外utils.py 中的print_text(surface, text, font, colorColor(tomato))负责把游戏结束消息渲染到屏幕正中央默认使用番茄红色。游戏对象模型models.py 的继承体系与向量物理models.py 是整个游戏的核心抽象层定义了四个类并利用pygame.math.Vector2完成全部运动计算。模块顶部定义了向上的基准向量UP Vector2(0, -1)GameObject一切游戏对象的基类GameObject是所有对象的公共基类models.pyposition / velocity使用Vector2存储位置与速度便于向量运算radius碰撞半径取精灵宽度的一半sprite.get_width() / 2draw()把精灵绘制到position - Vector2(radius)处即让精灵中心对齐对象位置move()self.position wrap_position(self.position self.velocity, surface)即按速度更新位置并做边界环绕collides_with(other_obj)基于圆心距离的圆形碰撞检测两对象中心距离小于半径之和即判定碰撞def collides_with(self, other_obj): distance self.position.distance_to(other_obj.position) return distance self.radius other_obj.radiusSpaceship可旋转、可加速、可开火的飞船Spaceship在基类之上增加了三个可调参数models.py类常量数值含义MANEUVERABILITY3每次按键旋转的角度度ACCELERATION0.25每帧推进速度增量BULLET_SPEED3子弹相对飞船的前向速度关键实现要点方向向量self.direction Vector2(UP)初始指向上方注意这里拷贝了一份UP避免后续rotate_ip原地旋转污染全局UProtate()self.direction.rotate_ip(angle)原地旋转方向向量顺时针为正角度accelerate()self.velocity self.direction * self.ACCELERATION把方向向量乘以加速度累加到速度上实现推力效果速度会惯性累积符合太空飞行手感draw()根据self.direction.angle_to(UP)计算当前朝向与正上方的夹角再用rotozoom(self.sprite, angle, 1.0)旋转精灵并绘制1.0表示缩放倍率保持原尺寸shoot()子弹速度 飞船朝向 × 子弹速度常量 飞船当前速度继承飞船惯性然后通过构造函数传入的回调create_bullet_callback把子弹加入游戏同时播放激光音效self.laser_sound.play()models.py。Asteroid可分裂的小行星Asteroid实现了经典的小行星分裂机制models.py构造函数接收size参数默认 3通过size_to_scale {3: 1.0, 2: 0.5, 1: 0.25}映射缩放比例用rotozoom(load_sprite(asteroid), 0, scale)按比例缩放精灵——3 级小行星原尺寸2 级半尺寸1 级四分之一尺寸速度由get_random_velocity(1, 3)随机生成即每次约 1~3 像素/帧、方向随机split()当被子弹击中且size 1时在原位置分裂出两个size - 1的小行星并通过回调create_asteroid_callback加入小行星列表。Bullet一去不回头的子弹Bullet是最简单的对象models.py仅比基类多覆盖了move()子弹不做边界环绕而是直线飞行def move(self, surface): self.position self.position self.velocity飞出屏幕的子弹会在游戏逻辑中被清理见下文。输入处理事件驱动与按键扫描的配合game.py 的_handle_input()同时使用了 Pygame 的两种输入方式1. 事件队列event queue——处理离散事件pygame.QUIT关闭窗口与K_ESCAPE触发quit()退出按下K_SPACE且飞船仍存活时调用self.spaceship.shoot()。2. 按键状态扫描key.get_pressed()——处理持续按住的状态按住K_RIGHT顺时针旋转、K_LEFT逆时针旋转、K_UP持续加速。注意代码中所有涉及飞船的操作都先判断if self.spaceship:因为飞船被小行星撞毁后会被置为None后续帧不能再访问其属性否则会引发AttributeError。游戏逻辑碰撞、分裂与胜负判定game.py 的_process_game_logic()依次处理以下逻辑1. 移动所有对象遍历_get_game_objects()小行星 子弹 飞船调用各自的move()。2. 飞船与小行星碰撞 → 游戏失败若飞船撞上任意小行星将self.spaceship置为None并设置self.message You lost!。3. 子弹与小行星碰撞 → 分裂遍历子弹与陨石的副本列表self.bullets[:]与self.asteroids[:]拷贝副本避免遍历中修改原列表命中后从原列表移除两者并调用asteroid.split()生成更小的碎片。4. 清理飞出屏幕的子弹if not self.screen.get_rect().collidepoint(bullet.position)判断子弹是否仍在窗口矩形内不在则移除。5. 胜利判定当小行星列表清空且飞船仍存活时设置self.message You won!。胜负消息最终由print_text渲染在屏幕中央。十步渐进式构建路线从空窗口到完整游戏仓库以source_code_step_1至source_code_step_10十个目录呈现了游戏逐步成型的过程是学习自顶向下分步开发的绝佳教材。根据对各目录源码的核对每步引入的能力如下步骤源码目录新增能力Step 1source_code_step_1创建 800×600 窗口与主循环骨架蓝色填充背景事件处理留空Step 2source_code_step_2加入退出事件处理QUIT/EscStep 3source_code_step_3引入utils.load_sprite加载星空背景贴图Step 4source_code_step_4建立models.py的GameObject基类加入飞船与小行星精灵引入Clock.tick(60)Step 5source_code_step_5实现Spaceship的旋转与加速支持方向键操控Step 6source_code_step_6实现Asteroid类与随机生成 6 颗小行星引入边界环绕与飞船碰撞失败Step 7source_code_step_7实现Bullet类与shoot()支持空格开火Step 8source_code_step_8加入子弹-小行星碰撞、小行星split()分裂机制Step 9source_code_step_9加入激光音效laser.wavStep 10source_code_step_10加入字体渲染与 You won! / You lost! 胜负消息例如Step 1 的最小窗口版本只有二十余行step_1 game.pyclass SpaceRocks: def __init__(self): self._init_pygame() self.screen pygame.display.set_mode((800, 600)) def main_loop(self): while True: self._handle_input() self._process_game_logic() self._draw() def _handle_input(self): pass ...而 Step 10 的 最终 game.py 已具备完整的碰撞、分裂与胜负判定与最终版几乎一致。这种渐进式结构让学习者可以在每个阶段运行代码、观察新增行为是理解复杂游戏逐步叠加逻辑的最佳方式。面向对象的架构设计亮点从源码中可以提炼出几个值得学习的面向对象设计模式继承 多态所有游戏对象继承GameObject统一了move()/draw()/collides_with()接口使 game.py 的_get_game_objects()能用一份循环处理所有对象——列表拼接[*self.asteroids, *self.bullets]后再追加飞船配合鸭子类型无需isinstance判断即可统一调用。回调注入Callback InjectionAsteroid与Spaceship的构造函数接收create_asteroid_callback/create_bullet_callback回调把创建对象的职责交给拥有列表的SpaceRocksself.asteroids.append、self.bullets.append。这解耦了模型与游戏管理器模型只负责产生新对象的事件而由管理者决定如何维护对象集合符合依赖倒置思想。向量物理全程使用pygame.math.Vector2完成位置、速度、方向与旋转运算rotate_ip、angle_to、distance_to避免了手写三角函数代码简洁且精确。运行与扩展建议直接游玩按上文命令安装依赖并python space_rocks启动用方向键移动、空格射击调参修改 models.py 中的MANEUVERABILITY、ACCELERATION、BULLET_SPEED可调整手感修改 game.py 中range(6)可改变初始小行星数量MIN_ASTEROID_DISTANCE 250game.py控制小行星生成时与飞船的最小安全距离学习路线对照十步目录按序运行观察每个功能逐步接入的过程若需对比差异可将相邻步骤的space_rocks/目录做 diff潜在扩展方向基于现有架构计分系统利用现有碰撞事件、多条命替换spaceship None逻辑、更多精灵与音效按assets/目录约定添加、关卡难度递增调整初始小行星数量与get_random_velocity速度区间。本仓库相关代码与资源均为开源教程的配套材料可自由查看、运行与学习。赞分享示例工程教程【免费下载链接】materialsBonus materials, exercises, and example projects for our Python tutorials项目地址https://gitcode.com/gh_mirrors/ma/materials点击查看免费下载相关推荐python-mini-projects 太空射击小游戏基于 Pygame 的 Space Bullet Shooter 实现与源码解析python mini projects 太空射击小游戏基于 Pygame 的 Space Bullet Shooter 实现与源码解析 本文以 python示例工程使用 Python 与 Pygame 从零构建太空岩石Asteroids游戏十步渐进实战全解析使用 Python 与 Pygame 从零构建太空岩石Asteroids游戏十步渐进实战全解析 本仓库中的 asterioids pygame proje示例工程教程Web-Dev-For-Beginners 项目实战用 JavaScript 从零构建太空射击游戏Space GameWeb Dev For Beginners 项目实战用 JavaScript 从零构建太空射击游戏Space Game 导读 本篇技术指南围绕 Web文档教程前端上一篇3个维度解析Manim数学动画引擎如何让抽象数学概念变得可视化下一篇SpriteJS 事件系统实战指南DOM 事件模型、命中检测与事件冒泡创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Shopify弃用React Native回归原生:AI Coding Agent驱动的工程回归

Shopify弃用React Native回归原生:AI Coding Agent驱动的工程回归

1. 这不是一次技术倒退,而是一次精准的工程回归Shopify把用了好几年的React Native应用,在12周内全部迁回Swift和Kotlin原生代码——这个标题刚出来时,我朋友圈里好几个做跨平台开发的同行第一反应是:“是不是被RN坑惨了&#xff…

2026/10/15 7:07:52 阅读更多 →
开放集识别实战:从OpenMax到ARPL的未知类拒绝与模型鲁棒性

开放集识别实战:从OpenMax到ARPL的未知类拒绝与模型鲁棒性

1. 开放集识别到底在解决什么问题第一次接触开放集识别(Open Set Recognition,简称 OSR)这个概念,是在做一个图像分类项目的时候。当时训练集里只有十类目标,测试的时候模型遇到了一张完全不属于这十类的图片&#xff…

2026/10/15 7:07:52 阅读更多 →
任天堂NX主机深度复盘:差异化竞争策略能否撼动PS4与Xbox One格局

任天堂NX主机深度复盘:差异化竞争策略能否撼动PS4与Xbox One格局

1. 当“NX”这个名字第一次出现在财报里2015年3月,一份例行财报的角落里出现了一个代号:NX。没有实机照片,没有参数表,没有第三方厂商站台,只有一句话——正在开发一款代号为NX的专用游戏平台。当时我正混迹于几个主机…

2026/10/15 7:07:52 阅读更多 →

最新新闻

NV3023B单芯片LCD驱动器:从规格书到初始化代码实战

NV3023B单芯片LCD驱动器:从规格书到初始化代码实战

简介:NV3023B技术规格书是一份面向液晶显示驱动开发与嵌入式设计人员的完整技术文档,对应上海新视野微电子推出的A-Si TFT LCD单芯片驱动器。该芯片支持132162分辨率和262K色彩,规格书围绕电路设计与调试验证展开,详细说明引脚功能…

2026/10/15 7:44:00 阅读更多 →
如何用 PathOfBuilding 规划流放之路 Build:离线伤害计算与天赋树实操教程

如何用 PathOfBuilding 规划流放之路 Build:离线伤害计算与天赋树实操教程

如何用 PathOfBuilding 规划流放之路 Build:离线伤害计算与天赋树实操教程 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 把一条成型的流放之路 Build 粘进 …

2026/10/15 7:44:00 阅读更多 →
Spark实时趋势分析系统:从JSON解析到可交互可视化

Spark实时趋势分析系统:从JSON解析到可交互可视化

1. 这不是又一个“爬虫词云”的毕设套壳——为什么这个Spark趋势分析系统能真正拉开差距你手头正盯着学院发来的毕设选题清单,第一页全是“基于Python的XX管理系统”“基于Django的在线商城”,翻到第三页突然看到一行字:“基于Spark的病毒式社…

2026/10/15 7:44:00 阅读更多 →
AI增强型CI/CD流水线:金融科技中的自动化实践

AI增强型CI/CD流水线:金融科技中的自动化实践

1. 项目背景与核心价值去年在主导某金融科技项目的敏捷转型时,我们团队每天要处理300次代码提交,但传统CI/CD流程遇到两个致命瓶颈:一是单元测试用例维护成本呈指数级增长,二是部署包的环境适配需要人工编写大量胶水代码。这促使我…

2026/10/15 7:44:00 阅读更多 →
DOTA数据集yolo格式/coco格式 遥感数据集 (包含obb和hbb)

DOTA数据集yolo格式/coco格式 遥感数据集 (包含obb和hbb)

DOTA数据集yolo格式/coco格式 遥感数据集 数据集包括DOTA1.0,DOTA1.5和DOTA2.0三个版本。 (包含obb和hbb) 数据集标注有yolo和coco格式,yolo系列可以直接训练,无需额外处理,支持yolov5,yolov7&a…

2026/10/15 7:44:00 阅读更多 →
多Agent协作中Skill重复治理:机制设计与开源工具实战

多Agent协作中Skill重复治理:机制设计与开源工具实战

1. 多 Agent 环境下 Skill 管理的真实困境1.1 从一个让人抓狂的场景说起如果你正在维护一套多 Agent 协作系统,大概率遇到过这种局面:同一个“查数据库”的能力,在 Agent A 的目录里有一份,在 Agent B 的配置里又抄了一份&#xf…

2026/10/15 7:43:00 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →