海龟绘图插画

十六课的最后一课,不学新东西,纯玩。前面我们一直在跟数字、文字打交道,今天让程序画画:用一只"海龟"在屏幕上爬,爬过的地方留下线条。用的全是老朋友——循环和函数。本站「软件」菜单里就有海龟编辑器,不用装任何东西,打开网页就能跟着这课玩。

一、认识海龟

import turtle

t = turtle.Turtle()   # 召唤一只海龟(屏幕中间的小箭头就是它)
t.forward(100)        # 向前爬 100 步
t.left(90)            # 向左转 90 度
t.forward(100)        # 再向前爬 100 步
turtle.done()         # 画完,让窗口留住别关

运行后会弹出一扇窗:海龟先往右爬,再往上爬,画出一个直角。海龟听得懂的指令不多,先记这几个:

指令意思
t.forward(距离)朝当前方向前进
t.backward(距离)后退
t.left(角度) / t.right(角度)原地左转 / 右转
t.penup() / t.pendown()抬笔(移动不留痕)/ 落笔
t.goto(x, y)直接瞬移到坐标 (x, y)
t.pensize(粗细) / t.color("颜色")笔的粗细 / 颜色(如 "red"、"blue")
t.circle(半径)画一个圆
t.speed(速度)爬行速度,0 最快,1 最慢

二、从正方形到任意多边形

画一个正方形,无非是"前进、转 90°"重复 4 次——循环的老本行:

import turtle

t = turtle.Turtle()
for i in range(4):
    t.forward(150)
    t.left(90)
turtle.done()

想一想:正方形转角是 90°,正三角形呢?转 120°。正五边形呢?转 72°。规律是:正 n 边形,每次转 360 ÷ n 度(因为画完一圈总共转了 360°)。把规律写进函数(第十课),想画几边形报个数就行:

import turtle

t = turtle.Turtle()

def polygon(n, length):
    for i in range(n):
        t.forward(length)
        t.left(360 / n)

polygon(6, 100)   # 正六边形
turtle.done()

三、五角星与涂色

五角星一笔画,诀窍在转角:每次转 144°,连转 5 次正好回到起点(这个角度先记住,原理是星形的内角关系,感兴趣可以自己量一量)。再加上涂色,就是一颗金灿灿的星星:

import turtle

t = turtle.Turtle()
t.color("orange")          # 画笔和填充都用橙色系

t.begin_fill()             # 开始记填充范围
for i in range(5):
    t.forward(200)
    t.right(144)
t.end_fill()               # 闭合,涂满

turtle.done()

begin_fill / end_fill 是一对:从 begin 开始,海龟爬过的闭合图形会被 end 时的颜色填满。

四、循环的魔法:万花筒

真正好玩的来了。把"画一个正方形"重复很多次,每次多转一点点,图形自己会开花:

import turtle

t = turtle.Turtle()
t.speed(0)                       # 最快速度,不然等到天荒地老

colors = ["red", "orange", "purple", "blue", "green"]
for i in range(36):
    t.color(colors[i % len(colors)])   # 五种颜色轮着用
    for j in range(4):                  # 画一个正方形
        t.forward(150)
        t.left(90)
    t.left(10)                          # 整体再转 10°,进入下一朵"瓣"

turtle.done()

36 个正方形,每个偏转 10°,拼成一朵万花筒。这个程序没有任何新语法——就是循环套循环,加上一点颜色轮换。i % len(colors) 是第十三课前学过的取余小技巧:让下标在 0~4 之间循环。

再送你一个螺旋线,体会"每次多走一点"的威力:

import turtle

t = turtle.Turtle()
t.speed(0)
for i in range(100):
    t.forward(i * 2)   # 每一步比上一步长一点
    t.left(91)         # 不是 90,是 91——故意差 1°,才会旋起来
turtle.done()

把 91 改成 90 画出来是正方形螺旋,改成 89 又是另一种花纹——参数差 1°,效果天差地别,自己动手试,这就是玩代码的乐趣。

本课小结

· 海龟绘图 = 指挥一只笔:前进、转向、抬落笔、换颜色,就这么几招。
· 正 n 边形每次转 360÷n;五角星每次转 144°。
· 真正出效果的是老知识:循环负责重复,函数负责封装,取余负责轮换。
· 学编程不只有做题——能画出好看的图,同样是本事。

练一练

1. 多边形排队:用第二节的 polygon 函数,先抬笔挪个位置,依次画出正三角形、正方形、正八边形,排成一行。
2. 同心圆:用 circle 从半径 20 画到 100(每次大 20),换不同颜色,画出一组彩虹同心圆(提示:画完一个圆,海龟要回到圆心附近再画下一个,想想 goto 和 penup 怎么配合)。
3. 挑战题:给万花筒换配色或换图形(比如把正方形换成第二节的 polygon(5, ...) 五边形),调出你自己的花纹,截图存下来——这朵"花"可以直接投到作品区。

Python 的十六课到此全部结束。从第一课"认识 Python"到今天,你走完了变量、分支、循环、数据结构、函数、文件、字符串、可视化一整条线。接下来,去学考加油站把这些本事换成分数,或者去作品区把你的项目晒出来吧。

More

相关教程