turtle库绘图:毕业了,为自己放一场烟花吧

本文作者以个人的毕业经历为背景,融合了对大学生活的回顾与毕业季的感慨,通过Python代码实现了一个烟花秀,以此为毕业季的同学们和自己送上祝福。代码展示了如何使用turtle库绘制烟花效果,展现了技术与情感的交融。
摘要由CSDN通过智能技术生成

所感是对毕业季的感想,所现是代码的实现

所感

六月的风悄然吹过,啊,是炽热的风,和这风一起来的还有毕业的脚步,是的,我毕业了,我去年就毕业了,但今年这场毕业盛典或许不应该仅仅属于这一届毕业生,请允许我这位学长,没穿过学士服,没有毕业照,没有毕业典礼的一位学长,也蹭一蹭今年的毕业季,假装自己刚刚毕业。

我是一名大四的学生,论文已经提交了,马上就要毕业了,宿舍楼下的帐篷都支了起来,人们开始忙着邮寄自己的物品,大包小包,四年的青春竟是如此沉重,这还是丢弃和出售过后的成果,我也要整理好了自己的行李,还有舍友的物品,先去取学位证书和毕业证书吧,由于不小心被雨水浸泡还没拿到手的证书封皮居然已经发霉变形了,这就是我们的毕业季吗?疫情、霉运、凑不齐的舍友,合照上样式各异的服装和半数的同学。好在离开宿舍时没有热泪滚落,没有太多伤感,仿佛是一次寒暑假的离别,也或许是因为我和舍友一同离开的宿舍,少了在宿舍的互相道别,也就少了那一份伤感。

我是一名毕业生,调剂上岸了,每天有时间就做做导师给的任务,朴实无华且枯燥,刚毕业的那几天,我会时不时的翻翻毕业证书,那本毕业相册却很少打开,就这么毕业了吧,开始下一段旅途了。

我是一名研一的学生,趁着端午回了一趟母校,千里迢迢,还由于起晚误了飞机,多花了1000多块,飞机、地铁、火车、大巴,返校的路还是这么曲折,汽车站却是一副崭新模样,疫情的阴霾还未完全褪去,尤其是对于护城河来说,封校成了常态,我只能经由栅栏的缺口出入学校,校园倒没有大的变化,还是记忆中的模样。可惜假期太短,毕业典礼又太晚,回到现在的学校后,才在空间看到,这就是大鹏一日同风起,扶摇直上九万里吧。

在这里插入图片描述

所现

回到学校,不断的翻看空间、朋友圈,内心思绪万千,又恰巧看到了这次征文活动,那就借此机会为毕业的你们和自己放一场烟花吧。

firework

绽放前烟花参考自己之前的博客turtle库绘制QQ表情“蹭一蹭” “惊鸿一现”部分
绽放效果参考博客Python制作烟花秀
2024-06-13 更新,增加代码注释并精简部分代码,整体实现代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Date: 2021/6/19 16:21:15
@Software: PyCharm
@Author: lazyn
"""

import time
import random
from turtle import *


# 绘制初始烟花线条的函数
def draw_firework(count, dis, ang):
    """
    count:线条数量
    dis:线条长度
    ang:线条之间的角度
    """
    for c in range(count):
        forward(dis)
        left(ang)


def draw(lis):
    pensize(1)  # 设置画笔粗细为 1
    for t in range(repeat_num):  # 循环 repeat_num 次绘制烟花线条
        for li in lis:  # 遍历每个烟花参数列表
            x, y, col, dis, ang, add, count = li
            # 上一个烟花线条绘制完毕后移动画笔到下一个烟花绘制的开始位置,每次循环向左移动 add 的一半
            penup(), goto(x - t * add / 2, y), pendown()
            color('black', col)  # 设置画笔颜色为黑色,并设置填充颜色为传入的颜色
            begin_fill()  # 开始填充
            setheading(0)  # 设置方向为 0
            draw_firework(count, t * add + init_length, ang)  # 线条长度每轮循环增加 add,模拟烟花爆炸效果
            end_fill()  # 结束填充
        update()  # 全部烟花线条绘制完成后更新画面
        time.sleep(0.015)  # 暂停 0.015 秒
        clear()  # 清除画面

    pensize(2)  # 设置画笔粗细为 2
    for t in range(repeat_num):  # 再次进行 repeat_num 次循环绘制烟花爆炸后的点光影
        for li in lis:  # 遍历每个烟花参数列表
            x, y, col, dis, ang, add, count = li  # 获取参数
            pencolor(col)  # 设置画笔颜色
            count = int(count / 4)  # 计算爆炸点的数量,值越大点越密集
            radius = dis / 2 - 10 + t * 2  # 计算爆炸点圆的半径
            # 确定绘制圆的起始位置,爆炸线条中心点为(x+init_length/2,y),以此点为圆心绘制半径为dis/2-10+t*2的圆,可得绘制的起始点坐标
            penup(), goto(x + init_length / 2 - radius, y), pendown()
            setheading(-90)  # 设置方向为-90
            for i in range(count):  # 循环绘制多个爆炸点
                penup()  # 抬笔
                circle(radius, 360 / count - 1)  # 绘制360 / count - 1度的圆弧,用于移动到下一个爆炸点位置
                pendown()  # 落笔
                circle(radius, 1)  # 落笔绘制1弧度的圆,作为爆炸点
        update()  # 更新画面
        time.sleep(0.03)  # 暂停 0.03 秒
        clear()  # 清除画面


def main(cols):
    while True:  # 无限循环
        fires = random.randint(10, 15)  # 生成随机的烟花数量
        need_list = []  # 创建存储烟花参数的列表
        for f in range(fires):  # 循环生成每个烟花的参数
            startx, starty = random.randint(-350, 350), random.randint(-100, 250)  # 随机起始位置
            ccol = random.choice(cols)  # 随机选择颜色
            dist = random.randint(init_length+20, init_length+50)  # 随机线条长度
            if dist <= 60:  # 根据长度设置角度
                angle = 171
            else:
                angle = random.choice([174, 175, 176])
            add = (dist - init_length) / repeat_num  # 计算每次循环增加的线条长度
            count = int(360 / (180 - angle))  # 计算线条数量
            need_list.append([startx, starty, ccol, dist, angle, add, count])  # 添加到列表
        draw(need_list)  # 绘制烟花
        clear()  # 清除画面


if __name__ == '__main__':
    init_length = 20  # 初始线条长度
    repeat_num = 10  # 循环次数
    setup(810, 605)  # 设置窗口大小
    screensize(800, 600, 'black')  # 设置画布大小及背景颜色
    hideturtle()  # 隐藏画笔
    colors = ['red', 'blue', 'yellow', 'white',
              'green', 'orange', 'purple', 'seagreen',
              'indigo', 'cornflowerblue']
    tracer(False)  # 不跟踪画笔移动轨迹
    main(colors)

  • 14
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lazyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值