如何用Python画一只哆啦A梦?
程序分析
导入模块和设置画笔
因为要使用海龟绘图,所以我们需要先导入 turtle 模块。我们将采用第 11 章介绍的导入模块的第二种方法:
使用这种方法,可以导入 turtle 模块中所有的方法和变量,然后就可以直接调用方法了,而不需要再添加 “turtle.”前缀。现在,我们可以直接将代码写为 setup(500,500),而不需要再添加前缀写成 turtle.setup(500,500)。
然后我们对画笔做一些基本设置,代码如下。
setup(500,500)
#设置画笔
speed(10)
shape("turtle")
colormode(255)
基础函数
绘制圆形
我们定义一个 drawRound()函数,用它来绘制圆形。这里为它设置两个参数,分别是表示所绘制的圆的半 径的 size 和表示是否填充的 filled。drawRound()函数的代码如下所示。
pendown()
if filled==True:
begin_fill()
setheading (180)
circle(size,360)
if filled==True:
end_fill()
首先,调用 pendown()函数表示落笔。然后,判断参数 filled 是否等于 True。如果等于 True,表示要填充, 那么就调用 begin_fill()函数;否则,不调用该函数,表示没有填充。然后调用 setheading(180),设置小海 龟启动时运动的方向,就是让小海龟调个头。调用 circle(size,360),画一个半径为 size 的圆。然后还要判断参数 filled 是否等于 True,如果等于 True,意味着前面调用过 begin_fill()函数,则这里调用 end_fill()函 数表示填充完毕。
绘制矩形
接下来,我们定义了一个 drawRect()函数,用它来绘制矩形。这里为它指定 3 个参数,分别是表示所绘制 的矩形的长的 length,表示所绘制的矩形的宽的 width,以及表示是否填充的 filled。drawRect()函数的代 码如下所示。
setheading(0)
pendown()
if filled==True:
begin_fill()
forward(length)
right(90)
forward(width)
right(90)
forward(length)
right(90)
forward(width)
if filled==True:
end_fill()
首先调用 setheading(0),设置小海龟启动时运动的方向,就是让小海龟头朝右。然后调用 pendown()函数, 表示落笔。判断参数 filled 是否等于 True。如果等于 True,表示要填充,就调用 begin_fill()函数;否则, 不调用函数,表示没有填充。调用 forward(length),绘制一条边。然后调用 right(90),让光标向右旋转 90 度。调用 forward(width),绘制另一条边。
绘制机器猫的身体
head()函数
在这里,我们定义了一个绘制机器猫大脑袋的函数——head()。首先,它绘制一个蓝色填充的大圆,表示 机器猫的脑袋。然后,在蓝色圆中绘制一个稍小一点的白色填充的圆,表示机器猫的脸庞。head()函数的 代码如下所示。
#大圆
color("blue","blue")
penup()
goto(0,100)
drawRound(75,True)
#小圆
color("white","white")
penup()
goto(0,72)
drawRound(60,True)
首先调用 color()函数,将画笔的颜色设置为蓝色,将填充的颜色也设置为蓝色。然后调用 penup()函数, 让画笔抬起,不要在画布上留下笔迹。调用 goto()函数将画笔移动到 x 坐标为 0、y 坐标为 100 的位置。调用我们在前面创建的自定义函数 drawRound(),绘制一个半径为 75 个像素、用蓝色填充的圆。
然后再次调用 color()函数,将画笔的颜色设置为白色,将填充的颜色也设置为白色。然后调用 penup()函 数,让画笔抬起,不要在画布上留下笔迹。调用 goto()函数将画笔移动到 x 坐标为 0、y 坐标为 72 的位置。调用 drawRound()函数,绘制一个半径为 60 个像素、用白色填充的圆。调用这个 head()函数来看一下执行效果,如图所示。
接下来,我们定义 eyes()函数,用来绘制机器猫的眼睛。首先,我们绘制两个边框为黑色并用白色填充的 大圆,表示机器猫的两只眼睛。然后在每个大圆中画一个用黑色填充的圆,并且在这个黑圆中再绘制一个更小的用白色填充的圆,它们表示机器猫的眼球。
#左眼眶
color("black","white")
penup()
goto(-15,80)
drawRound(17,True)
#右眼眶
color("black","white")
penup()
goto(19,80)
drawRound(17,True)
#左眼珠
color("black","black")
penup()
goto(-8,70)
drawRound(6,True)
color("white","white")
penup()
goto(-8,66)
drawRound(2,True)
#右眼珠
color("black","black")
penup()
goto(12,70)
drawRound(6,True)
color("white","white")
penup()
goto(12,66)
drawRound(2,True)
首先绘制机器猫的左眼眶。调用 color()函数,将画笔的颜色设置为黑色,将填充的颜色设置为白色。然 后调用 penup()函数,让画笔抬起,不要在画布上留下笔迹。调用 goto()函数将画笔移动到 x 坐标为 −15、y 坐标为 80 的位置。调用自定义函数 drawRound(),绘制一个半径为 17 个像素、用白色填充的圆。
然后绘制右眼眶,这段代码和绘制左眼的代码基本一致,只是传入 goto()函数的参数不一样,要将画笔移 动到 x 坐标为 19、y 坐标为 80 的位置。接下来绘制左眼珠和右眼珠。还是调用 color()函数,设置画笔和填充的颜色,移动画笔,然后绘制圆。调用这个 eyes()函数来看一下效果,如图所示。
color("red","red")
penup()
goto(0,40)
drawRound(7,True)
调用 color 函数,将画笔和填充的颜色设置为红色。然后调用 penup()函数,让画笔抬起,先不要在画布
上留下笔迹。调用 goto()函数将画笔移动到 x 坐标为 0、y 坐标为 40 的位置。调用自定义函数 drawRound(),绘制一个半径为 7 个像素、用红色填充的圆。调用这个 nose()函数来看一下绘制效果,如图所示。
接下来,我们定义一个 mouth()函数,用来绘制机器猫的嘴巴。它会先绘制一条弧线,表示嘴形,然后再 绘制一条竖线,表示机器猫的“人中”。
#嘴
color("black","black")
penup()
goto(-30,-20)
pendown()
setheading (-27)
circle(70,55)
#人中
penup()
goto(0,26)
pendown()
goto(0,-25)
接下来,调用 penup()函数,让画笔抬起,先不要在画布上留下笔迹。调用 goto()函数将画笔移动到 x 坐 标 0、y 坐标为 26 的位置。然后调用 pendown()函数落下画笔。调用 goto(0,-25),来绘制一条直线,表示 机器猫的“人中”。调用这个 mouth()函数来看一下绘制效果,如图所示。
whiskers()函数
接下来,我们定义了一个 whiskers()函数,用来绘制胡子。它在机器猫的“人中”的两边,分别绘制 3 条 直线,表示胡须。whiskers()函数的代码如下所示。
color("black","black")
#左边中间的胡子
penup()
goto(10,5)
pendown()
goto(-40,5)
#右边中间的胡子
penup()
goto(10,5)
pendown()
goto(40,5)
#左上的胡子
penup()
goto(-10,15)
pendown()
goto(-40,20)
#右上的胡子
penup()
goto(10,15)
pendown()
goto(40,20)
#左下的胡子
penup()
goto(-10,-5)
pendown()
goto(-40,-10)
#右下的胡子
penup()
goto(10,-5)
pendown()
goto(40,-10)
下面我们定义 body()函数,它用来绘制机器猫的身体。该函数先绘制一个蓝色的矩形表示身体,然后再 绘制一个白色的圆,表示机器猫的大肚子。接下来,绘制一个红色的长方形,表示红丝带,用于分隔开 脑袋和身体。最后,绘制一个半圆,表示机器猫的腿。body()函数的代码如下所示。
#蓝色的身体
color("blue","blue")
penup()
goto(-50,-40)
drawRect(100,80,True)
#白色的大肚子
color("white","white")
penup()
goto(0,-30)
drawRound(40,True)
#红色丝带
color("red","red")
penup()
goto(-60,-35)
drawRect(120,10,True)
#白色的腿
color("white","white")
penup()
goto(15,-127)
pendown()
setheading(90)
begin_fill()
circle(14,180)
end_fill()
先调用 color()函数,将画笔和填充的颜色都设置为蓝色。然后调用 penup()函数,让画笔抬起,先不要在 画布上留下笔迹。调用 goto()函数将画笔移动到指定位置。然后调用自定义函数 drawRect(),绘制一个长 为 100 像素、宽为 80 像素,用蓝色填充的矩形,表示机器猫的身体。
调用这个函数,看一下绘制效果,如图所示。
接下来,我们定义 feet()函数,用来绘制机器猫的脚。feet()函数的代码如下所示。
#左脚
color("black","white")
penup()
goto(-30,-110)
drawRound(20,True)
#右脚
color("black","white")
penup()
goto(30,-110)
drawRound(20,True)
调用 color()函数,将画笔颜色设置为黑色,将填充颜色设置为白色。然后调用 penup()函数,让画笔抬起,先不要在画布上留下笔迹。调用 goto()函数将画笔移动到 x 坐标为−30、y 坐标为−110 的位置。
然后调用自定义函数 drawRound(),绘制一个半径为 20 像素、用白色填充的圆形,表示机器猫的左脚。然后重复类似的动作,绘制机器猫的右脚。代码基本上是相同的,只是移动的坐标有所不同,这里就不 再赘述。调用 feet()函数,看一下绘制效果,如图所示。
接下来,我们定义 arms()函数,用来绘制机器猫的胳膊。这里用两个四边形表示机器猫的两条胳膊。arms()函数的代码如下所示。
#左胳膊
color("blue","blue")
penup()
begin_fill()
goto(-51,-50)
pendown()
goto(-51,-75)
left(70)
goto(-76,-85)
left(70)
goto(-86,-70)
left(70)
goto(-51,-50)
end_fill()
#右胳膊
color("blue","blue")
penup()
begin_fill()
goto(49,-50)
pendown()
goto(49,-75)
left(70)
goto(74,-85)
left(70)
goto(84,-70)
left(70)
goto(49,-50)
end_fill()
调用 color()函数,将画笔颜色和填充颜色都设置为蓝色。然后调用 penup()函数,让画笔抬起,先不要在 画布上留下笔迹。调用 begin_fill()函数表示开始填充。调用 goto()函数将画笔移动到指定位置。然后调用 pendown()函数落下画笔。调用 goto()函数,绘制一条直线。然后调用函数 left(70),表示向左旋转 70 度。调用 goto()函数,绘制第二条直线。然后调用函数 left(70),表示向左旋转 70 度。调用 goto()函数,绘制第三条直线。然后调用函数 left(70),表示再次向左旋转 70 度。调用 goto()函数,绘制第四条直线。调用 end_fill()函数,完成颜色的填充。这样我们就完成了一个用蓝色填充的四边形,用它来表示机器猫的左胳膊。
然后重复类似的动作,绘制右胳膊。代码基本相同,只是移动的坐标位置有所不同,这里不再赘述。调 用一下 arms()函数,看一下绘制效果,如图所示。
接下来,我们定义了 hands()函数,来绘制机器猫的手。这里用两个白色填充的圆来表示机器猫的手。hands()函数的代码和 feet()函数比较类似,这里不再做过多的解释,直接列出了代码。
#左手
color("black","white")
penup()
goto(-90,-71)
drawRound(15,True)
#右手
color("black","white")
penup()
goto(90,-71)
drawRound(15,True)
接下来,我们定义了一个 bell()函数,来绘制铃铛。可以看到,铃铛是在一个黄色圆上,由中间的两条黑 线和下方的一个小黑圈组成的。所以,我们先绘制一个用黄色填充的圆;然后绘制一个没有填充的矩形, 表示铃铛中间分开上下部分的横条。在矩形下面,再绘制一个黑色填充的圆。bell()函数代码比较简单, 这里也不再过多地解释,直接列出代码。
#黄色实心圆表示铜铃
color("yellow","yellow")
penup()
goto(0,-41)
drawRound(8,True)
#黑色矩形表示花纹
color("black","black")
penup()
goto(-10,-47)
drawRect(20,4,False)
#黑色实心圆表示撞击的金属丸
color("black","black")
penup()
goto(0,-53)
drawRound(2,True)
最后,我们还要给机器猫绘制一个口袋,因此,这里定义一个 package()函数来绘制口袋。这里用一个半 圆来表示机器猫的口袋。package()函数的代码比较简单,这里不再解释,直接列出了代码。
#半圆
color("black","black")
penup()
goto(-25,-70)
pendown()
setheading(-90)
circle(25,180)
goto(-25,-70)
hideturtle()
到这里,我们的机器猫就绘制完成了。和前面给出的机器猫的卡通形象对比一下,看看是不是挺像的呢?