Python新春烟花

news2025/1/22 22:07:12

目录

系列文章

写在前面

技术需求

完整代码

下载代码

代码分析

1. 程序初始化与显示设置

2. 烟花类 (Firework)

3. 粒子类 (Particle)

4. 痕迹类 (Trail)

5. 烟花更新与显示

6. 主函数 (fire)

7. 游戏循环

8. 总结

注意事项

写在后面


系列文章

序号直达链接
爱心系列
1Python制作一个无法拒绝的表白界面
2Python满屏飘字表白代码
3Python无限弹窗满屏表白代码
4Python李峋同款可写字版跳动的爱心
5Python流星雨代码
6Python漂浮爱心代码
7Python爱心光波代码
8Python普通的玫瑰花代码
9Python炫酷的玫瑰花代码
10Python多彩的玫瑰花代码
节日系列
1Python动漫风烟花秀代码
2Python新年烟花秀代码
3Python圣诞礼物代码
4Python画圣诞树代码
5Python可爱版圣诞树丨绿色
6Python可爱版圣诞树丨粉色
7Python大雪纷飞代码
8Python生日蛋糕代码
9Python五彩气球代码
10Python国庆祝福代码
11Python万圣礼物代码
12Python愚人节礼物代码
13Python浪漫星空代码
14Python樱花树代码
动漫系列
1Python名侦探柯南
2Python喜羊羊
3Python懒羊羊
4Python沸羊羊
5Python小灰灰
6Python小香香
7Python灰太狼
8Python海绵宝宝
9Python哆啦A梦
10Python凯蒂猫
11Python猫和老鼠
12Python草莓熊
13Python迷你皮卡丘
14Python高级皮卡丘
15Python豪华皮卡丘
16Python史迪仔
17Python小熊猫
18Python蜘蛛侠
19Python可爱版蜡笔小新
20Python萌萌的蜡笔小新
21Python罗小黑
22Python猪猪侠
炫酷系列
1  Python张万森下雪了
2Python一闪一闪亮晶晶
3Python黑客帝国代码雨
4Python七彩花朵
5Python模拟3D星空
6Python金榜题名
7Python满天星

写在前面

Python语言实现新年烟花秀的完整代码。

技术需求

  1. Pygame 库Pygame 是 Python 的一个游戏开发库,用于制作视频游戏和图形应用程序。在此代码中,Pygame 被用来创建图形界面、绘制图形、处理用户输入和管理时间(帧率)。通过 pg.init() 初始化 Pygame,pg.display.set_mode() 创建屏幕,pg.draw.circle() 绘制圆形等操作。

  2. 随机数生成:代码广泛使用了 Python 的 random 库来生成随机数,这些随机数控制了烟花和粒子的颜色、速度、方向、爆炸大小等。ra.randint()ra.uniform() 用于生成随机的整数和浮动数值,模拟烟花的自然和不确定性。

  3. 物理模拟:在代码中,物理效果主要体现在重力和粒子的运动上。使用 Pygame 提供的 Vector2 类来表示粒子的二维坐标和速度,模拟烟花粒子的运动和加速度。通过 apply_force()move() 方法,粒子会受重力等外力影响,产生自然的运动轨迹。

  4. 粒子系统:烟花爆炸产生的效果是通过粒子系统实现的。每个烟花爆炸时会生成多个粒子对象,每个粒子都有自己的颜色、大小、速度和生命周期。粒子不断地移动并逐渐衰退,最终消失。粒子系统模拟了真实世界中烟花散开后的效果。

  5. 路径追踪(Trail):每个粒子都有一个尾迹(Trail),在移动过程中,粒子在自己的路径上留下痕迹,这种效果通过记录粒子之前的多个位置来实现。Trail 类用于生成和显示粒子的路径。尾迹颜色和大小逐渐变化,模拟烟花轨迹逐渐消失的效果。

  6. 图形渲染:通过 Pygame 提供的 pg.draw.circle()screen.blit() 方法,代码绘制了粒子、烟花和文本。screen.fill() 用于填充背景色,确保每一帧都能清除掉前一帧的内容。每个粒子和烟花的显示由 show() 方法控制,确保它们在屏幕上正确呈现。

  7. 动态文本渲染:使用 pg.font.SysFont()font.render() 渲染文本。代码将 "Happy New Year!" 文本以特定字体和颜色显示在屏幕中央,模拟节日庆祝的氛围。

  8. 事件处理和程序控制:代码通过 pg.event.get() 获取并处理 Pygame 中的事件。pg.QUIT 事件用于监听关闭窗口的操作。游戏的主循环中使用了 running 标志来控制程序是否继续运行。通过 clock.tick(99) 控制帧率,确保每秒运行 99 帧。

  9. 对象导向编程:代码采用了面向对象的编程方式,定义了多个类(如 FireworkParticleTrail)来封装烟花、粒子和痕迹的行为和属性。这种方式有助于代码的结构化和模块化,便于扩展和维护。

