一、课程介绍
本节课将以 while 无限循环为基础,结合动画原理、turtle 动画三件套,实现一个转动的船舵。
二、重难点解析
while 与 for
while True 与 for 循环可以嵌套使用,
一般会用到的是在无限循环中嵌套 for 循环。
无限次数的循环
有限次数的循环
而在 for 循环中也可以嵌套 while True,但是这样的做法一般没有什么意义。
有限次数的循环
无限次数的循环
动画三件套
· tracer(0)
turtle.tracer(0) 可以取消窗口上的绘画踪迹,也就是会把窗口上的绘画过程都省略,直接形成隐藏的图形。
注意是用 turtle. 使用。
· update()
turtle.update() 可以更新窗口,把隐藏的图形都展示出来。
注意是用 turtle. 使用。
· clear()
使用画笔的 clear 方法可以清除这支画笔画出来的图形。
p.clear() # 清除画笔 p 画出的图形
实现动画
实现动画,要先确定好动画过程中不断切换的图形,确保不断画出的图形有不同的细节。
· 在代码一开始使用 turtle.tracer(0) 取消绘画踪迹,让后面要画的图形能够一瞬间画出来,并隐藏着。
正式进入循环画图的阶段:
1、画第一个图形,
使用 turtle.update() 更新窗口,显示出这个瞬间画出的隐藏图形,
清空第一个图形;
2、画第二个图形,
使用 turtle.update() 更新窗口,显示出这个瞬间画出的隐藏图形,
清空第二个图形;
3、画第三个图形,
使用 turtle.update() 更新窗口,显示出这个瞬间画出的隐藏图形,
清空第三个图形;
一直不断重复这个过程,即可看到最终的动画效果。
三、单词卡
ship [ʃɪp] 船
backward [ˈbækwərd] 后退
tracer [ˈtreɪsər] 示踪剂
update [ˌʌpˈdeɪt] 更新
clear [klɪr] 清除
四、小试牛刀
4.1 源码操作
编写代码,实现一个转动的齿轮。
提示:
1、齿轮的主体由三个圆叠加形成,分别是最大的 300、 lightgray 圆,中间的 100、silver 圆,最小的 80、white 圆;
2、实现边缘一圈的凹陷:不断前进、画 50 的白色小圆、后退、偏转角度,类似画太阳的光线,只是在前进后要画一个白色小圆形成凹陷。
import turtle
p = turtle.Pen()
turtle.tracer(0)
p.ht()
p.penup()
while True:
p.dot(300, 'lightgray')
p.dot(100, 'silver')
p.dot(80, 'white')
n = 10
for i in range(n):
p.forward(150)
p.dot(50, 'white')
p.forward(-150)
p.left(360/n)
turtle.update()
p.clear()
p.left(1)
turtle.done()
4.2 源码操作
编写代码,实现一个上下弹跳、不断向前走的小球。
提示:
1、小球的颜色是 lightgray;
2、向上或向下的距离都是 200,每次都移动 1。
import turtle
p = turtle.Pen()
turtle.tracer(0)
p.ht()
p.penup()
p.forward(-400)
p.left(80)
while True:
for i in range(200):
p.forward(1)
p.dot(50, 'lightgray')
turtle.update()
p.clear()
p.right(135)
for i in range(200):
p.forward(1)
p.dot(50, 'lightgray')
turtle.update()
p.clear()
p.left(135)
turtle.done()
五、大开脑洞
金箍棒横扫世界!!
1、金箍棒的长度是400,gold金色线段分别是100,red红色线段是200。
2、画下一次的金箍棒时后退回到开始的起点,然后偏转一定角度(不限制)。
import turtle
p = turtle.Pen()
turtle.tracer(0)
while True:
p.right(18)
p.pensize(8)
p.pencolor('gold')
p.forward(100)
p.pencolor('red')
p.forward(200)
p.pencolor('gold')
p.forward(100)
turtle.update()
p.penup()
p.backward(400)
p.pendown()
p.clear()
p.ht()
turtle.done()