小朋友们好呀~
今天木辛老师少讲一些枯燥的编程理论,咱们一起做一个好玩的游戏吧~
小朋友们有没有玩过弹弹球游戏呢?
视频加载中...
请点击右上角“关注”按钮关注我们哟:跟着木辛老师学习Python编程知识,变身快乐的编程达人吧~
咱们今天呀,就把之前学到的内容都集中起来(包括动画精灵、碰撞检测和事件),制作一个简单的弹弹球游戏。
先来分析一下需求
- 一个来回反弹的球
- 一个打球的球拍
- 一种控制球拍的方法
- 一种记录分数并在窗口上显示分数的方法
- 一种确定有几条“命”的方法—— 你有几次机会
让我们一步步搭建这个游戏吧
python书籍python基础教程教材Python编程从零基础到项目实战实例python入门python语言及其应用程序设计python爬虫python视频教程
¥39.9
购买
需要一个球
我们从网上找了一个足球的图片,权当是一个被弹的球球吧。
我们将在这个游戏中使用动画精灵,所以需要为我们的球建立一个精灵,然后创建一个实例,其中包含__init__()和move()方法。

创建球的实例时,告诉它使用哪个图像、球的速度以及球的起始位置:
ball_speed = 20
ball = MyBall("./ball.png", ball_speed, [50, 50])
还需要把这个球增加到一个组里,以便弯沉球和球拍之间的碰撞检测。可以创建组,同时把球增加到这个组:
group = pygame.sprite.Group(ball)
球拍
对于球拍,我们使用一个简单的矩形。因为我们的画布整体是白色的,所以将这个球拍的颜色设置成黑色。也要为这个球拍建立一个精灵和实例

paddle = MyPaddle([270, 400])
请大家注意,对于球拍,因为我们并没有加载图像文件,只是使用黑色填充了一个矩形,所以我们需要使用Surface.convert()方法将他转换为一个图像。
这个球拍只能左右移动,不能上下移动。我们让球拍的x位置跟着鼠标移动。所以,用户可以用鼠标来控制球拍。
因为这个工作实在事件循环中完成的,所以球拍不需要一个单独的move()方法。
控制球拍
因为我们需要使用鼠标控制球拍,所以要使用MOUSEMOTION事件,这说明只有鼠标在Pygame窗口内移动,球拍就会移动。
由于鼠标在Pygame窗口内时Pygame才能“看到”鼠标,所以球拍会自动限制在边界内。我们将要让球拍的中心跟着鼠标移动。

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的模块用来显示文本,正好我们可以利用这个显示咱们的上述两个信息。
具体步骤应该是这样的:
- 建立一个font对象,告诉Pygame想要的字体样式和大小
- 渲染文本,向字体对象传入一个字符串
- 把这个图像绘制到显示界面
木辛博士说
计算机图形学中,渲染(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,等待几秒后重新开始

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

嗯······· 目前来看,咱们的游戏虽然比较简单,但是也很完善了,麻雀虽小五脏俱全嘛!
最后咱们还需要在完善一下,最后再加一点。
游戏结束
当玩家丢掉最后一条命的时候要显示一个“游戏结束”的消息。
我们需要建立两个字体对象,分表包含我们的消息和玩家的最后分数,渲染这两个文本,再讲其绘制出来。
另外,还需要避免在最后一局之后再出现球。为了做到这一点,我们需要建立一个done变量,这个变量控制游戏的结束。
咱们只需要在while循环中添加如下代码即可。

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




好了,我们今天的游戏时间就到这里了,小朋友们玩的开心吗?
小朋友们不要忘记关注我们哟 ,下期课程更精彩,请大家一起期待吧~
快乐编程,快乐成长,咱们下次课再见!