![8faf7335407e18d8e497b7e006dfa408.png](https://i-blog.csdnimg.cn/blog_migrate/cf180d6828cac1b141a2b7d9cdb3c356.png)
我们在游戏开始给了玩家5次机会,但是我们发现,即使玩家5次生命都用完了,游戏还不会结束,显然这是不符合游戏逻辑的。
这次我们要设置游戏结束,当玩家剩下的命没有的时候,游戏结束;游戏结束之后,如果玩家还想在玩一局,我们设置按下F1重新开始游戏。
游戏结束
当玩家丢掉最后一条命的时候,游戏就要停止了,不过我们不是关闭游戏,我们只需要让笑脸停止运动,并在屏幕中央显示一段文字,告诉玩家游戏已经结束,以及玩家在游戏过程中获得的分数,并提示玩家如何重新开启游戏。
# 游戏结束
if lives < 1:
speedx = speedy = 0 # 笑脸速度为0,便不会运动了
lives = 0
gv_str = "游戏结束,你的得分是:" + str(points)
gv_str += " 。按F1键继续游戏!!"
gv_text = font.render(gv_str,True,(255,0,0))
gv_text_rect = gv_text.get_rect()
gv_text_rect.center = screen.get_rect().center # 屏幕中央
screen.blit(gv_text,gv_text_rect)
if语句判断玩家是否丢掉了最后一条命,如果是,将笑脸的水平速度和竖直速度都设置为0,这样笑脸就停止了运动。
然后是一段显示玩家得分,以及提示玩家游戏结束和如何重新开启的游戏的提示文本,这个和之前的文本设置类似,不再重复解释说明。
再来一次
我们设置如果玩家在游戏结束之后,按下了键盘上的“F1”按键,那么我们的游戏会重新运行,这样之前的值就需要重新设置。
points = 0
lives = 5
pic_x = 0
pic_y = 0
speedx = speedy = 5
重新将笑脸的位置设置从(0,0)开始,速度还是5,玩家的生命值还是有5次生命,游戏得分需要清零。
这些变量都是在玩家按下了“F1”键之后才设置的:
if event.type == KEYDOWN: # 重新开始游戏
if event.key == K_F1 and lives == 0:
这里的事件,我们前面也讲过,玩家触发了“F1”按键,程序将会被执行。不过我们又添加了一个附加条件,并不是在任何时候玩家都可以通过“F1”重启游戏。
只有在玩家丢掉最后一条命之后,才可以通过按下“F1”按键重新开启游戏。
if event.type == KEYDOWN: # 重新开始游戏
if event.key == K_F1 and lives == 0:
points = 0
lives = 5
pic_x = 0
pic_y = 0
speedx = speedy = 5
来点挑战
加快速度
我们修改speedx和speedy的值,让速度变得越来越快,以便笑脸在每一帧的每一个方向上都移动的更远一些。
1、笑脸从屏幕的左边或右边水平地弹开的时候
我们改变笑脸水平方向的速度speedx,将速度增加10%。
if pic_x <= 0 or pic_x + pic.get_width() >= 800:
speedx = - speedx * 1.1 # 加快速度
2、竖直方向的速度
当笑脸从屏幕顶端弹开的时候:
if pic_y <= 0:
此时,笑脸朝下,速度为正,朝着y轴的正方向移动。使用负号改变移动方向之后,然后使速度加1,即speedy+1。
if pic_y <= 0:
speedy = -speedy + 1
3、当玩家丢掉一条命之后,我们需要重新恢复原来的速度,这样使得游戏更具有可玩性。
if pic_y >= 600 - pic.get_height():
lives -= 1 # 减少一条命
speedy = -5
speedx = 5
玩家丢掉一条命,即笑脸触碰到了屏幕的底部,水平方向的速度直接设置为5即可,竖直方向要考虑方向,使用负号“-”表示,改变笑脸的移动方向,要向上移动(弹起)。
4、“惯性”问题
随着游戏的进行,笑脸移动的速度会越来越快,以至于笑脸掉落在屏幕底部以外,这样导致在一次从屏幕底部边界的弹回过程中,就会丢失掉所有剩下的命。
这是由于笑脸移动的太快,在触碰到屏幕边界的时候,直接穿到屏幕的下边界以下,然后在屏幕下边界之下还在移动,即使我们重新设置了速度,也没有办法使笑脸在下一帧就完全回到屏幕上。
所以,我们需要通过代码控制笑脸的pic_y的值,使得笑脸处于屏幕下边界以上。这样无论笑脸碰撞下边界的速度有多快,都可以安全的回到屏幕之上。
pic_y = 600 - pic.get_height() -1
加快速度的完整代码:
# 墙壁碰撞检测
if pic_x <= 0 or pic_x + pic.get_width() >= 800:
speedx = - speedx * 1.1 # 加快速度
if pic_y <= 0:
speedy = -speedy + 1
if pic_y >= 600 - pic.get_height():
lives -= 1 # 减少一条命
speedy = -5
speedx = 5
pic_y = 600 - pic.get_height() -1
完整代码:
import pygame # 导入模块
from pygame.locals import *
pygame.init() # 初始化模块
screen = pygame.display.set_mode((800,600)) # 创建一个Surface对象窗口
pygame.display.set_caption("Pong游戏") # 设置标题
keep_going = True # 循环标志
BLACK = (0,0,0)
clock = pygame.time.Clock()
# 挡板
WHITE = (255,255,255)
paddle_width = 200 # 挡板宽度
paddle_height = 25 # 挡板高度
paddle_x = 300 # 挡板left属性
paddle_y = 550 # 挡板top属性
# 笑脸图片
pic = pygame.image.load("Smile.bmp").convert_alpha()
colorkey = pic.get_at((0,0))
pic.set_colorkey(colorkey)
# 速度和位置
speedx = 5
speedy = 5
pic_x = 0
pic_y = 0
# 得分和生命值
points = 0
lives = 5
# 从系统字库创建一个Font对象
font = pygame.font.SysFont("simhei",24)
while keep_going:
for event in pygame.event.get():
if event.type == QUIT:
keep_going = False
if event.type == KEYDOWN: # 重新开始游戏
if event.key == K_F1 and lives == 0:
points = 0
lives = 5
pic_x = 0
pic_y = 0
speedx = speedy = 5
pic_x += speedx
pic_y += speedy
# 墙壁碰撞检测
if pic_x <= 0 or pic_x + pic.get_width() >= 800:
speedx = - speedx * 1.1 # 加快速度
if pic_y <= 0:
speedy = -speedy + 1
if pic_y >= 600 - pic.get_height():
lives -= 1 # 减少一条命
speedy = -5
speedx = 5
pic_y = 600 - pic.get_height() -1
screen.fill(BLACK) # 填充背景
# 绘制挡板
paddle_x = pygame.mouse.get_pos()[0]
paddle_x -= paddle_width/2
pygame.draw.rect(screen,WHITE,(paddle_x,paddle_y,paddle_width,paddle_height))
# 绘制笑脸图片
screen.blit(pic,(pic_x,pic_y))
# 笑脸和挡板碰撞检测,得分加1
if pic_y + pic.get_height() >= paddle_y and pic_y + pic.get_height() <=
paddle_y + paddle_height and speedy > 0:
if pic_x + pic.get_width()/2 >= paddle_x and pic_x + pic.get_width()/2
<= paddle_x + paddle_width:
points += 1
speedy = -speedy
# 游戏结束
if lives < 1:
speedx = speedy = 0 # 笑脸速度为0,便不会运动了
lives = 0
gv_str = "游戏结束,你的得分是:" + str(points)
gv_str += " 。按F1键继续游戏!!"
gv_text = font.render(gv_str,True,(255,0,0))
gv_text_rect = gv_text.get_rect()
gv_text_rect.center = screen.get_rect().center # 屏幕中央
screen.blit(gv_text,gv_text_rect)
# 显示文本字符串
draw_text ="生命值:" + str(lives) + " 得分: " + str(points)
text = font.render(draw_text,True,WHITE)
text_rect = text.get_rect()
text_rect.centerx = screen.get_rect().centerx # 水平居中
text_rect.y = 10
screen.blit(text,text_rect)
pygame.display.flip()
clock.tick(60) # 设置帧速率
pygame.quit()
![da7a7160442635cc5a2f56098689f457.gif](https://i-blog.csdnimg.cn/blog_migrate/1af6788a3ff536acfc5b6494b339b88d.gif)
动手尝试一下吧,这样游戏基本已经完善的差不多了,后面我们还可以为游戏添加背景音乐,以及挡板和笑脸碰撞的音效,尽情期待吧!
谢谢大家的关注,有不足的地方欢迎指正!
更多内容可以关注微信公众号【陪孩子一起学编程】
http://weixin.qq.com/r/hymfhyjEF3VorWzk93yV (二维码自动识别)
Pygame游戏制作——Pong游戏
陪孩子一起学编程:Pygame游戏——Pong游戏(一)zhuanlan.zhihu.com![2fdc405ad4e5a49a900722f07963eae5.png](https://i-blog.csdnimg.cn/blog_migrate/847a6ca8931bd64e86d11d495d8b75a4.png)
![726000a00011545e05499a0be66b22b3.png](https://i-blog.csdnimg.cn/blog_migrate/44090a51a2568803b93ddb82571d50af.png)
![bea00be525ed1201e63191ecabfa4d03.png](https://i-blog.csdnimg.cn/blog_migrate/7abc98b35a2a77ed27d50678f062f14b.png)
![9cc7672dd5592b82682ae23ccb570b18.png](https://i-blog.csdnimg.cn/blog_migrate/728bf8a43a1aef5af3b1774522668c99.png)