Menu
CoddyTech

状态变量

本课属于 Coddy Pygame 学习旅程的“游戏规则”单元。第 1 课,共 30 课。

现在,一旦发生碰撞,窗口就会关闭。游戏应该停止,并显示发生了什么。程序需要记住游戏当前处于哪个阶段:进行中,还是已结束。

用一个变量来记录这个阶段,也就是状态,并用一个简短的字符串表示:

state = "play"
...
if state == "play":
    # 移动玩家和石头
    if rock.colliderect(player):
        state = "over"

只有 if state == "play": 下的代码会移动物体,所以状态变成 "over" 时,所有物体都会停下来。循环会继续运行:程序仍会读取事件、绘制画面并更新时钟,因此窗口会保持打开,并可以显示一条消息。

在代码中使用字符串更容易读懂。像 state == "over" 这样的测试表达式能清楚地说明含义,后续的课也会用同样的方式添加更多状态。

challenge icon

挑战

简单

让碰撞停止游戏并显示 Game over。

  1. 在循环之前,添加 state = "play"。
  2. 将按键、玩家和岩石的代码放在 if state == "play": 下。
  3. 发生碰撞时,将 state 设为 "over",而不是 running = False。
  4. 显示分数后,当 state == "over" 时,在 (240, 160) 处居中显示 Game over。

按“开始”,站在岩石下方:游戏会在 Game over 时停止。然后按“检查”。

亲手试试

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 6
    if keys[pygame.K_RIGHT]:
        player.x += 6
    player.clamp_ip(screen.get_rect())

    rock.y += 4
    if rock.top > 360:
        rock.y = -24
        rock.x = random.randint(0, 456)
        score += 1
    if rock.colliderect(player):
        running = False

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (255, 196, 0), player)
    pygame.draw.rect(screen, (235, 80, 80), rock)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

游戏规则中的所有课

自己练习: Pygame 在线编辑器