使用 Python 制作太空侵略者游戏

2025 年 1 月 12 日 | 13 分钟阅读
Space Invaders game using Python

引言

静态射击游戏“太空入侵者”的用户在屏幕底部滑动激光,向远处的外星人射击。当它们接近屏幕边缘时,外星人会向下移动,并成群地左右移动。

目标是使用枪击消灭所有外星人。换句话说,不要被杀死,这样你就可以反击入侵者。如果用户总是有三条命,那么如果入侵者(外星人)触及屏幕底部,游戏将立即结束。

我们将使用 Python 和 Pygame 创建一个简单但功能齐全的著名游戏“太空入侵者”。使用 Pygame 和 Python(最受欢迎的编程语言之一),可以快速创建各种游戏应用程序。

在本教程中,我们将学习如何编写 Pygame 程序并使用 Pygame 逻辑制作游戏。还可以向窗口背景添加图片和音乐。我们还将能够检测碰撞并控制物体移动。

游戏规则

  • 一段时间后,外星人应该向下移动。
  • 当外星人接触到底部边缘时,游戏应该结束。
  • 用户的飞船只能向两个方向移动:左或右。
  • 应该有一个分数计数器。如果我们成功击中外星人,我们就会得分。

建造太空入侵者游戏的步骤

  1. 首先安装 Pygame 程序。
  2. 扩展用户和入侵者。
  3. 使用键盘自动控制太空人和用户移动。
  4. 自动随机太空入侵者射击,并通过键盘控制用户射击。
  5. 识别物体碰撞并做出适当反应。

源代码片段和解释

上述代码的解释

  • 第 1 行:在 Python 中导入 math 库是为了授予对 C 标准中描述的算术运算的访问权限。
  • 第 2 行:Python import random 库包含用于生成或更改随机数的多个函数。Python 中随机内置函数使用 random() mumbo jumbo 数字生成器函数生成 0.0 到 1.0 之间的随机浮点整数。
  • 第 3 行:它将所有可用的 pygame 组件导入到 python 编程包中。
  • 第 4 行:mixer 库包含用于加载 Noise 对象和控制播放的类。

上述代码的解释

  • 第 2 行:Pygame.init 初始化所有加载的 pygame 模块。如果模块失败,则返回一个包含失败和成功初始化总数的元组,但不会引发异常。
  • 尽管使用 pygame.init() 计算机可以快速启动所有导入的 pygame 模块,但您始终可以单独初始化特定的模块。如果模块的 init() 方法不成功,它将抛出异常。
  • 第 4 行:将因此创建屏幕。当 PyGame 中的显示选项更改时,会在显示器上创建一个可见的图像表面。
  • 此表面在具有窗口管理器的系统上有两个显示选项:全屏和窗口。显示表面是一个普通的 PyGame 表面对象。

上述代码的解释

第 2 行:使用函数图像是添加背景图像所需的一切。应该加载图像的路径并发送。

第 4 行:将加载和播放音乐名称或文件对象。如果当前正在播放音乐流,它将被停止。因此,歌曲不会开始播放。

第 5 行:这将用于播放提供的音乐流。如果正在播放一段音乐,它将停止并重新开始。

上述代码的解释

  • 第 2 行:将设置实际的窗口标题。
  • 第 3 行:pygame.image.load() 方法将返回一个绘制有照片的 Surface 对象。此 Surface 对象将不同于作为显示 Surface 对象的 Surface 对象。
  • 第 4 行:可以使用它更改图像。

然后 pygame.image.load() 方法将返回一个绘制有图像的 Surface 对象。此材质对象将与显示表面对象不同。设置用户的 X 坐标。同时,设置用户的 Y 坐标。同时更新用户更改 X 坐标。

上述代码的解释

  • 在第 2 行设置敌人的列表。
  • 第 3 行是对手 X 坐标列表的初始化。
  • 第 4 行是对手 X 坐标列表的初始化。
  • 第 5 行是敌人 X 坐标列表中更新的初始化。
  • 第 6 行是敌人 Y 坐标列表中更新的初始化。
  • 第 7 行是敌人数量变量的初始化,它计算敌人的数量。

上述代码的解释

循环遍历 numOfFoes 变量以添加和修改敌人的 X 和 Y 位置。使用图像附加 foeImg.load()。在此示例中,我们使用 random 库的随机操作随机确定敌人的 X 位置。在此示例中,我们使用 random 库的随机操作随机确定敌人的 Y 位置。然后,添加敌人 X 位置的更改。最后,添加敌人的新 Y 位置。

上述代码的解释

  • 第 2 行初始化 scoreValue 变量。
  • 在第 3 行使用 pygame.font 将字体更改为 "freesansbold.ttf.Font()"。
  • 第 4 行初始化文本的 X 坐标。
  • 第 5 行初始化文本的 X 坐标。

上述代码的解释

  • 第 1 行:使用 pygame.font.Font() 将字体设置为 'freesansbold.ttf'
  • 第 2 行:x 和 y 是方法 showScore(x, y) 的参数。
  • 第 3 行:使用 PyGame 字体对象的 render() 过程创建表面对象,或在其上绘制文本的 Text surface 类。

blit(x,y) 技术指示我们绘制屏幕的背景并将其定位在 (x,y)

第 5 行定义了游戏结束文本函数。然后使用 PyGame 字体对象的 render() 过程创建 Text surface 类,或在其上绘制文本的表面类型。在第 7 行,我们使用 blit(x,y) 技术指示我们绘制屏幕的背景并将其定位在 (x,y)。

