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。

孩子能改一个参数,让游戏更简单或更难。

如果敌人没有威胁感,优先调颜色、出现速度和碰撞距离。

收尾问题

一个游戏可以设计奖励,也可以设计危险。下一次可以换一种玩法:东西从天上掉下来,玩家去接。