pygame游戏_Pygame游戏——Pong游戏(五)

8faf7335407e18d8e497b7e006dfa408.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

动手尝试一下吧,这样游戏基本已经完善的差不多了,后面我们还可以为游戏添加背景音乐,以及挡板和笑脸碰撞的音效,尽情期待吧!

谢谢大家的关注,有不足的地方欢迎指正!

更多内容可以关注微信公众号【陪孩子一起学编程】

http://weixin.qq.com/r/hymfhyjEF3VorWzk93yV (二维码自动识别)

Pygame游戏制作——Pong游戏

陪孩子一起学编程:Pygame游戏——Pong游戏(一)​zhuanlan.zhihu.com
2fdc405ad4e5a49a900722f07963eae5.png
陪孩子一起学编程:Pygame游戏——Pong游戏(二)​zhuanlan.zhihu.com
726000a00011545e05499a0be66b22b3.png
陪孩子一起学编程:Pygame游戏——Pong游戏(三)​zhuanlan.zhihu.com
bea00be525ed1201e63191ecabfa4d03.png
陪孩子一起学编程:Pygame游戏——Pong游戏(四)​zhuanlan.zhihu.com
9cc7672dd5592b82682ae23ccb570b18.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值