在PyGame中编写您的第一个游戏

学习使用Python开发游戏

您是否想过制作视频游戏? 现代游戏引擎使任何人开始制作自己的游戏比以往更加容易。 今天,我们将看一下Python的PyGame库,并在经典游戏Snake上创建一个版本。

完成后,您应该对PyGame库更加满意,并对图形,游戏循环,游戏计时器和碰撞管理等游戏编程概念更加熟悉。

我们正在建设

这就是最终的结果。 我们将对以下gif功能的所有必需内容进行编码

我们不会介绍更高级的PyGame功能,例如精灵,数据持久性或场景逻辑。

先决条件

本文做出以下假设:

  • 您的系统上安装了Python 2.7或3.3+
  • 您熟悉面向对象的Python
  • 熟悉游戏编程是一项奖励,但不是必需的

源代码

该项目的完整源代码可以在Github上找到。 所有代码示例均以Python 3编写,但也与Python 2兼容。

可选的第一步-Virtualenv

我强烈建议对所有Python项目都使用虚拟环境,但是此步骤是可选的,此处不再赘述。 有关安装和使用Virtualenv库的更多信息,请参见此处。

入门

让我们从创建目录结构并为我们的游戏初始化Python模块开始。

  $ mkdir Anaconda && cd Anaconda 
$ mkdir游戏
$ touch游戏/__init__.py

现在我们有了目录和游戏Python模块,让我们继续设置虚拟环境并安装PyGame。

  $ virtualenv venv --python = python3.6#可选 
$ source venv / bin / activate#可选
$ pip安装pygame

接下来,在目录的根目录中创建一个名为Anaconda.py的文件,其内容如下:

颜色,配置和幻数

在游戏编程中,我们的代码开始变得不清晰很容易。 通常会在任意X和Y坐标处绘制形状或精灵,这些精灵通常具有运动,颜色和动画效果。 接下来,您就会知道魔术数字和重复的值分布在各处。

在继续之前,让我们先花一点时间纠正此问题。 在我们的src目录中,创建一个名为Config.py的文件, Config.py包含以下内容:

进展! 接下来,我们将切换到Game类,并开始使蛇移动。

运动

我们将再次利用PyGame的事件处理程序,这次响应箭头键来引导我们的蛇。 在Game.py文件中,在loop()函数内的游戏循环之前添加以下内容。

下载游戏的开源字体

此游戏使用Alfredo Marco Pradil在OFL许可下免费提供的字体“ Now”。 您可以在此处找到有关信息并下载该字体。

在根目录中创建一个名为assets的文件夹,然后将文件Now-Regular.otf移至该目录。 如果您使用其他字体,请确保更改后面的代码示例以匹配正确的文件名。

标题和分数文字

从构建菜单项到显示玩家对话,您最终将在游戏中使用大量文本。 幸运的是,使用PyGame,这比我们迄今为止所见的其他任何事情都困难。

既然我们已经知道,随着蛇消耗更多的苹果,我们将需要经常更新分数,让我们继续在Game对象的初始化函数中创建一个实例变量。

撞墙

既然我们已经清楚地知道了我们的苹果将在哪里产卵,以及我们希望蛇能够在哪里产卵,那么让我们开始碰撞检测并在蛇与墙碰撞时触发重新启动。

为了使事情简单,而不是处理多个场景中的单独循环,我们将利用Snake处于静止状态的优势,直到按下第一个箭头键并重新启动我们的主要功能。

让我们考虑一下。 因此,假设您保持相同的设置,我们原来的窗口是500 x 500,但是现在在所有四个边缘上都有一个35像素的边框,有效地将我们的播放区域缩小到440 x440。因此,这就是我们需要的尺寸检查。

为了从本文的前面重申,绘图坐标始于左上角,因此在检查碰撞时,需要在计算右壁和底壁时添加蛇形单元的长度和宽度来解决此问题。 。

Game.py文件中对snake.draw()的调用下面,添加以下代码:

