Python 启蒙 · Day 10
加入敌人:让游戏有危险
这节课不追求复杂 AI,只让孩子体验:游戏里可以同时有奖励和危险。
课堂流程(45 分钟)
01
复习限时游戏
先问:上节课让游戏多了什么压力?
02
制造冲突
只有宝石奖励,没有危险,游戏会不会太简单?
03
演示敌人版本
老师运行成品:黑色敌人出现,碰到就 Game Over。
04
创建敌人
enemy 也是一个 turtle,只是颜色和角色不同。
05
让敌人换位置
用 random 和 ontimer,让敌人每隔一会儿出现到新地方。
06
碰撞判断
碰宝石加分,碰敌人结束。两个判断都用 distance。
07
自由调难度
改敌人出现速度、碰撞距离或敌人颜色。
教师话术(照着说就行)
"上节课我们做了限时挑战。今天再加一个危险。"
"宝石是奖励,敌人是危险。一个游戏有奖励也有危险,才会刺激。"
"enemy 和 player 一样,都是 turtle。只是它是黑色的坏人角色。"
"碰宝石和碰敌人都用 distance,只是结果不一样。"
分步加入敌人
第一步:创建敌人
python
enemy = turtle.Turtle()
enemy.shape("circle")
enemy.color("black")
enemy.penup()
enemy.goto(-100, -80)第二步:敌人随机出现
python
def move_enemy():
if game_over:
return
enemy.goto(random.randint(-250, 250), random.randint(-180, 180))
screen.ontimer(move_enemy, 1200)第三步:碰撞规则
python
def check_hit():
global score, game_over
if game_over:
return
if player.distance(gem) < 25:
score = score + 1
move_gem()
show_info()
if player.distance(enemy) < 25:
game_over = True
show_game_over()完整课堂代码
python
import turtle
import random
screen = turtle.Screen()
screen.title("第 10 课:躲开敌人")
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()
enemy = turtle.Turtle()
enemy.shape("circle")
enemy.color("black")
enemy.penup()
enemy.goto(-100, -80)
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 show_game_over():
pen.clear()
pen.goto(0, 0)
pen.write("Game Over", align="center", font=("Arial", 36, "bold"))
def update_time():
global time_left, game_over
if game_over:
return
if time_left > 0:
time_left = time_left - 1
show_info()
screen.ontimer(update_time, 1000)
else:
game_over = True
show_game_over()
def move_enemy():
if game_over:
return
enemy.goto(random.randint(-250, 250), random.randint(-180, 180))
screen.ontimer(move_enemy, 1200)
def check_hit():
global score, game_over
if game_over:
return
if player.distance(gem) < 25:
score = score + 1
move_gem()
show_info()
if player.distance(enemy) < 25:
game_over = True
show_game_over()
def move_up():
if not game_over:
player.sety(player.ycor() + step)
check_hit()
def move_down():
if not game_over:
player.sety(player.ycor() - step)
check_hit()
def move_left():
if not game_over:
player.setx(player.xcor() - step)
check_hit()
def move_right():
if not game_over:
player.setx(player.xcor() + step)
check_hit()
move_gem()
show_info()
update_time()
move_enemy()
screen.listen()
screen.onkey(move_up, "Up")
screen.onkey(move_down, "Down")
screen.onkey(move_left, "Left")
screen.onkey(move_right, "Right")
turtle.done()改一改难度
给孩子选一个就够
把 enemy.color("black") 改成 red,让敌人更明显。
把 1200 改成 800,敌人出现更快。
把碰撞距离 25 改成 40,游戏更难。
把 Game Over 改成自己的结束文字。
完成标准
孩子能看到黑色敌人出现在屏幕上。
敌人会定时换位置。
碰到宝石加分,碰到敌人 Game Over。
孩子能改一个参数,让游戏更简单或更难。
如果敌人没有威胁感,优先调颜色、出现速度和碰撞距离。
收尾问题
一个游戏可以设计奖励,也可以设计危险。下一次可以换一种玩法:东西从天上掉下来,玩家去接。
模块目录
Python 启蒙