Python 挑战版 · Day 8
收集宝石:把机制连成游戏
这节课不是新增大量语法,而是把前 7 节的能力整合成一个可玩作品,并让学生解释改动。
节奏分配(45 分钟)
01
拆目标
先把小游戏拆成玩家、宝石、碰撞、分数、胜利五个机制。
02
迁移 Day 7
保留键盘移动和边界判断,把角色当成玩家。
03
随机宝石
用 random.randint 生成坐标,并封装成 move_gem。
04
碰撞与得分
用 distance 判断是否收集,再更新 score。
05
计分板与胜利
用 clear + write 刷新文字,到目标分数显示胜利。
06
扩展和展示
学生选择一个机制改造,并解释改动影响。
教师话术
"小游戏不是一个神秘整体,它只是几个机制连在一起。"
"distance 返回的是两个 turtle 之间的距离;阈值越大,越容易收集到。"
"score 在函数外创建,在函数里修改,所以这里需要 global score。"
"这节课解释代码时,请说出:哪一行控制位置,哪一行控制分数,哪一行控制胜利。"
机制知识卡
random.randint(-280, 280)生成一个范围内的随机整数,用来决定宝石坐标。
player.distance(gem)计算玩家和宝石之间的距离。
global score告诉 Python:函数里要修改外面的 score。
pen.clear()先清掉旧文字,再写新分数。
关键代码
碰撞、得分、换位置
def collect_gem():
global score
if player.distance(gem) < 25:
score = score + 1
move_gem()
draw_score()计分板和胜利条件
def draw_score():
pen.clear()
pen.goto(-310, 210)
pen.write(f"分数: {score}", font=("Arial", 16, "bold"))
if score >= target_score:
pen.goto(0, 0)
pen.write("你赢了!", align="center", font=("Arial", 36, "bold"))完整版本
import turtle
import random
screen = turtle.Screen()
screen.title("第 8 课:收集宝石小游戏")
screen.setup(700, 500)
screen.bgcolor("lightcyan")
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()
gem.shapesize(0.8)
score = 0
target_score = 5
step = 20
left_edge = -320
right_edge = 320
top_edge = 220
bottom_edge = -220
pen = turtle.Turtle()
pen.hideturtle()
pen.penup()
def move_gem():
x = random.randint(-280, 280)
y = random.randint(-180, 180)
gem.goto(x, y)
def draw_score():
pen.clear()
pen.goto(-310, 210)
pen.write(f"分数: {score}", font=("Arial", 16, "bold"))
if score >= target_score:
pen.goto(0, 0)
pen.write("你赢了!", align="center", font=("Arial", 36, "bold"))
def collect_gem():
global score
if player.distance(gem) < 25:
score = score + 1
move_gem()
draw_score()
def move_up():
if player.ycor() < top_edge and score < target_score:
player.sety(player.ycor() + step)
collect_gem()
def move_down():
if player.ycor() > bottom_edge and score < target_score:
player.sety(player.ycor() - step)
collect_gem()
def move_left():
if player.xcor() > left_edge and score < target_score:
player.setx(player.xcor() - step)
collect_gem()
def move_right():
if player.xcor() < right_edge and score < target_score:
player.setx(player.xcor() + step)
collect_gem()
move_gem()
draw_score()
screen.listen()
screen.onkey(move_up, "Up")
screen.onkey(move_down, "Down")
screen.onkey(move_left, "Left")
screen.onkey(move_right, "Right")
turtle.done()分层挑战
基础
修改 target_score、step、宝石颜色,观察游戏难度变化。
进阶
增加第二个宝石,颜色不同,分数不同。
挑战
增加倒计时或生命值,让碰到边界扣分。
完成标准
能把游戏拆成五个机制,并指出每个机制对应的代码区域。
能解释 distance 阈值如何影响收集难度。
能解释为什么 update score 的函数里需要 global score。
能完成至少一个参数或机制改造,并展示效果。
展示时让学生操作自己的游戏,并用一句话说明:我改了哪一行,它改变了什么行为。
展示收尾
每人 1 分钟演示:先玩,再指出一处自己改过的代码。老师记录可以延展到下一课的想法。
模块目录
Python 启蒙