Python跨年烟花

目录
系列文章
写在前面
技术需求
完整代码
下载代码
代码分析
1. 程序初始化与显示设置
2. 烟花类 (Firework)
3. 粒子类 (Particle)
4. 痕迹类 (Trail)
5. 烟花更新与显示
6. 主函数 (fire)
7. 游戏循环
8. 总结
注意事项
写在后面
系列文章
| 序号 | 直达链接 |
| 爱心系列 | |
| 1 | Python制作一个无法拒绝的表白界面 |
| 2 | Python满屏飘字表白代码 |
| 3 | Python无限弹窗满屏表白代码 |
| 4 | Python李峋同款可写字版跳动的爱心 |
| 5 | Python流星雨代码 |
| 6 | Python漂浮爱心代码 |
| 7 | Python爱心光波代码 |
| 8 | Python普通的玫瑰花代码 |
| 9 | Python炫酷的玫瑰花代码 |
| 10 | Python多彩的玫瑰花代码 |
| 节日系列 | |
| 1 | Python动漫风烟花秀代码 |
| 2 | Python新年烟花秀代码 |
| 3 | Python圣诞礼物代码 |
| 4 | Python画圣诞树代码 |
| 5 | Python可爱版圣诞树丨绿色 |
| 6 | Python可爱版圣诞树丨粉色 |
| 7 | Python大雪纷飞代码 |
| 8 | Python生日蛋糕代码 |
| 9 | Python五彩气球代码 |
| 10 | Python国庆祝福代码 |
| 11 | Python万圣礼物代码 |
| 12 | Python愚人节礼物代码 |
| 13 | Python浪漫星空代码 |
| 14 | Python樱花树代码 |
| 动漫系列 | |
| 1 | Python名侦探柯南 |
| 2 | Python喜羊羊 |
| 3 | Python懒羊羊 |
| 4 | Python沸羊羊 |
| 5 | Python小灰灰 |
| 6 | Python小香香 |
| 7 | Python灰太狼 |
| 8 | Python海绵宝宝 |
| 9 | Python哆啦A梦 |
| 10 | Python凯蒂猫 |
| 11 | Python猫和老鼠 |
| 12 | Python草莓熊 |
| 13 | Python迷你皮卡丘 |
| 14 | Python高级皮卡丘 |
| 15 | Python豪华皮卡丘 |
| 16 | Python史迪仔 |
| 17 | Python小熊猫 |
| 18 | Python蜘蛛侠 |
| 19 | Python可爱版蜡笔小新 |
| 20 | Python萌萌的蜡笔小新 |
| 21 | Python罗小黑 |
| 22 | Python猪猪侠 |
| 炫酷系列 | |
| 1 | Python张万森下雪了 |
| 2 | Python一闪一闪亮晶晶 |
| 3 | Python黑客帝国代码雨 |
| 4 | Python七彩花朵 |
| 5 | Python模拟3D星空 |
| 6 | Python金榜题名 |
| 7 | Python满天星 |
写在前面
Python语言实现新年烟花秀的完整代码。
技术需求
-
Pygame 库:Pygame 是 Python 的一个游戏开发库,用于制作视频游戏和图形应用程序。在此代码中,Pygame 被用来创建图形界面、绘制图形、处理用户输入和管理时间(帧率)。通过
pg.init()初始化 Pygame,pg.display.set_mode()创建屏幕,pg.draw.circle()绘制圆形等操作。 -
随机数生成:代码广泛使用了 Python 的
random库来生成随机数,这些随机数控制了烟花和粒子的颜色、速度、方向、爆炸大小等。ra.randint()和ra.uniform()用于生成随机的整数和浮动数值,模拟烟花的自然和不确定性。 -
物理模拟:在代码中,物理效果主要体现在重力和粒子的运动上。使用 Pygame 提供的
Vector2类来表示粒子的二维坐标和速度,模拟烟花粒子的运动和加速度。通过apply_force()和move()方法,粒子会受重力等外力影响,产生自然的运动轨迹。 -
粒子系统:烟花爆炸产生的效果是通过粒子系统实现的。每个烟花爆炸时会生成多个粒子对象,每个粒子都有自己的颜色、大小、速度和生命周期。粒子不断地移动并逐渐衰退,最终消失。粒子系统模拟了真实世界中烟花散开后的效果。
-
路径追踪(Trail):每个粒子都有一个尾迹(Trail),在移动过程中,粒子在自己的路径上留下痕迹,这种效果通过记录粒子之前的多个位置来实现。
Trail类用于生成和显示粒子的路径。尾迹颜色和大小逐渐变化,模拟烟花轨迹逐渐消失的效果。 -
图形渲染:通过 Pygame 提供的
pg.draw.circle()和screen.blit()方法,代码绘制了粒子、烟花和文本。screen.fill()用于填充背景色,确保每一帧都能清除掉前一帧的内容。每个粒子和烟花的显示由show()方法控制,确保它们在屏幕上正确呈现。 -
动态文本渲染:使用
pg.font.SysFont()和font.render()渲染文本。代码将 "Happy New Year!" 文本以特定字体和颜色显示在屏幕中央,模拟节日庆祝的氛围。 -
事件处理和程序控制:代码通过
pg.event.get()获取并处理 Pygame 中的事件。pg.QUIT事件用于监听关闭窗口的操作。游戏的主循环中使用了running标志来控制程序是否继续运行。通过clock.tick(99)控制帧率,确保每秒运行 99 帧。 -
对象导向编程:代码采用了面向对象的编程方式,定义了多个类(如
Firework、Particle和Trail)来封装烟花、粒子和痕迹的行为和属性。这种方式有助于代码的结构化和模块化,便于扩展和维护。
完整代码
import pygame as pg
import random as ra
import mathpg.init()
pg.display.set_caption("🎇")winScreen = pg.display.Info()
screenWidth = winScreen.current_w
screenHeight = winScreen.current_hvector = pg.math.Vector2trail_colors = [(45, 45, 45), (60, 60, 60), (75, 75, 75), (125, 125, 125), (150, 150, 150)]# 烟花类
class Firework:def __init__(self):# 随机生成颜色self.colour = (ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255))# 随机生成三种颜色self.colours = ((ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)),(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)),(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)))# 生成一个表示发射出的火花的粒子对象self.firework = Particle(ra.randint(0,screenWidth), screenHeight, True, self.colour)# 初始化爆炸状态为 Falseself.exploded = Falseself.particles = []# 爆炸产生的粒子数量范围self.min_max_particles = vector(666, 999)def update(self, win):g = vector(0, ra.uniform(0.15, 0.4))if not self.exploded:# 给发射出的火花施加重力self.firework.apply_force(g)self.firework.move()for tf in self.firework.trails:tf.show(win)self.show(win)if self.firework.vel.y >= 0:self.exploded = Trueself.explode()else:for particle in self.particles:# 给爆炸产生的粒子施加随机力particle.apply_force(vector(g.x + ra.uniform(-1, 1) / 20, g.y / 2 + (ra.randint(1, 8) / 100)))particle.move()for t in particle.trails:t.show(win)particle.show(win)def explode(self):amount = ra.randint(int(self.min_max_particles.x), int(self.min_max_particles.y))for i in range(amount):# 在爆炸位置生成粒子对象并添加到粒子列表中self.particles.append(Particle(self.firework.pos.x, self.firework.pos.y, False, self.colours))def show(self, win):# 绘制发射出的火花pg.draw.circle(win, self.colour, (int(self.firework.pos.x), int(self.firework.pos.y)), self.firework.size)def remove(self):if self.exploded:for p in self.particles:if p.remove is True:self.particles.remove(p)if len(self.particles) == 0:return Trueelse:return False……
下载代码
下载链接:https://pan.quark.cn/s/b5eb09ad9065
代码分析
这段代码是使用 Python 和 Pygame 库实现的一个烟花动画程序。其主要功能是模拟烟花在屏幕上绽放的效果,结合了粒子系统和动态效果,通过类和方法进行模块化设计,具有较强的可扩展性。以下是对这段代码的详细分析,分为几个部分:程序初始化、类设计、粒子和火花效果的实现、显示与更新的过程以及主函数的运行机制。
1. 程序初始化与显示设置
程序开始时调用 pg.init() 来初始化 Pygame 库,这个调用非常关键,它会为所有 Pygame 模块做好初始化工作。接着,使用 pg.display.set_caption("🎇") 设置窗口标题为烟花的表情符号(🎇)。然后,通过 pg.display.Info() 获取当前屏幕的分辨率, screenWidth 和 screenHeight 分别存储屏幕的宽度和高度,用于后续创建窗口时设置显示区域大小。
vector = pg.math.Vector2 用于简化代码中二维向量的运算。pg.math.Vector2 提供了对二维向量的支持,可以很方便地进行加法、减法、乘法等操作。
2. 烟花类 (Firework)
class Firework:def __init__(self):self.colour = (ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255))self.colours = ((ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)),(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)),(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)))self.firework = Particle(ra.randint(0,screenWidth), screenHeight, True, self.colour)self.exploded = Falseself.particles = []self.min_max_particles = vector(666, 999)
Firework 类是整个烟花效果的核心。该类模拟了烟花从发射到爆炸的全过程。在构造函数中,首先随机生成烟花的颜色 self.colour,并且生成三种不同的颜色 self.colours,这些颜色将在爆炸后用于粒子的显示。
self.firework = Particle(ra.randint(0,screenWidth), screenHeight, True, self.colour) 创建了一个粒子对象,模拟烟花发射时的火花。self.exploded 用于标记烟花是否已经爆炸,self.particles 存储爆炸后的所有粒子。self.min_max_particles 表示爆炸后产生粒子的数量范围。
3. 粒子类 (Particle)
class Particle:def __init__(self, x, y, firework, colour):self.firework = fireworkself.pos = vector(x, y)self.origin = vector(x, y)self.radius = 25self.remove = Falseself.explosion_radius = ra.randint(15, 25)self.life = 0self.acc = vector(0, 0)self.trails = []self.prev_posx = [-10] * 10self.prev_posy = [-10] * 10if self.firework:self.vel = vector(0, -ra.randint(17, 20))self.size = 5self.colour = colourfor i in range(5):self.trails.append(Trail(i, self.size, True))else:self.vel = vector(ra.uniform(-1, 1), ra.uniform(-1, 1))self.vel.x *= ra.randint(7, self.explosion_radius + 2)self.vel.y *= ra.randint(7, self.explosion_radius + 2)self.size = ra.randint(2, 4)self.colour = ra.choice(colour)for i in range(5):self.trails.append(Trail(i, self.size, False))
Particle 类代表了烟花中的单个粒子。它包含了烟花发射和爆炸过程中粒子的所有物理属性和视觉效果。
self.pos是粒子的位置,self.origin是初始位置。self.vel和self.acc分别表示粒子的速度和加速度,使用pg.math.Vector2进行向量运算。self.trails存储粒子的痕迹(烟花尾迹),它是一个列表,包含多个Trail对象。self.life控制粒子的生命周期,self.remove标记粒子是否应该被移除。
在构造函数中,依据粒子是烟花发射出来的火花还是爆炸后的粒子,设置了不同的初速度、大小、颜色等属性。火花的速度较大,并且其尾迹动态显示;爆炸后的粒子速度较小,颜色随机。
4. 痕迹类 (Trail)
Trail 类表示粒子尾迹的效果。在构造函数中,self.dynamic 用于区分动态尾迹和静态尾迹。动态尾迹的颜色和大小会随着时间变化,静态尾迹则显示为固定的颜色和较小的尺寸。
5. 烟花更新与显示
update 函数用于更新所有烟花的状态。它遍历每个烟花对象,调用其 update 方法来处理烟花的动画效果。如果某个烟花的所有粒子已经移除,则从 fireworks 列表中删除该烟花。
6. 主函数 (fire)
fire 函数是程序的主入口,负责创建窗口、初始化时钟、设置烟花效果和显示文本。
首先,使用 pg.display.set_mode 创建窗口,并根据屏幕大小动态设置窗口的尺寸。接着,创建一个时钟对象 clock,用于控制游戏的帧率。fireworks 列表初始化了两个烟花对象。文本部分使用 pg.font.SysFont 加载系统字体,生成一个显示“Happy New Year!”的文本,并计算文本在屏幕上的位置。
7. 游戏循环
while running:clock.tick(99)for event in pg.event.get():if event.type == pg.QUIT:running = Falsescreen.fill((20, 20, 30))screen.blit(rendered_text, (text_x, text_y))if ra.randint(0, 10) == 1:fireworks.append(Firework())update(screen, fireworks)
游戏进入主循环,每一帧更新烟花的状态并显示在屏幕上。通过 clock.tick(99) 控制帧率为 99 帧每秒。每次循环中,如果有退出事件,则终止程序。窗口背景色填充为深色 (20, 20, 30),然后绘制上一步计算出的文本。
在每一帧中,可能会随机生成新的烟花对象(通过 ra.randint(0, 10) == 1 来决定),然后更新所有烟花的显示效果。
8. 总结
这段代码通过精心设计的 Firework、Particle 和 Trail 类,以及通过粒子系统模拟了烟花从发射到爆炸的过程。每个粒子都有自己的物理行为,如速度、加速度和尾迹效果,且随着时间的推移,粒子的生命周期逐渐结束,最终消失。这段代码不仅展示了烟花的动画效果,还包含了多种粒子动态效果,如随机颜色、速度、尾迹
注意事项
如遇到问题"no module named pygame",请在终端输入"pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame",等待pygame库安装完成后再运行程序
写在后面
我是一只有趣的兔子,感谢你的喜欢!
相关文章:
Python跨年烟花
目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…...
【代码】Python|Windows 批量尝试密码去打开加密的 Word 文档(docx和doc)
文章目录 前言完整代码Githubdocxdoc 代码解释1. msoffcrypto 方法(用于解密 .docx 文件)read_secret_word_file 函数密码生成与解密尝试try_decrypt_file 函数 2. comtypes 方法(用于解密 .doc 文件)read_secret_word_file 函数注…...
java开发中注解汇总
注解作用位置注意mybatis Data Getter Setter ToString EqualsAndHashCode AllArgsConstructor NoArgsConstructor Data 代替:无参构造,get,set,toString,hashCode,equals Getter Setter 可放在类和方法上&…...
C# 设计模式(结构型模式):外观模式
C# 设计模式(结构型模式):外观模式 (Facade Pattern) 在复杂系统中,往往会涉及到多个子系统、模块和类。这些子系统的接口和功能可能会让使用者感到困惑和复杂。在这种情况下,我们可以使用外观模式(Facade…...
PowerShell 常见问题解答
PowerShell 是微软开发的一种功能强大的命令行界面和脚本语言,广泛应用于系统管理和自动化任务。以下是一些使用 PowerShell 时常见的问题及其解决方法。 什么是 PowerShell? PowerShell 是基于 .NET 的命令行界面(CLI)和脚本语言…...
计算机网络 (15)宽带接入技术
前言 计算机网络宽带接入技术是指通过高速、大容量的通信信道或网络,实现用户与互联网或其他通信网络之间的高速连接。 一、宽带接入技术的定义与特点 定义:宽带接入技术是指能够传输大量数据的通信信道或网络,其传输速度通常较高,…...
前端Python应用指南(六)构建RESTful API:使用Flask和Django实现用户认证与授权
《写给前端的python应用指南》系列: (一)快速构建 Web 服务器 - Flask vs Node.js 对比(二)深入Flask:理解Flask的应用结构与模块化设计(三)Django vs Flask:哪种框架适…...
【Unity3D】基于UGUI——简易版 UI框架
https://github.com/AMikeW/BStandShaderResources/blob/master/milk_UIFramework.unitypackage UI框架支持如下功能: 1、层级控制 2、支持面板多次打开时,隐藏前一个打开的面板,当关闭面板时,能够恢复前一个打开面板状态 3、支…...
算法排序算法
文章目录 快速排序[leetcode 215数组中的第K个最大元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/)分析题解快速排序 桶排序[leetcode 347 前K个高频元素](https://leetcode.cn/problems/top-k-frequent-elements/)分析题解 快速排序 leetcode 215数组…...
第3章 总线
总线的定义 为多个部件 分时共享 公共信息传送线路。 系统之间、模块之间、芯片内部用来传递信息信号线集合。 共享 总线上可连接多个部件 各部件间相互交换信息 都可通过总线来。 分时 同一时刻 总线上只能传 一个部件信息。 采用标准总线的优点 简化系统软硬件设计 从硬件角度…...
手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电
手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中,我们论述了局域网SIP坐席通过手机外呼出去时,手机中主副卡的呼叫调度策略。 但…...
共阳极LED的控制与短路问题解析
共阳极LED的控制与短路问题解析 在电子电路中,LED(发光二极管)是最常见的元件之一。LED的连接方式分为共阳极和共阴极,不同的连接方式决定了LED的控制逻辑。本文将重点讲解共阳极LED的工作原理,并解答“为什么给1不会…...
华为消费级QLC SSD来了
近日,有关消息显示,华为的消费级SSD产品线,eKitStor Xtreme 200E系列,在韩国一家在线零售商处首次公开销售,引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年,但直到今年6月才正式推出面向…...
liunx下载gitlab
1.地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 安装 postfix 并启动 yum install postfix systemctl start postfix systemctl enable postfix ssh服务启动 systemctl enable sshd systemctl start sshd开放 ssh 以及 http 服务,…...
深度学习模型预测值集中在某一个值
深度学习模型,训练过程中,经常遇到预测的结果集中在某个值,而且在学习的过程中会变,样例如下。 主要有如下解决方案 1、更换relu ->tanh 或者其他激活函数 2、更改随机种子,估计是没有初始化好,或者调…...
Sqoop的使用
每个人的生活都是一个世界,即使最平凡的人也要为他那个世界的存在而战斗。 ——《平凡的世界》 目录 一、sqoop简介 1.1 导入流程 1.2 导出流程 二、使用sqoop 2.1 sqoop的常用参数 2.2 连接参数列表 2.3 操作hive表参数 2.4 其它参数 三、sqoop应用 - 导入…...
OpenGL ES 04 图片数据是怎么写入到对应纹理单元的
从指定路径加载图像并转换为 CGImage。获取图像的宽度和高度。创建一个 RGB 颜色空间。为图像数据分配内存。创建一个位图上下文并将图像绘制到上下文中。创建一个新的纹理对象并绑定到指定的纹理单元。指定二维纹理图像。释放分配的内存。设置纹理参数,包括放大和缩…...
C# 设计模式的六大原则(SOLID)
C# 设计模式的六大原则(SOLID) 引言 在面向对象编程中,设计模式提供了高效、可复用和可维护的代码结构。SOLID原则是软件设计中的一组重要原则,用于确保代码具有良好的可维护性、可扩展性和灵活性。SOLID是五个设计原则的首字母…...
数据库自增 id 过大导致前端时数据丢失
可以看到,前端响应参数是没有丢失精度的 但是在接受 axios 请求参数时出现了精度丢失 解决方案一:改变 axios 字符编码 axios.defaults.headers[Content-Type] application/json;charsetUTF-8; 未解决 解决方案二:手动使用 json.parse() …...
第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
自然语言处理(NLP)中的词嵌入(Word2Vec、GloVe)技术,是NLP领域的重要组成部分,它们为词汇提供了高维空间到低维向量的映射,使得语义相似的词汇在向量空间中的距离更近。以下是对这些技术的详细解…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
