2

Pythoner 的花式浪漫,你会吗?

 3 years ago
source link: http://www.justdopython.com/2020/12/21/sds/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Pythoner 的花式浪漫,你会吗?

发表于 2020-12-21

| 分类于 python

一年一度的圣诞节又到了,对于这个重大的节日,今年的外国人可能比较难,还处在水深火热之中,希望他们一切都赶快好起来。在我们国内,我们还可以像往年一样正常地过节,虽然是一个外国人的节日,但是每年在这个日子里,还是成就了不少鸳鸯的,也不失是一件好事。作为 Python 程序员,你还在送花、送苹果、送口红吗?有没有想过程序猿式的浪漫?本文就抛砖引玉,为大家提供一种思路,希望大家喜欢。

思路和实现

本文想通过 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()

作画的过程我录制了一下,以便大家看看效果:

作画完成后,最终的效果是这样子的:

本文以动态画一棵爱心圣诞树为例,为大家展现了程序猿式的浪漫,这个礼物的重点是要动态画,展现出画的过程,让非程序员女生能够感受到程序的神奇,而不是把最后的成品给她。当然啦,大家可以根据这个思路自由发挥,给自己心爱的她进行定制。反正我写程序的过程被女朋友看到了,然后她在一旁发出“哇哇,原来程序员还可以这样浪漫”的叫声。为了大家我也是拼了,提前泄露了天机,以至于我还需要再准备一份礼物了,大家觉得这种无私奉献的精神是不是值得点个“在看”呢!

示例代码:(https://github.com/JustDoPython/python-examples/tree/master/xianhuan/sds)

欢迎订阅 Python 技术,这里分享关于 Python 的一切。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK