Python 启蒙 · Day 9

倒计时:让游戏变紧张

在收集宝石游戏上加一个 30 秒倒计时。孩子要感受到“快快快”,再理解代码怎么做到。

课堂流程(45 分钟)

01

复习宝石游戏

先问:上节课怎么得分?游戏能一直玩吗?

02

制造问题

让孩子发现:如果没有时间限制,就不够紧张。

03

演示限时版

老师运行 30 秒倒计时版本,先让孩子看到目标。

04

加入时间变量

time_left 表示还剩多少秒,game_over 是结束开关。

05

显示时间

把分数和时间写到屏幕上。

06

让时间自己减少

用 ontimer:1 秒后再叫 update_time 一次。

07

时间到就停止

game_over 变成 True 后,方向键不再移动。

教师话术(照着说就行)

"上节课游戏可以一直玩。今天我们让它变成限时挑战。"

"time_left 就是还剩多少时间。"

"ontimer 可以先简单理解成:过一会儿,再叫这个函数一次。"

"game_over 是游戏结束开关。开关打开以后,角色不能再动。"

分步加入倒计时

第一步:时间和结束开关

python
time_left = 30
game_over = False

第二步:显示分数和时间

python
def show_info():
    pen.clear()
    pen.goto(-310, 210)
    pen.write(f"分数: {score}  时间: {time_left}", font=("Arial", 16, "bold"))

第三步:让时间自己走

python
def update_time():
    global time_left, game_over
 
    if time_left > 0:
        time_left = time_left - 1
        show_info()
        screen.ontimer(update_time, 1000)
    else:
        game_over = True
        pen.goto(0, 0)
        pen.write("Game Over", align="center", font=("Arial", 36, "bold"))

完整课堂代码

python
import turtle
import random
 
screen = turtle.Screen()
screen.title("第 9 课:限时收集宝石")
screen.setup(700, 500)
 
player = turtle.Turtle()
player.shape("turtle")
player.color("green")
player.penup()
player.goto(0, 0)
 
gem = turtle.Turtle()
gem.shape("circle")
gem.color("gold")
gem.penup()
 
score = 0
time_left = 30
game_over = False
step = 20
 
pen = turtle.Turtle()
pen.hideturtle()
pen.penup()
 
def move_gem():
    gem.goto(random.randint(-250, 250), random.randint(-180, 180))
 
def show_info():
    pen.clear()
    pen.goto(-310, 210)
    pen.write(f"分数: {score}  时间: {time_left}", font=("Arial", 16, "bold"))
 
def update_time():
    global time_left, game_over
 
    if time_left > 0:
        time_left = time_left - 1
        show_info()
        screen.ontimer(update_time, 1000)
    else:
        game_over = True
        pen.goto(0, 0)
        pen.write("Game Over", align="center", font=("Arial", 36, "bold"))
 
def check_gem():
    global score
    if not game_over and player.distance(gem) < 25:
        score = score + 1
        move_gem()
        show_info()
 
def move_up():
    if not game_over:
        player.sety(player.ycor() + step)
        check_gem()
 
def move_down():
    if not game_over:
        player.sety(player.ycor() - step)
        check_gem()
 
def move_left():
    if not game_over:
        player.setx(player.xcor() - step)
        check_gem()
 
def move_right():
    if not game_over:
        player.setx(player.xcor() + step)
        check_gem()
 
move_gem()
show_info()
update_time()
 
screen.listen()
screen.onkey(move_up, "Up")
screen.onkey(move_down, "Down")
screen.onkey(move_left, "Left")
screen.onkey(move_right, "Right")
 
turtle.done()

分层挑战

让孩子改一个参数

把 time_left 从 30 改成 10,游戏会更紧张。

把 step 改大,看看能不能抢更多宝石。

把 Game Over 改成自己的结束文字。

挑战:最后 5 秒时让笔变成红色。

完成标准

孩子能看到时间从 30 往下倒数。

时间到 0 后出现 Game Over。

Game Over 后方向键不能继续移动角色。

孩子能修改时间长度或结束文字。

这一课不用解释事件循环。只要孩子能说出“1 秒后再执行一次”,就够了。

收尾问题

以后做游戏时,你可以决定:让玩家无限玩,还是限时挑战。这就是在设计规则。