上述代码的解释

  • 第 1 行:指定函数 def the_user(x, y) 的参数。
  • 第 2 行:blit(x, y) 技术指示我们绘制屏幕的背景并将其定位在 (x, y)。
  • 第 3 行:使用参数 x、y 和 i 创建函数 def the_foe()。
  • 第 4 行:blit(x, y) 技术指示我们绘制屏幕的背景并将其定位在 (x, y)。

上述代码的解释

  • 第 1 行:定义函数 def fireShot(),其参数为 x 和 y。
  • 第 3 行将 shot 状态定义为全局并初始化为 "fire"。
  • 第 2 行:我们被指示将背景表面绘制到屏幕上并将其定位在 (x, y)
  • 第 3 行:函数定义 isCollision() 及其参数 foeX、foeY、shotX 和 shotY。
  • 第 4 行:使用路径公式计算路径。

在第 3、4、5 和 6 行将 if 条件语句应用于路径值,以确定它将返回 1 还是 0

上述代码的解释

  • 第 2 行:running 变量初始化为 TRUE。
  • 在第 3 行将 while 循环应用于 running 变量。
  • 第 4 行:此技术用给定颜色填充显示器。
  • 第 6 行:根据 screen.blit(x, y) 函数,我们必须绘制屏幕的背景表面并将其定位在 (x, y)。此外,应用于循环遍历参与时间。

在第 4 行和第 9 行将 if 条件语句应用于 event.type 值,将确定 event.type == pygame.KEYUP 是否成立。

上述代码的解释

第 1 行:将布尔表达式 if 应用于 event.key,看 event.key == pygame.K_SPACE 是否成立,如果为 true,则第 2、3 和 4 行:将布尔表达式 if 应用于 shot 状态,看 shot 状态 == "ready" 是否成立,如果为 true,则播放声音 "laser.wav"。第 3 行给予用户一枪。第 4 行使用参数 shot 和 shotY 调用函数 fireShot(shotX, shotY)。

• 第 5 行和第 6 行:将布尔表达式 if 应用于 event.type,看 event.type == pygame.KEYUP 是否成立,如果成立,则第 6 行:将布尔表达式 if 应用于 event.key,看 event.key == pygame.K_LEFT 或 event.key == pygame.K_RIGHT 是否成立,如果成立,则将用户坐标更改为 0。

上述代码的解释

  • Python 的 += 运算符将两个值相加并将结果存储在一个变量中,如第 3 行所示。此运算符的名称是加法赋值运算符。此运算符通常用于将值添加到增强型和替代性通信中,它计算事件发生的次数。在我们的示例中是 userX = userX + userXChange。
  • 第 4 行和第 9 行:通过将条件语句 if 应用于 userX,我们可以确定 userX = 0 是否成立,如果成立,则将 userX 初始化为 0。
  • 第 6 行和第 7 行:如果 userX >= 739 为 true,我们将 userX 初始化为 739,否则,如果 userX 再次满足条件表达式。

上述代码的解释

  • 第 2 行:循环遍历多个敌人以跟踪敌机移动。
  • 将 if 条件应用于 foeY[i],检查 foeY[i] > 340 是否成立,如果成立,则我们遍历 numOfFoes 循环以初始化 foeY[j] = 2000。
  • 第 6 行和第 7 行:调用游戏结束文本() 函数并退出循环

加法赋值运算符再次用于 foeX[i] += foeXChange[i]。将 if 条件应用于 foeX[i] 以确定 foeX[i] = 0 是否成立,如果成立,则将 foeXChange[i] 初始化为 4。此外,将加法赋值运算符用于 foeY[i] += foeYChange[i]。接下来,我们将条件表达式 elif 应用于 foeX[i] 以查看 foeX[i] >= 739 是否成立。如果成立,我们将 foeXChange[i] 初始化为 -4,然后使用加法赋值运算符使 foeY[i] += foeYChange[i]。

上述代码的解释

  • 第 2、3、4 和 5 行用于碰撞检测。如果发生碰撞,将首先播放声音 "Explosion.wav"。在第 6 行将 shotY 初始化为 389,将 shot 状态初始化为 "ready"。
  • 第 7 行:使用加法赋值运算符增加 scoreValue 变量。
  • 第 8 行:使用 randint() 函数,将 0 到 739 之间的一个整数随机分配给 foeX[i]。
  • 第 9 行:使用 randint() 函数,将 99 到 199 之间的一个整数值随机分配给 foeY[i]。
  • 第 10 行:使用参数 foeX[i]、foeY[i] 和 i 调用 foe 函数。

上述代码的解释

使用布尔表达式 if 应用于 shot 状态以确定 shot 状态 == "fire" 是否成立,如果成立,则使用参数 shot 和 shotY 调用函数 fireShot(shotX, shotY),并使用附加赋值 shotY -= shotY change。这是为了让射击能够移动。

分别使用参数 userX、userY 和 testY1 调用函数 the_user(userX, userY) 和 show score(textX1, testY1)。最后,分数将更新并显示在屏幕上。

使用 Python Pygame 模块的太空入侵者游戏整合代码

输出

pygame 2.1.0 (SDL 2.0.16, Python 3.8.12)

 

来自 pygame 社区的问候

Space Invaders game using Python

图 1:太空入侵者游戏屏幕

Space Invaders game using Python

图 2:游戏结束屏幕

结论

本博客讨论了 Python Pygame 包和我们用来开发太空入侵者游戏的过程。Pygame 是一个 Python 库,可用于制作各种游戏。