最近,东北三省下起了大雪。作为一个在南方生活的学生,一年中自然很少看到漫天大雪。因此,我在这尝试用Python写了一个漫天飞雪的程序。
分析:想要画一个雪花,我们可以使用Python的turtle模块。雪花❄️——的形状:有七根主干,每根主干上还分叉出两个分支。因此,每两个枝干间的夹角为(360/7)度。画完一个枝干后,可以将画笔移动到雪花中心,旋转之后继续画下个枝干,这一过程可以通过循环实现。最后,画完后可以随机讲画笔移动,重复上述步骤。代码如下:
import turtle
import random
counts = random.randint(4, 6)
# counts代表雪花数量,这里我们随机生成4-6片雪花
def snowflake():
for i in range(counts):
# 随机移动雪花中心的位置
coordinate_x = random.randint(-300, 300)
coordinate_y = random.randint(-200, 200)
move_pen_position(x=coordinate_x, y=coordinate_y)
# 设置雪花的大小,这样可以让每一片雪花都不一样
random_size = random.randint(30, 50)
for j in range(7):
branch(size=random_size)
def move_pen_position(x, y):
turtle.hideturtle()
turtle.penup()
turtle.goto(x, y)
turtle.pendown()
turtle.showturtle()
# 下面的branch()函数用来绘制雪花的单个枝干
def branch(size):
angle = 360 / 7
turtle.right(angle)
turtle.forward(size)
turtle.backward(size/3)
turtle.right(30)
turtle.forward(size/3)
turtle.backward(size/3)
turtle.left(60)
turtle.forward(size/3)
turtle.backward(size/3)
turtle.right(30)
turtle.backward(2*size/3)
# 下面的paint()函数用来设置整体属性
def paint():
turtle.setup(800, 600)
turtle.screensize(400, 200, 'skyblue')
turtle.pencolor('grey')
turtle.speed(5)
turtle.pensize(2)
snowflake()
# 下面的诗句仅仅是为了意境而存在,大家也可以换成自己喜欢的诗句
move_pen_position(x=200, y=-250)
message = "白雪缺嫌春色晚,故穿庭树作飞花"
turtle.write(message, align='center', font=('宋体',15,'normal'))
window = turtle.Screen()
window.exitonclick()
paint()
效果如下:
观察代码,我们可以发现还有很多可以优化的地方。比如,有时雪花会部分重叠在一起。对于这个问题的我给出的解决方案是:将雪花位置放进一个列表中,如果下一个雪花中心坐标的x值与y值与前一个的差较小的话,舍弃这个坐标(可用continue),最后,遍历这个列表,画图,完美!
另外,雪花并没有“飞”起来,也就是说并没有闪烁或者移动效果。我将会在以后的博客中实现这些效果。而且,可以将它打包成exe或者app类型的文件,让你没装Python编译器的朋友都可以执行上面的程序。