示例工程教程【免费下载链接】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),仅供参考