状态变量
本课属于 Coddy Pygame 学习旅程的“游戏规则”单元。第 1 课,共 30 课。
现在,一旦发生碰撞,窗口就会关闭。游戏应该停止,并显示发生了什么。程序需要记住游戏当前处于哪个阶段:进行中,还是已结束。
用一个变量来记录这个阶段,也就是状态,并用一个简短的字符串表示:
state = "play"
...
if state == "play":
# 移动玩家和石头
if rock.colliderect(player):
state = "over"只有 if state == "play": 下的代码会移动物体,所以状态变成 "over" 时,所有物体都会停下来。循环会继续运行:程序仍会读取事件、绘制画面并更新时钟,因此窗口会保持打开,并可以显示一条消息。
在代码中使用字符串更容易读懂。像 state == "over" 这样的测试表达式能清楚地说明含义,后续的课也会用同样的方式添加更多状态。
挑战
简单让碰撞停止游戏并显示 Game over。
- 在循环之前,添加
state = "play"。 - 将按键、玩家和岩石的代码放在
if state == "play":下。 - 发生碰撞时,将
state设为"over",而不是running = False。 - 显示分数后,当
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 在线编辑器