上节课学了鼠标画笔。这节课进阶:让多个角色同时动起来!就像游戏里的多个小人物同时跑动一样。
一、创建多个Turtle对象
每调用一次 turtle.Turtle(),就创建一个独立的角色,各自有自己的位置、颜色、方向!
import turtle
screen = turtle.Screen()
screen.setup(700, 500)
# 创建三个独立的角色
t1 = turtle.Turtle()
t1.color("red")
t1.shape("turtle")
t1.penup()
t1.goto(-200, 0)
t1.pendown()
t2 = turtle.Turtle()
t2.color("blue")
t2.shape("turtle")
t2.penup()
t2.goto(0, 0)
t2.pendown()
t3 = turtle.Turtle()
t3.color("green")
t3.shape("turtle")
t3.penup()
t3.goto(200, 0)
t3.pendown()
# 三个角色各画一个正方形
for _ in range(4):
t1.forward(80)
t1.right(90)
t2.forward(80)
t2.right(90)
t3.forward(80)
t3.right(90)
screen.exitonclick()
三个角色同时画正方形!每个都有自己的轨迹。
二、tracer(0) + update():流畅动画的秘密
默认情况下,每步都会刷新屏幕,多个角色同时动会卡顿。用 tracer(0) 关闭自动刷新,手动调用 update() 一次性刷新,动画就丝滑了!
import turtle, time
screen = turtle.Screen()
screen.setup(700, 500)
screen.tracer(0) # 关闭自动刷新
t1 = turtle.Turtle()
t1.color("red")
t1.shape("turtle")
t1.penup()
t1.goto(-200, 0)
t1.pendown()
t2 = turtle.Turtle()
t2.color("blue")
t2.shape("turtle")
t2.penup()
t2.goto(0, 0)
t2.pendown()
# 动画循环:两个角色同时转圈
for _ in range(360):
t1.forward(1)
t1.right(1)
t2.forward(1)
t2.left(1)
screen.update() # 每循环刷新一次屏幕
time.sleep(0.01) # 控制速度
screen.exitonclick()
tracer(0) + update() 是多角色动画的标配组合!
三、实战:小行星追逐游戏 ⭐
import turtle, time, random
screen = turtle.Screen()
screen.setup(700, 500)
screen.bgcolor("black")
screen.tracer(0)
# 创建5个小行星
stars = []
colors = ["red", "orange", "yellow", "cyan", "magenta"]
for i in range(5):
t = turtle.Turtle()
t.shape("circle")
t.color(colors[i])
t.penup()
t.goto(random.randint(-300, 300), random.randint(-200, 200))
t.pendown()
t.speed(0)
stars.append(t)
# 动画循环:每个行星随机运动
for _ in range(200):
for s in stars:
angle = random.randint(-30, 30)
s.right(angle)
s.forward(random.randint(5, 15))
screen.update()
time.sleep(0.05)
screen.exitonclick()
四、实战:多角色赛跑 ️
import turtle, time, random
screen = turtle.Screen()
screen.setup(700, 400)
screen.bgcolor("#1a1a2e")
screen.tracer(0)
colors = ["red", "orange", "yellow", "green", "cyan"]
racers = []
# 创建5只赛跑的海龟
for i in range(5):
t = turtle.Turtle()
t.shape("turtle")
t.color(colors[i])
t.penup()
t.goto(-300, 150 - i * 60) # 各自起始位置
t.pendown()
racers.append(t)
# 画终点线
finish = turtle.Turtle()
finish.hideturtle()
finish.penup()
finish.goto(280, 180)
finish.pendown()
finish.pencolor("white")
finish.pensize(3)
finish.goto(280, -120)
# 开始比赛
winner = None
while winner is None:
for t in racers:
t.forward(random.randint(1, 10))
if t.xcor() >= 280:
winner = t
break
screen.update()
time.sleep(0.02)
# 显示胜利者
msg = turtle.Turtle()
msg.hideturtle()
msg.penup()
msg.goto(0, 0)
msg.color(winner.pencolor())
msg.write(f"冠军:{winner.pencolor()}", align="center",
font=("Arial", 24, "bold"))
screen.exitonclick()
五、实战:地球绕太阳转
import turtle, time, math
screen = turtle.Screen()
screen.setup(700, 500)
screen.bgcolor("black")
screen.tracer(0)
# 太阳
sun = turtle.Turtle()
sun.shape("circle")
sun.color("yellow")
sun.shapesize(3)
sun.penup()
# 地球
earth = turtle.Turtle()
earth.shape("circle")
earth.color("deepskyblue")
earth.shapesize(1.5)
earth.penup()
# 月亮
moon = turtle.Turtle()
moon.shape("circle")
moon.color("lightgray")
moon.shapesize(0.8)
moon.penup()
angle = 0
while True:
# 地球绕太阳转
ex = 200 * math.cos(math.radians(angle))
ey = 100 * math.sin(math.radians(angle))
earth.goto(ex, ey)
# 月亮绕地球转(速度是地球的4倍)
mx = ex + 40 * math.cos(math.radians(angle * 4))
my = ey + 20 * math.sin(math.radians(angle * 4))
moon.goto(mx, my)
screen.update()
time.sleep(0.02)
angle += 1
if angle >= 360:
angle = 0
三个对象同时运动,地球绕太阳转,月亮绕地球转!
六、小技巧总结
# 多角色动画三大要素:
# 1. 多个 Turtle() 对象 —— 每个独立控制
# 2. screen.tracer(0) —— 关闭自动刷新,防屏闪
# 3. screen.update() —— 手动刷新,控制帧率
# 常用模式:
screen.tracer(0)
while True:
# 更新所有角色位置
screen.update()
time.sleep(0.02) # 大约50fps
七、小挑战
-
- 简单:创建3只不同颜色的海龟,让它们各自画一个圆
-
- 中等:在赛跑游戏里加一个计数器,显示每只海龟跑了多少步
-
- 困难:实现太阳系,加入火星和木星,让它们也绕太阳转
-
八、下期预告
turtle系列即将收尾!下节课我们做一个综合小项目:用学过的所有知识,做一个完整的小游戏或动画场景!
下期:《turtleturtle第12课:综合小项目》
有问题欢迎留言!