完整代码

import pygame as pg
import random as ra
import math

pg.init()
pg.display.set_caption("🎇")

winScreen = pg.display.Info()
screenWidth = winScreen.current_w
screenHeight = winScreen.current_h

vector = pg.math.Vector2

trail_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, 
…………

代码分析

这段代码是使用 Python 和 Pygame 库实现的一个烟花动画程序。其主要功能是模拟烟花在屏幕上绽放的效果,结合了粒子系统和动态效果,通过类和方法进行模块化设计,具有较强的可扩展性。以下是对这段代码的详细分析,分为几个部分:程序初始化、类设计、粒子和火花效果的实现、显示与更新的过程以及主函数的运行机制。

1. 程序初始化与显示设置

pg.init()
pg.display.set_caption("🎇")

winScreen = pg.display.Info()
screenWidth = winScreen.current_w
screenHeight = winScreen.current_h

vector = pg.math.Vector2

程序开始时调用 pg.init() 来初始化 Pygame 库,这个调用非常关键,它会为所有 Pygame 模块做好初始化工作。接着,使用 pg.display.set_caption("🎇") 设置窗口标题为烟花的表情符号(🎇)。然后,通过 pg.display.Info() 获取当前屏幕的分辨率, screenWidthscreenHeight 分别存储屏幕的宽度和高度,用于后续创建窗口时设置显示区域大小。

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 = False
        self.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 = firework
        self.pos = vector(x, y)
        self.origin = vector(x, y)
        self.radius = 25
        self.remove = False
        self.explosion_radius = ra.randint(15, 25)
        self.life = 0
        self.acc = vector(0, 0)
        self.trails = []
        self.prev_posx = [-10] * 10
        self.prev_posy = [-10] * 10
        if self.firework:
            self.vel = vector(0, -ra.randint(17, 20))
            self.size = 5
            self.colour = colour
            for 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.velself.acc 分别表示粒子的速度和加速度,使用 pg.math.Vector2 进行向量运算。
  • self.trails 存储粒子的痕迹(烟花尾迹),它是一个列表,包含多个 Trail 对象。
  • self.life 控制粒子的生命周期,self.remove 标记粒子是否应该被移除。

在构造函数中,依据粒子是烟花发射出来的火花还是爆炸后的粒子,设置了不同的初速度、大小、颜色等属性。火花的速度较大,并且其尾迹动态显示;爆炸后的粒子速度较小,颜色随机。

4. 痕迹类 (Trail)

class Trail:
    def __init__(self, n, size, dynamic):
        self.pos_in_line = n
        self.pos = vector(-10, -10)
        self.dynamic = dynamic
        if self.dynamic:
            self.colour = trail_colors[n]
            self.size = int(size - n / 2)
        else:
            self.colour = (255, 255, 200)
            self.size = size - 2
            if self.size < 0:
                self.size = 0

Trail 类表示粒子尾迹的效果。在构造函数中,self.dynamic 用于区分动态尾迹和静态尾迹。动态尾迹的颜色和大小会随着时间变化,静态尾迹则显示为固定的颜色和较小的尺寸。

