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 更改背景颜色后的程序窗口
现在我们有一个程序窗口,但它似乎是空的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;是时候让它动起来了。

操作程序,你会发现球慢慢地向右移动。真是太棒了!但是这到底是怎么回事?本来只写一行代码,在之前,圆球的x座标应该只提升一个单位c;他怎么能一直向右移动?
呵呵,这就是游戏循环的魔力!
02 游戏循环
什么是游戏循环?假如你有一点编程经验,你一定写过循环程序。循环程序,符合特定条件的程序,一些操作反复进行。循环程序,符合特定条件的程序,反复执行一些操作。游戏循环也是类似的原理,将王者操作的编程代码放在一个循环语句中,自动重复执行。那么游戏循环的实施条件是什么呢?在循环体中应该执行什么样的句子?
让我们来看看游戏循环的标准。想想你玩游戏的经历,当你玩游戏时,如果你积极选择退出否则,你将永远在游戏中。不是吗??从程序角度来看,,从你开始玩游戏的那一刻开始,你已经在游戏循环中了,而且一直都在其中。因此,无条件实施游戏循环,本质上是一个死循环!天啊,没错。老师可以在编程课上强调,在编写循环程序时,应检查循环标准,不要写成死循环,出乎意料的是,游戏程序竟然是一个死循环。是的,游戏是一个死循环,或者称为连续循环。

能看到为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;一是检查球是否来到场景外;第二,让球再次回到场景中。
如果你想知道球是否跑到场景之外,我们可以将其位置与窗口进行比较,例如,如果球的右边界超过窗口的右边界,可以判断球将从右侧跑出场景。那么如何用程序来表达这个意思?
目前,我们只知道小球的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来实现,编码相似如下方法:
02 让球回到窗口
下面考虑这样一个标准,也就是说,当球超过窗口边界时,,让它再次回到窗户的另一边。例如,如果球向右移动,则超过窗口的右边界,使它从窗户的左边界发生。

好了,大家小游戏到此就写实现了,想想你已经知道游戏程序是怎么回事了。是不是觉得很简单?你想自己试试吗?
下面是小游戏的详细源代码。很多,恰好十行编码!

(选自ISBN 978-7-302-54977-2)