十行代码写Python游戏,你准备好了吗?

2023-11-11

准备好了吗?大家马上开始了激动人心的游戏编程之旅。

也许你以前学过一点编程󿀌但是如果你从来没有接触过游戏编程,也许你还是会对游戏程序的运行感到困惑。游戏程序不像计算一个公式或一个迷题,得到答案后,程序就没有了,游戏程序一直在运行,只要你不主动退出,然后你可以一直呆在游戏里。这就是游戏循环的魔力。

下面我们试着用最少的编码写一个小游戏。

01 选择合适的开发环境

“工欲善其事必先利其器”,在写游戏之前,你必须选择合适的工具,这样可以大大简化程序写作工作。Python语言中有许多第三方库提供游戏编程功能,最著名的是Pygame库󿼌它为游戏提供了大量的API来达到各种效果。但是对于初学者来说,Pygame库或者看起来有点复杂󿀌我们希望选择更简单高效的工具,推动能够专注于完成游戏算法,学习游戏开发库的应用并不需要花费太多的精力。

这里选择Pgzero库来写游戏。Pygameero的完整名称是Pygame Zero,可见它是从Pygame库衍化而成的。可以说Pgzero是Pygame的精减版,Pygame库的主要功能,但是屏蔽了一些复杂的细节,促使新手快速入门。

02 设置开发工具

因为Pgzero是Python的第三方库,它不能独立工作,#xff0c;必须在Python编码中应用,所以我们首先需要组装Python开发工具。可到Python官网下载最新安装包进行施工,然后可以用Python提供的IDLE编辑器编写代码。

