木辛老师带你玩转编程 (python弹珠游戏教学)

小朋友们好呀~

今天木辛老师少讲一些枯燥的编程理论,咱们一起做一个好玩的游戏吧~

小朋友们有没有玩过弹弹球游戏呢?

视频加载中...

请点击右上角“关注”按钮关注我们哟:跟着木辛老师学习Python编程知识,变身快乐的编程达人吧~

咱们今天呀,就把之前学到的内容都集中起来(包括动画精灵、碰撞检测和事件),制作一个简单的弹弹球游戏。

先来分析一下需求

  1. 一个来回反弹的球
  2. 一个打球的球拍
  3. 一种控制球拍的方法
  4. 一种记录分数并在窗口上显示分数的方法
  5. 一种确定有几条“命”的方法—— 你有几次机会

让我们一步步搭建这个游戏吧

python书籍python基础教程教材Python编程从零基础到项目实战实例python入门python语言及其应用程序设计python爬虫python视频教程

¥39.9

购买

需要一个球

我们从网上找了一个足球的图片,权当是一个被弹的球球吧。

我们将在这个游戏中使用动画精灵,所以需要为我们的球建立一个精灵,然后创建一个实例,其中包含__init__()和move()方法。

python弹珠游戏教学,如何用python编写弹球小游戏

创建球的实例时,告诉它使用哪个图像、球的速度以及球的起始位置:

ball_speed = 20
ball = MyBall("./ball.png", ball_speed, [50, 50])

还需要把这个球增加到一个组里,以便弯沉球和球拍之间的碰撞检测。可以创建组,同时把球增加到这个组:

group = pygame.sprite.Group(ball)

球拍

对于球拍,我们使用一个简单的矩形。因为我们的画布整体是白色的,所以将这个球拍的颜色设置成黑色。也要为这个球拍建立一个精灵和实例

python弹珠游戏教学,如何用python编写弹球小游戏

paddle = MyPaddle([270, 400])

请大家注意,对于球拍,因为我们并没有加载图像文件,只是使用黑色填充了一个矩形,所以我们需要使用Surface.convert()方法将他转换为一个图像。

这个球拍只能左右移动,不能上下移动。我们让球拍的x位置跟着鼠标移动。所以,用户可以用鼠标来控制球拍。

因为这个工作实在事件循环中完成的,所以球拍不需要一个单独的move()方法。

控制球拍

因为我们需要使用鼠标控制球拍,所以要使用MOUSEMOTION事件,这说明只有鼠标在Pygame窗口内移动,球拍就会移动。

由于鼠标在Pygame窗口内时Pygame才能“看到”鼠标,所以球拍会自动限制在边界内。我们将要让球拍的中心跟着鼠标移动。

python弹珠游戏教学,如何用python编写弹球小游戏

event.pos是一个列表,包含了鼠标位置的[x, y]的值。

所以event.pos[0]会提供鼠标移动时的x位置。当然了,如果鼠标在左边界或者右边界,球拍会有一半在窗口之外。

还需要最后一点:球和球拍的碰撞检测。我们就是利用这种“碰撞”才能用球拍“打”球。出现碰撞时,只需要让球的y速度反向即可。代码可以这么写:

if pygame.sprite.spritecollide(paddle, group, False):
 ball.speed[1] = -ball.speed[1]

还要记住每次循环的时候要重绘背景。

嗯嗯,我们的程序写的差不多了,咱们运行下看看效果吧~

也许吧,咱们这个游戏还很简单,没有多大意思;

嗯······

那我们再往里边加些元素吧!

增加分数

其实我们在玩游戏的时候,比较关注两个地方:还有几条命、一共得了多少分。

在咱们这个游戏里,我们简单的处理一下:只要每次球碰到窗口顶边我们就给1分。每个游戏玩家可以玩三次(也就是说有3条“命”)。

在Pygame中提供了一个名为font的模块用来显示文本,正好我们可以利用这个显示咱们的上述两个信息。

具体步骤应该是这样的:

  1. 建立一个font对象,告诉Pygame想要的字体样式和大小
  2. 渲染文本,向字体对象传入一个字符串
  3. 把这个图像绘制到显示界面

木辛博士说

计算机图形学中,渲染(render)是指绘制某个东西,或者让它可见。

我们的代码可以这么写:

points = 0
font = pygame.font.Font(None, 50)
score_text = font.render(str(points), 1, (0, 0, 0))
text_pos = [10, 10]

第一行中的第一个参数(这里是None)可以告诉Pygame我们使用什么字体。通过None这个常量,我们要求Pygame使用一个系统默认字体。

然后,在事件循环内部,我们需要写如下代码:

screen.blit(score_text, text_pos)

这样每次循环都会重绘分数文本。

当球碰到窗口的顶边时,我们增加分数:+1分

跟踪还有几条命

现在让我们看看最后一个需求:游戏玩家还剩几次游戏机会。

目前来看,如果漏了球,他会从窗口底边掉下去,再也看不到了。我们希望玩家只有3次机会,所以接下来我们会增加一个lives变量,用来控制游戏剩余次数

lives = 3

玩家漏了球而且球调到了窗口底边之后,我们要将lives减去1,等待几秒后重新开始

python弹珠游戏教学,如何用python编写弹球小游戏

我们增加了计算游戏剩余次数的逻辑,但是对于玩家来说并不是很直观;那么我们仿照通常游戏那样,在桌面的某个地方显示一下剩余的游戏机会吧

python弹珠游戏教学,如何用python编写弹球小游戏

嗯······· 目前来看,咱们的游戏虽然比较简单,但是也很完善了,麻雀虽小五脏俱全嘛!

最后咱们还需要在完善一下,最后再加一点。

游戏结束

当玩家丢掉最后一条命的时候要显示一个“游戏结束”的消息。

我们需要建立两个字体对象,分表包含我们的消息和玩家的最后分数,渲染这两个文本,再讲其绘制出来。

另外,还需要避免在最后一局之后再出现球。为了做到这一点,我们需要建立一个done变量,这个变量控制游戏的结束。

咱们只需要在while循环中添加如下代码即可。

python弹珠游戏教学,如何用python编写弹球小游戏

在最后呢,我们附上完整的代码

python弹珠游戏教学,如何用python编写弹球小游戏

python弹珠游戏教学,如何用python编写弹球小游戏

python弹珠游戏教学,如何用python编写弹球小游戏

python弹珠游戏教学,如何用python编写弹球小游戏

好了,我们今天的游戏时间就到这里了,小朋友们玩的开心吗?

小朋友们不要忘记关注我们哟 ,下期课程更精彩,请大家一起期待吧~

快乐编程,快乐成长,咱们下次课再见!