5. 烟花更新与显示

def update(win, fireworks):
    for fw in fireworks:
        fw.update(win)
        if fw.remove():
            fireworks.remove(fw)

    pg.display.update()

update 函数用于更新所有烟花的状态。它遍历每个烟花对象,调用其 update 方法来处理烟花的动画效果。如果某个烟花的所有粒子已经移除,则从 fireworks 列表中删除该烟花。

6. 主函数 (fire)

def fire():
    screen = pg.display.set_mode((screenWidth, screenHeight - 66))
    clock = pg.time.Clock()
    fireworks = [Firework() for i in range(2)]
    running = True
    font = pg.font.SysFont("comicsansms", 99)
    text = "Happy New Year!"
    text_color = (255, 190, 200)
    rendered_text = font.render(text, True, text_color)

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 = False
    screen.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. 总结

这段代码通过精心设计的 FireworkParticleTrail 类,以及通过粒子系统模拟了烟花从发射到爆炸的过程。每个粒子都有自己的物理行为,如速度、加速度和尾迹效果,且随着时间的推移,粒子的生命周期逐渐结束,最终消失。这段代码不仅展示了烟花的动画效果,还包含了多种粒子动态效果,如随机颜色、速度、尾迹

注意事项

如遇到问题"no module named pygame",请在终端输入"pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame",等待pygame库安装完成后再运行程序

写在后面

我是一只有趣的兔子,感谢你的喜欢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode 24】151.翻转字符串里的单词==❗没看懂❗==

思路&#xff1a; 一些同学会使用split库函数&#xff0c;分隔单词&#xff0c;然后定义一个新的string字符串&#xff0c;最后再把单词倒序相加&#xff0c;那么这道题题目就是一道水题了&#xff0c;失去了它的意义。 所以这里我还是提高一下本题的难度&#xff1a;不要使用辅…

STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态

STM32W5500以太网应用开发003_TCP服务器添加OLED&#xff08;u8g2&#xff09;显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…

Oracle审计

审计是监控选定的用户数据库操作的过程 审计的目的&#xff1a; 调查可疑的数据库活动&#xff1a; 审计可以帮助检测和跟踪潜在的 security breaches、未授权的访问尝试或其他异常行为。通过分析审计日志&#xff0c;可以确定可疑活动的来源、时间、频率和影响。 收集特定数…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上&#xff0c;亚马逊云科技宣布推出新一代基础模型Amazon Nova&#xff0c;其隶属于Amazon Bedrock&#xff0c;这些模型精准切入不同领域&#xff0c;解锁多元业务可能&#xff0c;为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

2025 OWASP十大智能合约漏洞

随着去中心化金融&#xff08;DeFi&#xff09;和区块链技术的不断发展&#xff0c;智能合约安全的重要性愈发凸显。在此背景下&#xff0c;开放网络应用安全项目&#xff08;OWASP&#xff09;发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…

力扣面试经典题

目录 前言 一、合并两个有序数组 二、移除元素 三、删除有序数组的重复项 四、删除有序数组的重复项Ⅱ 五、取数组中出现次数大于数组长度/2的元素 六、移动数组元素 七、计算数组中相差最大的值 八、字母异位词分组 九、最长连续序列 十、移动0 十一、盛水最多的容…

【RabbitMq】RabbitMq高级特性-延迟消息

延迟消息 什么是延迟消息死信交换机延迟消息插件-DelayExchange其他文章 什么是延迟消息 延迟消息&#xff1a;发送者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间之后才收到消息。 延迟任务&#xff1a;设置在一定时间之后才执行的任…

抖音小程序一键获取手机号

前端代码组件 <button v-if"!isFromOrderList"class"get-phone-btn" open-type"getPhoneNumber"getphonenumber"onGetPhoneNumber">一键获取</button>// 获取手机号回调onGetPhoneNumber(e) {var that this tt.login({f…

