思路和实现
本文想通过 turtle 动态画图,向观看对象呈现一个动态绘制礼物的过程。一提到圣诞节,大家映入脑海中的肯定就是郁郁葱葱的绿色圣诞树,如果只是一棵圣诞树,未免也太平平无奇了,所以我准备在圣诞树的顶部加一颗爱心,来起到画龙点睛的作用。
我们从上往下画这个动图,所以第一步要画的是爱心。我将爱心分为两个半圆与一个正方形的组合,并且用粉红色来着色,我们来看看具体实现:
def loving_heart(r): l = 2 * r tur.left(45) tur.forward(l) tur.circle(r, 180) tur.right(90) tur.circle(r, 180) tur.forward(l)
爱心画完了,就要开始画圣诞树了,我们知道,圣诞树从树顶往下是一个对称的锥形,这么规则的形状,正是我们想要的,它简化了我们程序的逻辑。我们先画树的主干,然后再画小树枝,小树枝采用从上到下一层一层画的模式,每一层左右对称,并且画法相同,采用递归的方式来实现:
# 树函数(递归) def tree(d, s): if d <= 0: return tur.forward(s) tree(d - 1, s * .8) tur.right(120) tree(d - 3, s * .5) tur.right(120) tree(d - 3, s * .5) tur.right(120) # 回退函数 tur.backward(s)
画完这两部分之后,我们的爱心圣诞树就画好了,但是我们不能就这样结束,我们还需要加一句表白的语句或者祝福语(这个大家自由发挥啦),我这里就写了一句“Merry Christmas”作为示例。
整个作画的主程序是这样的:
# 画爱心部分 tur.penup() # 设置起点位置 tur.goto(0, 200) tur.pendown() # 设置画笔颜色 tur.pencolor('pink') tur.color('pink') # 对图形进行填充 tur.begin_fill() # 执行画爱心函数 loving_heart(20) tur.end_fill() # 画树部分 n = 100 tur.speed('fastest') tur.right(225) tur.color("dark green") tur.backward(n * 4.8) tree(15, n) tur.backward(n / 5) tur.penup() tur.Turtle().screen.delay(2) tur.goto(80, 0) tur.pendown() tur.color("gold") tur.write("Merry Christmas!", font=("Times", 32, "bold")) tur.hideturtle()
作画的过程我录制了一下,以便大家看看效果:
作画完成后,最终的效果是这样子的:
总结
本文以动态画一棵爱心圣诞树为例,为大家展现了程序猿式的浪漫,这个礼物的重点是要动态画,展现出画的过程,让非程序员女生能够感受到程序的神奇,而不是把最后的成品给她。当然啦,大家可以根据这个思路自由发挥,给自己心爱的她进行定制。反正我写程序的过程被女朋友看到了,然后她在一旁发出“哇哇,原来程序员还可以这样浪漫”的叫声。为了大家我也是拼了,提前泄露了天机,以至于我还需要再准备一份礼物了,大家觉得这种无私奉献的精神是不是值得点个“在看”呢?