而且慢,你认为使用IDLE编辑器编写程序不那么方便吗?简单的小程序自然无所谓,但是游戏程序相对复杂,此外,还需要使用一些图片或噪音资源,我们还需要统一管理所有游戏资源。因此,我们必须找到一个更灵活、更方便的游戏写作工具,我在这里使用Mu编辑器。Mu是专门为Python学生设计的开发环境,编辑器非常友好,提供了大量方便的操作,例如,编码自动提醒、编码缩近标识、语法检查等功能。更重要的是,,Pgzero库࿰已经搭载c;并提供对物资供应的监督,这就是我们所需要的,不是吗?Mu编辑器可以在官方网站上(https://codewith.mu/)下载安装󿀌现在我们直接操作Mu试试。第一次打开Mu时,会提醒选择运行模式,如图1所示。

图1 Mu编辑器选择界面的方式

点击鼠标选择“Pygame Zero模式,下面的Mu将转换为Pgzero模式,所见的操作界面如图2所示。

图2 “Pygame Zero”运作模式

Mu编辑器中的空白区域是我们将编写代码的区域,程序完成后,单击页面上方的“渐进”按钮即可操作程序。看起来很棒,还在等什么?赶快开始吧!


下面逐渐写游戏。但是,什么是游戏程序?也许你会在屏幕上导出“也许”Hello World",或者你知道如何编程和计算斐波拉契数值󿀌但是你确实知道如何写游戏程序?

首先,游戏操作需要用户界面(自然,早期的计算机游戏可能是文本页面,但这已经是很古老的事了,现在我们讨论的是围绕用户界面的游戏)。为了显示用户界面󿀌我们的程序应该能够生成“窗口”,它可以显示各种图形或图像,游戏的内容是由各种不同的图形或图像描述的。为了显示用户界面󿀌我们的程序应该能够生成“窗口”,它可以显示各种图形或图像,游戏的内容是由各种不同的图形或图像描述的。

我们试图创建程序窗口。

01 建立程序窗口

点击Mu编辑器上方菜单栏中的“新建”按钮,编辑器中可以看到空白区域,这是新创建的Python源代码文档。

随后,点击“操作”按钮试试#xff0c;您可以看到屏幕上有一个窗口,如图3所示。

图3 游戏窗口界面

感觉如何?是否惊讶于咧嘴咧嘴?本来连一行代码都没写,一个窗户可以发生。这就是Pgzero的魔力。实际上,Pygzero已经帮助我们做了很多“幕后工作”,让我们致力于写游戏逻辑,不要太在意表明相关问题。

但是眼前的窗户是黑色的,不是不太好看＀不是很好看c;而且窗户的大小不是你喜欢的。别担心,一点一点地解决问题。

02 改变窗户的大小和颜色

首先,处理窗口尺寸问题。࿰在Pgzero中c;程序窗口的大小࿰是根据定义两个常量值来确定的c;具体编码如下:

 

注意WIDTH和HEGIHT是Pgzero预设的两个常量,各用于表示程序窗口的宽度和高度值(像素)单位;。上面的代码表示将程序窗口的宽度值设置为600像素,高度设置400像素。上面的代码表示将程序窗口的宽度值设置为600像素,高度设置为400像素。我们将这两行编码输入新建的源代码文档,然后再次操作,可以看到窗户的尺寸发生了变化。

让我们试着改变窗户的背景色。Pgzero,默认情况下,窗户的背景颜色为黑色(原来是这样的�,如果你想改变背景色,draw()函数必须在系统中定义。那么这个draw()函数的来源是什么呢࿱?f;

draw()函数是Pgzero的“幕后主使”之一,它承担各种图形或图像,表示游戏中的图像。我们只需要在系统中定义自己的draw()函数,必须在draw()函数中编写图像处理代码󿀌该程序将自动执行draw()函数来表示。

那样,改变窗口颜色,draw()函数中需要编写哪些代码?此时还需要依靠Pgzero提供的内置对象scren来完成。实际上,为了简化游戏编程࿰,Pgzeroc;在游戏中设定了许多目标来帮助完成各种操作。screen目标的关键是在窗口制图,它提供了很多制图方法,不仅可以绘制图形和图像,还可以制作文字信息󿀌我们会经常在游戏编程中使用它。

目前,我们需要使用scren对象fill()模式,它意味着所有的窗户都用某种颜色覆盖。该方法接受RGB元组作为参数。RGB元组是什么࿱?f;RGB元组由三个数组成:元组,每个数字代表一个颜色重量,例如(255,0,0)表示红色󿀌(0,255,0)表示绿色󿀌(0,0,255)蓝色,(0,0,0)代表黑色󿀌(255,255,255)代表白色等。

因此,您可以在源代码中添加以下二行代码:

 

存储和运行程序,可以看到如图4所示的页面。

因此,您可以在源代码中添加以下二行代码:

存储和运行程序,可以看到如图4所示的页面。是的,我们的窗户环境变白了。

图4 更改背景颜色后的程序窗口





03 显示图像

现在我们有一个程序窗口,但它似乎是空的c;没有内容。我们想在窗户里展示一些东西。我们想在窗户里展示一些东西。例如,我们准备了一张精美的图片,想在窗口里展示一下,如何做到?

首先,您应该将图片文件放在指定的位置,即“images在文件夹中。点击Mu编辑器上方的“照片”按钮,会自动打开“会自动打开”images”文件夹。我们可以将图片文件放入文件夹中。

准备好图片文件并将其放入“images文件夹后󿀌我们可以在窗户里展示它,这就需要使用scren对象blit()。例如,要表示一个名字“一个名字”breakout_ball小球照片,我们只需要在系统中添加一行代码:

 

blit()方法的第一个参数是标注照片文件名,用字符串描述(不要带后缀�,第二个参数是图像显示的座标。该座标是由两个数组成的元组,第一个数字显示图像的横坐标,第二个数字是图像纵轴。因为Pgzero中窗口的坐标原点位于左上方,向右坐标值提升󿀌向下纵轴值提升󿀌因此,座标(200,100)显示图像从窗口的左边界到右边的200个像素,100个像素从窗口的上边界向下偏移。

到目前为止,我已经编写了5行代码,具体如下:

现在运行程序󿀌可以看到图5所示的程序界面,它标记了图像坐标值所代表的含义。

图5 程序界面显示图像



现在我们不仅有一个程序窗口,它还显示了一幅图像,太神奇了。不要太高兴󿀌现在这个程序不能称之为游戏。众所周知,#xff0c;游戏中的图形或图像将“移动”,换句话说,它们可以不断地改变位置来表示,目前,我们的程序只能在固定位置显示图像,它根本动不了。不要灰心󿀌下面我们就想办法让它动起来。

在付诸行动之前,有必要了解游戏的基本概念。在游戏世界中,有两个基本前提:情境与角色。动画场景是指游戏场地,或者一个特殊的游戏场景。通常我们可以为游戏开发一些规格比较大的图片,将其作为动画场景的背景图像;游戏角色是指动画场景中的许多物体,它们不仅有特定的图像,更重要的是,他们可以活动(一般情况下,活动),并且可以产生相互影响。

假如我们想设计游戏󿀌为游戏建立情境和角色是必要的。

假如我们想设计游戏󿀌它需要为游戏建立情境和角色。那么如何操作࿱呢?f;

01 建立动画场景

首先创建动画场景。事实上,我们以前做过动画场景。没错,󿄟我们似乎什么都没做,只是建立了一个程序窗口,然后用白色填充。是的,这甚至是一个动画场景。动画场景非常复杂,#xff0c;也可以很简单󿀌就像我们所做的࿰一样c;用单一颜色填充窗口,也可以作为游戏场景使用。因为场景的主要功能是为每个游戏角色提供一个活动场所,只要能保证角色能准确地表现出来。

02 建立游戏角色





下面建立游戏角色。人物的建立似乎并不简单,因为角色必须活动,但是我之前在窗户上显示的球根本无法移动,所以不能算是游戏人物󿀌只是一幅图像。怎么办࿱?f;幸运的是,Pgzero提前为我们准备好了,它通过给一个叫Actor的类来帮助我们建立游戏角色。例如,创建一个圆球角色󿼌编写代码:

 

上行代码采用Actor类的构造方法来形成小球角色目标,并将其存储在变量ball中＀中c;如果将来想操作球,只需浏览ball变量即可。Actor类有两种主要参数,第一个是人物的照片文件名,二是人物的初始位置。这与之前显示的图像参数值相同。

圆球角色是建立起来的,那么如何在窗口中显示它࿱呢?f;还和以前一样吗?#xff00c;必须使用screnblit()方法?自然不需要。今天的小球不再是一幅图像,但是一个真正的角色目标,它有很多属和方法可以使用。其中一种方法叫draw(),它可以用来在窗户里展示自己。


我们将以前的代码改变如下:

操作时会发现,程序的结果与图5所示的效果完全相同。但是现在球还是动不了?别担心,每个人都做好了一切准备工作c;是时候让它动起来了。



01 改变圆球座标



十行代码写Python游戏,你准备好了吗?
如果需要移动球,必须改变他在窗口中的地位,即圆球标记的座标。Pgzero,角色目标有两个:x和y,前者显示了窗口角色的横坐标,后者显示了窗户中角色的纵轴。因为球已经被定义为角色目标,可以直接改变它的x和y属来改变它的坐标值。

还有一件事要注意󿀌Pgzero要求将所有角色操作代码放置在一个称为update()函数中。因此,我们首先定义了update()函数,然后将改变球坐标的代码放入,具体如下:

操作程序,你会发现球慢慢地向右移动。真是太棒了!但是这到底是怎么回事?本来只写一行代码,在࿰之前,圆球的x座标应该只提升一个单位c;他怎么能一直向右移动?

呵呵,这就是游戏循环的魔力!

02 游戏循环

 

什么是游戏循环?假如你有一点编程经验,你一定写过循环程序。循环程序,符合特定条件的程序,一些操作反复进行。循环程序,符合特定条件的程序,反复执行一些操作。游戏循环也是类似的原理,将王者操作的编程代码放在一个循环语句中,自动重复执行。那么游戏循环的实施条件是什么呢?在循环体中应该执行什么样的句子?

让我们来看看游戏循环的标准。想想你玩游戏的经历,当你玩游戏时,如果你积极选择退出󿀌否则,你将永远在游戏中。不是吗??从程序角度来看,,从你开始玩游戏的那一刻开始,你已经在游戏循环中了,而且一直都在其中。因此,无条件实施游戏循环,本质上是一个死循环!天啊,没错。󿀌老师可以在编程课上强调,在编写循环程序时,应检查循环标准,不要写成死循环,出乎意料的是,游戏程序竟然是一个死循环。是的,游戏是一个死循环,或者称为连续循环。

我们可以用while句子来描述游戏循环,具体编码如下:a;

能看到�为True࿰设置while句子的循环标准c;True是布尔类型的常量,表达的内涵是“真”。因此,while循环将一直重复执行。因此,while循环将一直重复执行。

然后看看如何在游戏循环中写操作句。作为一个游戏,要执行两个最基本的操作,#xff1a;一是升级游戏逻辑,包括改变角色位置或图像󿀌解决角色之间的相互作用,转换动画场景󿀌等;另一个是制作游戏图像,包括制作游戏的环境,制作人物图像,制作文字信息󿀌等。如图6所示

图6 游戏循环平面图





在之前的程序中,每个人都编写update()函数来调整球座标,还编写了draw()函数制作圆球图像,这两个函数对应于游戏循环中的两个操作过程:update()升级游戏逻辑函数#xff0c;而draw()函数则用于制作游戏图像。因为游戏不断运行,游戏逻辑࿰需要不断升级c;同时,再次显示更新后的内容,因此,将update()函数和draw()函数放入游戏循环中重复执行。程序应该看起来像这样:


但是,当你编写代码时,你不会这样写,update()和draw()函数࿰只是在程序中定义的。c;但他们并没有根据类似的无限循环语句来启用。这是真的,因为Pgzero不需要这样做,游戏循环࿰已经提前在内部设置好了c;只需定义update()和draw()函数,并将升级游戏逻辑和显示游戏图像的编码分别输入,Pgzero内部的游戏循环将自动启用这两个函数。


点击Mu编辑器中的“渐进”按钮,程序将启动游戏循环进入游戏;点击“终止”按钮,该程序将停止游戏循环退出游戏。

现在终于明白游戏程序其实是这样运行的,有一点成就感,游戏并没有想象的那么神秘。

现在终于明白游戏程序其实是这样运行的,有一点成就感,游戏并没有想象的那么神秘。即使Pgzero已经在背后安排了一切,然后我们只需要专注于update()和draw()这两个函数来编写代码。是的,就这么简单!xff01就这么简单&#;



目前还有一个问题,也就是说,当球移到窗外时,,它消失得无影无踪。作为游戏人物,小球竟然来到了场景外!玩过游戏的人都知道,除场景外,游戏角色不能放置,如何将球的活动范围限制在窗口内?

每个人都应该做两件事a;一是检查球是否来到场景外;第二,让球再次回到场景中。

01 检查球的位置

如果你想知道球是否跑到场景之外,我们可以将其位置与窗口进行比较,例如,如果球的右边界超过窗口的右边界,可以判断球将从右侧跑出场景。那么如何用程序来表达这个意思?

目前,我们只知道小球的x属表示横坐标,y属表示纵轴。无论是x还是y值,࿰也是根据角色核心点的位置计算的c;因此,准确地说,,球的x属实际上是球定位点的横坐标,而y属是球形定位点的纵轴。那么如何表示球右边界的座标࿱呢?f; Pgzero为角色目标带来了4个left、right、top、bottom,每个角色的左、右、上、下边界都有自己的表现。总的来说,,left和right显示了角色左边界和右边界和窗口左边界之间的间距;top和bottom表示角色的上边界和下边界与窗口上边界之间的距离。总的来说,,left和right分别显示了角色左边界和右边界与窗口左边界之间的距离;top和bottom显示了角色上下边界与窗口上边界之间的间距。因此,球的右边界可以通过ball对象right获得。想知道球的右边界是否超过了窗口的右边界,需要区分球的right属是否超过窗口的宽度WIDTH,这可以用条件句if来实现,编码相似如下方法:



如果标准创建󿀌那么如何让球回到窗口࿱呢?f;这取决于你的意思。换句话说,,你想如何让球回到窗口,例如,可以让球从窗户的右侧出去,然后再次从窗口左侧跑进;或者当球跑进场景时,让它直接回到窗户的指定位置,等。你可以根据自己的想法要求圆球动作,然后编写代码完成,游戏将忠实地遵循你的想法。其实这叫游戏规则设计,都是游戏制作的主要乐趣,因为这个时候你是创造者󿀌网络游戏世界可能会按照你制定的规则运行。超级成就感?!

02 让球回到窗口





下面考虑这样一个标准,也就是说,当球超过窗口边界时,,让它再次回到窗户的另一边。例如,如果球向右移动,则超过窗口的右边界,使它从窗户的左边界发生。

将update()修改为以下编码:

让我们“翻译”这个代码,表示:首先,将球的横坐标提升到一个单位,如果它的右侧超过了窗口的右边界,然后将其横坐标设置为0。操作看什么效果,你有没有注意到球在窗户里快乐地跑下去?

好了,大家小游戏到此就写实现了,想想你已经知道游戏程序是怎么回事了。是不是觉得很简单?你想自己试试吗?

下面是小游戏的详细源代码。很多,恰好十行编码!

图7 游戏的最终操作结论

(选自󿼌ISBN 978-7-302-54977-2)
标签: 准备好了   游戏