美文网首页pygame游戏编程
用pygame开发自己的游戏-8.增加生命值功能

用pygame开发自己的游戏-8.增加生命值功能

作者: 象骑士Hack | 来源:发表于2019-12-08 06:47 被阅读0次

    一、引言

    前面的游戏中红色方块一旦出界一次,我们就认为游戏结束。为使游戏更好玩,我们增加生命值功能,每个玩家每句游戏有三个生命值,每次红色方块出界一次,就扣一个生命值,当生命值为零时,游戏失败。

    二、实现思路

    这个功能相对比较简单。当游戏中有某项数值会变化,我们就要想到用变量来存储,这是编程的基本思路。很明显生命值就是会变化的数字,我们用life_times来保存,初始值为3,每次红色方块出界减1,当life_times为0时,游戏结束。
    实现代码为:

    import pygame, sys
    import random
    # 初始化
    pygame.init()
    SCREEN = pygame.display.set_mode((400, 300))
    pygame.display.set_caption('Hello World!')
    
    # 绿色方块固定在最下方,左右移动,y值不变
    green_x = 110
    # 红色方块从上往下移动,x值不变
    red_y = 0
    # 游戏主循环
    score = 0
    pygame.font.init()
    myfont = pygame.font.Font(None,60)
    red_x = 35
    life_times, is_over = 3, False
    while True: 
        for event in pygame.event.get():
            # 处理退出事件
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 键盘按下事件
            elif event.type == pygame.KEYDOWN:
                # 'a'键被按下
                if event.key == pygame.K_a:
                    green_x -= 5
                elif event.key == pygame.K_d:
                    green_x += 5
        red_y += 5
        green_rect = pygame.Rect(green_x, 250, 100, 50)
        if green_rect.colliderect(red_x, red_y, 20, 50):
            print('红色方块与绿色方块碰撞到了')
            # 为了方便看到碰撞结果,直接break返回
            score += 1
            red_y = 0
            red_x = random.randint(50, 350)
        if red_y >= 300:
            life_times -= 1
            if life_times <= 0:
                is_over = True
            red_y = 0
            red_x = random.randint(50, 350)
            
        SCREEN.fill((255, 255, 255))
        # 调用 pygame.display.update() 方法更新整个屏幕的显示
        pygame.draw.rect(SCREEN, (255, 0, 0), (red_x, red_y, 20, 50))
        pygame.draw.rect(SCREEN, (0, 255, 0), (green_x, 250, 100, 50))
        textImage = myfont.render("score: " + str(score), True, (0, 0, 255))
        SCREEN.blit(textImage, (10,10))
        if is_over:
            gameOverTextImage = myfont.render('GAME OVER!', True, (255, 0, 0))
            SCREEN.blit(gameOverTextImage, (80,150))
        pygame.display.update()
        pygame.time.delay(50)
    

    上述代码实现生命值功能,为了方便用户看到生命值的变化,我们在右上角显示生命值功能,这部分的功能可以参考
    用pygame开发自己的游戏-5.增加分数功能来实现。
    实现代码为:

    import pygame, sys
    import random
    # 初始化
    pygame.init()
    SCREEN = pygame.display.set_mode((400, 300))
    pygame.display.set_caption('Hello World!')
    
    # 绿色方块固定在最下方,左右移动,y值不变
    green_x = 110
    # 红色方块从上往下移动,x值不变
    red_y = 0
    # 游戏主循环
    score = 0
    pygame.font.init()
    myfont = pygame.font.Font(None,60)
    red_x = 35
    life_times, is_over = 3, False
    while True: 
        for event in pygame.event.get():
            # 处理退出事件
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 键盘按下事件
            elif event.type == pygame.KEYDOWN:
                # 'a'键被按下
                if event.key == pygame.K_a:
                    green_x -= 5
                elif event.key == pygame.K_d:
                    green_x += 5
        red_y += 5
        green_rect = pygame.Rect(green_x, 250, 100, 50)
        if green_rect.colliderect(red_x, red_y, 20, 50):
            print('红色方块与绿色方块碰撞到了')
            # 为了方便看到碰撞结果,直接break返回
            score += 1
            red_y = 0
            red_x = random.randint(50, 350)
        if red_y >= 300:
            life_times -= 1
            if life_times <= 0:
                is_over = True
            red_y = 0
            red_x = random.randint(50, 350)
            
        SCREEN.fill((255, 255, 255))
        # 调用 pygame.display.update() 方法更新整个屏幕的显示
        pygame.draw.rect(SCREEN, (255, 0, 0), (red_x, red_y, 20, 50))
        pygame.draw.rect(SCREEN, (0, 255, 0), (green_x, 250, 100, 50))
        textImage = myfont.render("score: " + str(score), True, (0, 0, 255))
        SCREEN.blit(textImage, (10,10))
        lifeTextImage = myfont.render("life: " + str(life_times), True, (0, 255, 0))
        SCREEN.blit(lifeTextImage, (250,10))
        if is_over:
            gameOverTextImage = myfont.render('GAME OVER!', True, (255, 0, 0))
            SCREEN.blit(gameOverTextImage, (80,150))
        pygame.display.update()
        pygame.time.delay(50)
    

    三、思考题

    目前游戏的结束时,红色方块会继续生成下降,life_times甚至会成为负数,这明显有问题,请思考下如何解决这个问题。

    提示:哪里是游戏结束的相关代码,哪里是重新生成红色方块的代码。

    相关文章

      网友评论

        本文标题:用pygame开发自己的游戏-8.增加生命值功能

        本文链接:https://www.haomeiwen.com/subject/xpuugctx.html