我们计算保险杠的位置,并将它们存储到自己的变量中,以使代码短一些,它们代表右手和下边框。

然后,我们简单地检查蛇的当前位置是否小于左侧或顶部或大于右侧和底部边界,将蛇的大小添加到X和Y位置,以说明坐标位于左上角。 如果检查正确,我们将再次调用游戏循环以重新启动游戏。

现在,当您运行游戏时,应将蛇的位置重置到屏幕中间。

建立一个苹果

没有稳定的苹果来吃,我们的蛇就无法生长。 让我们细分苹果的要求。

  • 我们将需要在X和Y位置绘制苹果
  • 随机函数,将根据需要在可玩游戏区域上生成随机坐标
  • 显示苹果的绘图功能

src文件夹中使用文件Apple.py创建一个新文件,其内容如下:

__init__ ,我们初始化x_posy_pos属性并存储对显示的引用。 然后,我们为Apple的最终排名调用randomize函数。

randomize函数生成两个方向的最小值和最大值之间的随机整数。

draw功能与我们的Snake绘制功能相同,将苹果放置在随机生成的X和Y坐标上。

要真正开始在游戏负载上绘制苹果,请在Game.py文件内对snake.move()snake.draw()调用上方添加以下内容。 初始化语句需要添加到初始化Snake对象的顶部。

如果您现在运行游戏,应该会看到我们的苹果出现在游戏表面上。 您可以通过碰壁几次来触发重新启动,以确保随机化功能正常工作,并且我们的苹果可以按需移动。

吃一个苹果

我们将利用PyGame矩形的内置碰撞检测功能来确定何时食用了苹果。 我们需要修改一些代码来实现这一目标。

首先, Apple类和Snake类中的draw方法都需要修改以返回它们已经在调用的rect方法。

这两个函数的调用位置需要修改以存储此矩形对象。

现在我们已经引用了两个矩形,我们可以将以下collison代码添加到壁碰撞逻辑正下方的Game.py文件中。

现在,当您测试游戏时,您应该可以越过一个苹果,并且该苹果重新生成它所在的位置,并且由于我们每次食用一个苹果时都会增加Game对象的score属性,因此您应该看到分数增加。

蛇的大小增加

每次调用Snakemove方法时,我们将使用的用于跟踪蛇的各个身体部位的系统将通过将头部的最后位置存储在一个数组中,并推到顶部,从而起作用。

Snake.py文件中,将以下实例属性添加到__init__函数中。

我们的body将包含一个元组列表,每个元组具有一个X和Y值,而我们的身体的最大大小决定了Snake可以得到的大小以及每个吃的苹果会增加的数量。

接下来,我们将需要添加新功能来生长蛇,绘制身体,最后对move方法进行修改以存储历史记录并调整列表的大小。

每次更改时,先前的位置都会写入正文,但是旧列表会被删除,因为列表的长度超出了预期。

绘制主体的工作原理与头单元相同,但是我们要遍历主体中的每个项目,并为每个记录绘制一个立方体。

重置分数

为了在每次重置时重置得分,请在Game类的循环函数中的while True:上方直接添加以下行。

  self.score = 0 

蛇相撞

为了检查我们是否发生碰撞,我们进行了一次切割和干燥检查,我们在每个身体元素上进行迭代,并查看它是否具有与头部相同的X和Y坐标位置。

如果是这样,则会导致错误并重新启动游戏。 这也适用于尝试将蛇向后移动。

将此逻辑直接添加到Game.py文件中现有碰撞检测逻辑的Game.py

游戏现在应该成功结束蛇头和蛇体之间的碰撞。

结论

我们的基本蛇游戏现在可以玩了,希望您对PyGame和游戏编程的了解比在阅读本文之前做的要舒服得多。

以下是一些可以使您深入研究的改进建议:

  • 菜单画面
  • 数据库得分高,可以持续关闭
  • 在屏幕上暂停/游戏
  • 背景

感谢您抽出宝贵的时间阅读本文档,如果您有任何疑问或意见,请告诉我。