CSS:语法、样式表、选择器

目录 一、语法 二、创建 外部样式表 内部样式表 内联样式 三、选择器 ID选择器 类选择器 伪类选择器 :hover a:link a:active a:visited 属性选择器 伪元素选择器 ::first-letter ::first-line ::selection ::placeholder ::before 和::after 通配选择器 标…

配电自动化中的进线监控技术

进线监控技术是配电网自动化中的一项关键技术&#xff0c;它主要用于对配电网进线变电站的开关状态以及母线电压、电流、有功功率、无功功率及电度量等参数进行实时监测。以下是对进线监控技术的详细介绍&#xff1a; 一、技术原理 进线监控技术基于传感器技术、数据采集技术、…

【三维分割】Gaga:通过3D感知的 Memory Bank 分组任意高斯

文章目录 摘要一、引言二、主要方法2.1 3D-aware Memory Bank2.2 三维分割的渲染与下游应用 三、实验消融实验应用: Scene Manipulation 地址&#xff1a;https://www.gaga.gallery 标题&#xff1a;Gaga: Group Any Gaussians via 3D-aware Memory Bank 来源&#xff1a;加利福…

《王者荣耀》皮肤爬虫源码

1.爬取网页 https://pvp.qq.com/web201605/herolist.shtml 2.python代码 import requests from bs4 import BeautifulSoup import os import threading from queue import Queuedef mul(x):if not os.path.exists(x):os.mkdir(x)print("目录创建成功")else:pass h…

iconfont等图标托管网站上传svg显示未轮廓化解决办法

打开即时设计 即时设计 - 可实时协作的专业 UI 设计工具 导入图标后拖入画板里面&#xff0c;右键选择轮廓化 将图标导出

【Linux系列】查看服务器是否使用了 SSD 的多种方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【AIGC】ChatGPT 的 Prompt Hacker 技巧:让简历轻松通过 AI 筛选

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;背景简化简历格式 &#x1f4af;简化 Prompt Hacker 的逻辑使用 Prompt Hacker 技巧**示例 Prompt&#xff1a;引导 AI 筛选简历**如何利用 Prompt 优化简历筛…

AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引发DDoS风险/OpenAI 代理工具即将发布

1、OpenAI 的安全疏忽&#xff1a;ChatGPT API 漏洞引发DDoS风险 德国安全研究员 Benjamin Flesch 发现了一个严重的安全漏洞&#xff1a;攻击者可以通过向 ChatGPT API 发送一个 HTTP 请求&#xff0c;利用 ChatGPT 的爬虫对目标网站发起 DDoS 攻击。该漏洞源于 OpenAI 在处理…

windows下使用docker执行器并配置 hosts 解析

本篇目录 1. 问题背景2. 环境准备2.1 云上开通windows 2022 英文版机器2.1.1 安装 git2.1.2 安装 runner2.1.3 装docker2.1.4 注册runner并使用docker执行器 3. 项目信息3.1 编写window bat脚本3.2 项目.gitlab-ci.yml文件 4. 测试结论4.1 运行流水线 5. troubleshooting问题1&…

centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐

环境&#xff1a;centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…

靶机复现-pikachu靶机文件包含漏洞

本篇文章旨在为网络安全渗透测试靶机复现学习。通过阅读本文&#xff0c;读者将能够对渗透pikachu靶场文件包含漏洞复现有一定的了解 原文学习链接 CSDN博主&#xff1a;One_Blanks主页地址 靶机资源下载 PHPStudy pikachu 一、前言 文件包含漏洞是编程中的一种安全隐患&a…

【机器学习实战高阶】基于深度学习的图像分割

机器学习项目图像分割 你可能已经注意到&#xff0c;大脑如何快速高效地识别并分类眼睛感知到的事物。大脑以某种方式进行训练&#xff0c;以便能够从微观层面分析所有内容。这种能力有助于我们从一篮子橙子中分辨出一个苹果。 计算机视觉是计算机科学的一个领域&#xff0c;…