通过构建一个交互式游戏来教小孩学习Python

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

开源工具可以帮助任何人以一种简单而有趣的方式开始学习Python,那就是制作游戏。


001.png


Python已经赢得了最佳初学者编程语言的美誉。但是我们要从哪里开始呢?


我最喜欢的让人们对编程感兴趣的方法之一就是写游戏。


 PursuedPyBear(ppb)是一个为教学而优化的游戏编程库,我最近用它来教我的孩子们更多关于我最喜欢的编程语言的知识。


Jupyter项目是一个基于浏览器的Python控制台,最初是为数据科学家处理数据而设计的。


我有一个专门设计来教你如何制作一个简单的互动游戏的Jupyter Notebook,你可以从这里下载。为了打开该文件,你需要安装最新的Jupyter项目——JupyterLab。


先决条件:


  • 运行Python的最新版本(关于Linux、Mac和Windows的说明)

  • 运行Git的最新版本(这里有说明)


我们将简要地配置一个虚拟环境,为我们所需的库创建一个单独的空间。(你可以在这里了解更多关于虚拟环境如何工作的信息。)


001.png


最后一条命令应该会在你的默认浏览器中以地址http://localhost:8888/lab打开JupyterLab。在左边的列中选择dynamic_penguin.ipynb文件,然后我们就可以开始了!


001.png


将会运行该游戏的事件循环

Jupyter在内部运行一个事件循环,该循环是一个管理后续异步操作运行的进程。在Jupyter中这个事件循环是asyncio,并且PursuedPyBear也运行了自己的事件循环。


我们可以使用另一个库Twisted来集成这两者,就像胶水一样。这听起来很复杂,但谢天谢地,这种复杂性隐藏在库之后,它将为我们完成所有艰苦的工作。


Jupyter中下面的单元格将负责处理集成Twisted与asyncio事件循环的前半部分。


要集成PursuedPyBear 与 Jupyter,__file__ = None 是必需的。


001.png


接下来,我们需要一个“setup”函数。setup函数是一个常见的术语,用于配置关键的游戏元素。但是,我们的函数将只把游戏“场景”放在一个全局变量中。你可以把它想象成我们定义了要在上面玩游戏的桌子。

Jupyter Notebook中下面的单元格将完成该操作。


002.png


现在,我们需要将PursuedPyBear的事件循环与Twisted集成。我们使用txppb模块来实现:


003.png


如果游戏因为错误而崩溃,最后的print将会帮助我们——它将打印出对Jupyter输出的回溯。


这将显示一个空窗口,为游戏元素做好准备。


001.gif


这就是我们开始利用Jupyter的地方——传统上,在我们开始玩之前我们需要编写完整个游戏。然而,我们打破惯例,立即开始玩游戏!


通过交互使游戏变得有趣

不过,这并不是一个很有趣的游戏。它什么都没有,只是呆在那里。如果我们想要一些东西,我们最好加上它。


在电子游戏编程中,在屏幕上移动的东西被称为“小精灵”。在PursuedPyBear中,小精灵是由类来表示的。小精灵会自动使用与类同名的图像。我从Kenney上获得了一个小企鹅的图像,Kenny是一个免费和开源的电子游戏资源的集合。


001.jpg


现在我们把企鹅放在正中间。


002.png

003.png


它认真地坐在中间。这比什么都没有要有趣一点。那很好——这正是我们想要的。在渐进式游戏开发中,每一步都应该更加有趣一点。


使用ppb向我们的企鹅游戏中添加运动

但企鹅按道理来说不应该一直坐着不动!企鹅应该四处走动。我们将让玩家通过箭头键控制企鹅。首先,我们将这些键映射为向量:


001.png


现在我们将使用一个实用程序库。set_in_class函数用来设置类中的方法。Python在类中回溯性地添加函数的能力确实派上了用场!


002.png


set_in_class的代码并不长,但它使用了一些复杂的Python技巧。我们将把完整的实用程序库放在本文的最后以供回顾,出于工作流的考虑,我们暂时跳过它。


回到企鹅身上!


嗯,好。


企鹅正在努力地移动...以零速度,确切地说,哪里都没去。让我们手动设置方向,看看会发生什么。


003.png


001.gif


方向是向上的,但有点慢。这样我们就有足够的时间手动将企鹅的方向设置为零。我们现在就开始吧!


001.jpg


向我们的企鹅游戏添加互动性

唷,那很刺激——但不是我们想要的。我们希望企鹅能对按键作出响应。通过代码控制它就是玩家们所说的“作弊”。


让我们设置它来设置按键的方向,并在释放键时返回到0。


002.jpg


001.gif


企鹅有点无聊了,不是吗?也许我们应该给它一个橙色的球玩。


001.png


同样,我确保有一个名为orangeball.png的图像。现在让我们把这个球放在屏幕的左边。


002.png


001.gif


不管企鹅怎么努力,它都踢不到球。当企鹅靠近时,我们让球远离它。


首先,让我们定义一下“踢”球的意思。踢这个球意味着决定它在一秒内的位置,然后将它的状态设置为“移动”。


首先,我们通过让第一个更新将它移动到目标位置来移动它。


001.png


现在,我们来踢球!


002.jpg


但这只是传送了球;它立即改变了位置。在现实生活中,球会在中间点之间运动。当它移动时,它会在它的位置和它要去的位置之间插入。


我们会天真地使用线性插值。但是一个很酷的电子游戏技巧是使用“easing”函数。在这里,我们使用常见的“smooth step”。


001.png


现在,让我们再次尝试踢这个球。


002.png


001.gif


但实际上,应该是企鹅来踢球。当球发现自己与企鹅相撞时,它会朝相反的方向踢自己。如果企鹅正好在球的上方,球就会随机选择一个方向。


更新函数现在会调用maybe_move,并且只在我们现在没有移动的情况下检查碰撞。


001.png

001.gif


但仅仅来回踢球并没有那么有意思。让我们添加一个目标。


001.jpg


让我们将目标放置在屏幕的右边。


002.jpg


001.gif


奖励我们的企鹅

现在,当企鹅把球踢进目标时,我们将会给它一个奖励。来条鱼怎么样?


001.png


当目标得到球时,它应该移除这个球并在屏幕的另一端创建一个新球。然后,它会导致一条鱼出现。


002.jpg


001.gif


我们想让这个企鹅吃鱼。当鱼看到企鹅时,它应该会消失。


001.png


完美运行!


迭代游戏设计对企鹅和人来说一样是有趣的!


这具备了一个游戏的所有设计过程:玩家控制的企鹅把球踢进目标,得到一条鱼,吃掉鱼,然后踢一个新球。这将是游戏中一个“艰难的关卡”,或者我们可以添加一些障碍物来让企鹅的生活更加艰难一些。


无论你是一个有经验的程序员,还是一个刚入门的新手,电子游戏编程都是很有趣的。PursuedPyBear与Jupyter为我们带来了具有经典环境(如Logo和SmallTalk)的交互式编程能力的经典2D游戏的所有的乐趣。是时候享受一点80年代的复古风了!


附录

这里是我们的实用程序库的完整源代码。它提供了一些有趣的概念来使这个游戏键盘运行。更多关于它是如何做到这一点的信息,请阅读碰撞检测、setattr以及__name__属性。


001.png

英文原文:https://opensource.com/article/20/5/python-games
译者:好酒不上头