Python 烟花展示:使用 Pygame 创建绚丽的夜空

news2024/9/25 16:38:49

在Python中,使用pygame库可以轻松地创建图形和动画效果,非常适合制作各种游戏和视觉展示。今天,我们将一起探索如何使用pygame来制作一个简单的烟花展示程序。这个程序将模拟烟花在夜空中绽放的壮丽景象,通过随机生成的粒子来模拟烟花的爆炸效果。

在这里插入图片描述

准备工作

首先,确保你已经安装了pygame库。如果还没有安装,可以通过pip命令来安装:

pip install pygame

导入必要的库

import pygame  # 导入pygame库,用于处理图形和事件  
import random  # 导入random库,用于生成随机数  
import math  # 导入math库,用于数学运算  
import sys  # 导入sys库,用于控制程序的退出

初始化pygame和设置窗口

# 初始化pygame  
pygame.init()  
  
# 设置窗口  
WIDTH, HEIGHT = 640, 480  # 设置窗口的宽度和高度  
screen = pygame.display.set_mode((WIDTH, HEIGHT))  # 创建一个窗口对象  
pygame.display.set_caption('Python 烟花展示')  # 设置窗口的标题

定义颜色和粒子类

# 定义新的颜色列表,并打乱它  
COLORS = [(255, 165, 0), (128, 0, 128), (0, 255, 127), (255, 140, 0), (0, 191, 255), (255, 32, 128), (64, 224, 208)]  
random.shuffle(COLORS)  
  
# 定义粒子类  
class Particle:  
    def __init__(self, x, y, dx, dy, color, size=3, alpha=255):  
        self.x = x  # 粒子的x坐标  
        self.y = y  # 粒子的y坐标  
        self.dx = dx  # 粒子在x方向上的速度  
        self.dy = dy  # 粒子在y方向上的速度  
        self.color = color  # 粒子的颜色(RGB格式)  
        self.size = size  # 粒子的大小  
        self.alpha = alpha  # 粒子的透明度  
  
    def update(self):  
        self.x += self.dx  # 更新粒子的x坐标  
        self.y += self.dy  # 更新粒子的y坐标  
        self.dy += 0.1  # 粒子受到重力的影响,y方向速度增加  
        self.alpha -= 5  # 粒子的透明度逐渐降低  
  
    def draw(self, surface):  
        # 注意:pygame的draw函数不支持直接的RGBA颜色,所以这里仅使用RGB并忽略alpha值,通过透明度处理实现淡出效果  
        pygame.draw.circle(surface, (self.color[0], self.color[1], self.color[2]), (int(self.x), int(self.y)), self.size)

定义烟花类

# 定义烟花类  
class Firework:  
    def __init__(self, x, y, color, particle_count=50):  
        self.x = x  # 烟花的x坐标  
        self.y = y  # 烟花的y坐标  
        self.color = color  # 烟花的颜色  
        self.particles = [self.create_particle() for _ in range(particle_count)]  # 初始化烟花的粒子列表  
  
    def create_particle(self):  
        angle = random.uniform(0, 2 * math.pi)  # 随机生成一个角度  
        speed = random.uniform(1, 6)  # 随机生成一个速度  
        dx = speed * math.cos(angle)  # 计算x方向上的速度分量  
        dy = speed * math.sin(angle)  # 计算y方向上的速度分量  
        size = random.randint(2, 6)  # 随机生成粒子的大小  
        return Particle(self.x, self.y, dx, dy, self.color, size)  
  
    def update(self):  
        self.particles = [p for p in self.particles if p.alpha > 0]  # 过滤出仍然可见的粒子  
        for particle in self.particles:  
            particle.update()  # 更新每个粒子的状态  
  
    def draw(self):  
        for particle in self.particles:  
            particle.draw(screen)  # 将粒子绘制到屏幕上

主循环和烟花生成

# 烟花列表  
fireworks = []  
  
# 主循环  
clock = pygame.time.Clock()  
running = True  
while running:  
    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            running = False  
  
    screen.fill((0, 0, 0))  # 清屏  
    if random.random() < 0.05:  # 以较低的概率生成新的烟花  
        x = random.randint(0, WIDTH)  
        y = random.randint(HEIGHT // 2, HEIGHT)  
        color = random.choice(COLORS)  
        fireworks.append(Firework(x, y, color, particle_count=random.randint(30, 70)))  
  
    for firework in fireworks[:]:  # 遍历烟花列表的副本  
        firework.update()  
        if not firework.particles:  
            fireworks.remove(firework)  
        firework.draw()  
  
    pygame.display.flip()  # 更新屏幕  
    clock.tick(60)  # 设置帧率为60帧/秒  
  
pygame.quit()  # 退出pygame  
sys.exit()  # 退出程序

完整代码

import pygame  # 导入pygame库,用于处理图形和事件  
import random  # 导入random库,用于生成随机数  
import math  # 导入math库,用于数学运算  
import sys  # 导入sys库,用于控制程序的退出  
  
# 初始化pygame  
pygame.init()  # 初始化pygame模块,为使用pygame功能做准备  
  
# 设置窗口  
WIDTH, HEIGHT = 640, 480  # 设置窗口的宽度和高度  
screen = pygame.display.set_mode((WIDTH, HEIGHT))  # 创建一个窗口对象  
pygame.display.set_caption('Python 烟花展示')  # 设置窗口的标题  
  
# 定义新的颜色列表,并打乱它  
COLORS = [(255, 165, 0), (128, 0, 128), (0, 255, 127), (255, 140, 0), (0, 191, 255), (255, 32, 128), (64, 224, 208)]  
random.shuffle(COLORS)  # 使用random.shuffle函数打乱颜色列表  
  
# 定义粒子类  
class Particle:  
    def __init__(self, x, y, dx, dy, color, size=3, alpha=255):  
        """初始化粒子对象,包括位置、速度、颜色、大小和透明度"""  
        self.x = x  # 粒子的x坐标  
        self.y = y  # 粒子的y坐标  
        self.dx = dx  # 粒子在x方向上的速度  
        self.dy = dy  # 粒子在y方向上的速度  
        self.color = color  # 粒子的颜色(RGBA格式,但这里只使用RGB)  
        self.size = size  # 粒子的大小  
        self.alpha = alpha  # 粒子的透明度  
  
    def update(self):  
        """更新粒子的位置和透明度"""  
        self.x += self.dx  # 更新粒子的x坐标  
        self.y += self.dy  # 更新粒子的y坐标  
        self.dy += 0.1  # 粒子受到重力的影响,y方向速度增加  
        self.alpha -= 5  # 粒子的透明度逐渐降低  
  
    def draw(self, surface):  
        """绘制粒子到指定的表面上,考虑透明度"""  
        # 注意:pygame的draw函数不支持直接的RGBA颜色,所以这里仅使用RGB并忽略alpha值,通过透明度处理实现淡出效果  
        pygame.draw.circle(surface, (self.color[0], self.color[1], self.color[2]), (int(self.x), int(self.y)), self.size)  
  
# 定义烟花类  
class Firework:  
    def __init__(self, x, y, color, particle_count=50):  
        """初始化烟花对象,包括位置、颜色、粒子数量,并创建初始粒子"""  
        self.x = x  # 烟花的x坐标  
        self.y = y  # 烟花的y坐标  
        self.color = color  # 烟花的颜色  
        self.particles = [self.create_particle() for _ in range(particle_count)]  # 初始化烟花的粒子列表  
  
    def create_particle(self):  
        """创建一个新的粒子,随机确定其初始速度和方向"""  
        angle = random.uniform(0, 2 * math.pi)  # 随机生成一个角度  
        speed = random.uniform(1, 6)  # 随机生成一个速度  
        dx = speed * math.cos(angle)  # 计算x方向上的速度分量  
        dy = speed * math.sin(angle)  # 计算y方向上的速度分量  
        size = random.randint(2, 6)  # 随机生成粒子的大小  
        return Particle(self.x, self.y, dx, dy, self.color, size)  
  
    def update(self):  
        """更新烟花的所有粒子,并移除已经完全透明的粒子"""  
        self.particles = [p for p in self.particles if p.alpha > 0]  # 过滤出仍然可见的粒子  
        for particle in self.particles:  
            particle.update()  # 更新每个粒子的状态  
  
    def draw(self):  
        """绘制烟花的所有粒子"""  
        for particle in self.particles:  
            particle.draw(screen)  # 将粒子绘制到屏幕上  
  
# 烟花列表  
fireworks = []  
  
# 主循环  
clock = pygame.time.Clock()  # 创建一个Clock对象用于控制帧率  
running = True  # 控制主循环的标志位  
while running:  
    for event in pygame.event.get():  # 遍历所有事件  
        if event.type == pygame.QUIT:  # 如果事件是关闭窗口  
            running = False  # 退出主循环  
  
    screen.fill((0, 0, 0))  # 用黑色填充整个屏幕,清屏  
    if random.random() < 0.05:  # 以较低的概率生成新的烟花  
        x = random.randint(0, WIDTH)  # 随机生成烟花的x坐标  
        y = random.randint(HEIGHT // 2, HEIGHT)  # 随机生成烟花的y坐标(从屏幕中间偏上到顶部)  
        color = random.choice(COLORS)  # 从打乱后的颜色列表中随机选择一个颜色  
        fireworks.append(Firework(x, y, color, particle_count=random.randint(30, 70)))  # 创建一个新的烟花对象并添加到列表中  
  
    for firework in fireworks[:]:  # 遍历烟花列表的副本(避免在迭代过程中修改列表)  
        firework.update()  # 更新烟花的状态  
        if not firework.particles:  # 如果烟花的粒子列表为空(即所有粒子都已消失)  
            fireworks.remove(firework)  # 从列表中移除该烟花  
        firework.draw()  # 绘制烟花  
  
    pygame.display.flip()  # 更新整个屏幕的内容  
    clock.tick(60)  # 设置帧率为60帧/秒  
  
pygame.quit()  # 退出pygame  
sys.exit()  # 退出程序

推荐阅读

Python基础

Python全网最全基础课程笔记(一)——基础入门
Python全网最全基础课程笔记(二)——变量
Python全网最全基础课程笔记(三)——所有运算符+运算符优先级
Python全网最全基础课程笔记(四)——基本数据类型
Python全网最全基础课程笔记(五)——选择结构+Python新特性Match
Python全网最全基础课程笔记(六)——循环结构
Python全网最全基础课程笔记(七)——列表,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(八)——字典,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(九)——集合,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十)——元组,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十一)——字符串所有操作,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十二)——函数,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十三)——作用域,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Flink入门到就业

2024年最新Flink教程,从基础到就业,大家一起学习–基础篇
2024年最新Flink教程,从基础到就业,大家一起学习–入门篇
2024年最新Flink教程,从基础到就业,大家一起学习–Flink集群部署
2024年最新Flink教程,从基础到就业,大家一起学习–flink部署和集群部署(从本地测试到公司生产环境如何部署项目源码)
2024年最新Flink教程,从基础到就业,大家一起学习–Flink运行架构底层源码详解+实战
2024年最新Flink教程,从基础到就业,大家一起学习–Flink DataStream API-第一篇+源码讲解

在这里插入图片描述

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

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

相关文章

MQTT客户端实战:从连接到通信。详细说明MQTT客户端和MQTT代理进行通信

EMQX安装 EMQX服务器安装 安装文档&#xff0c;见链接不另外写 https://docs.emqx.com/zh/emqx/latest/deploy/install-ubuntu.html 启动 EMQX 启动为一个 systemd 服务&#xff1a; sudo systemctl start emqx在windows安装客户端 在线 MQTT WebSocket 客户端工具&…

唯众智能化控制箱

为满足智慧城市、雪亮工程、智能交通、智慧农业等领域大数据信息化的管理要求&#xff0c;唯众自主研发设计了智能化控制箱&#xff0c;该产品是一款集智能网络传输、温湿度监测、门锁控制于一体的综合系统。该系统由先进的I/O网络模块、高精度传感器、强大的管理后端以及便捷的…

window下 php 安装 lua扩展

1.执行php -v 看看自己的php是什么版本 2.下载对应版本 https://pecl.php.net/package/lua 3.安装 php_lua.dll 放在 php的ext文件夹下 liblua.dll放在php的根目录下 4.编辑php.ini 5.重启 6. 执行 php -m

计算机毕业设计之:云中e百货微信小程序设计与实现(源码+文档+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

国内可用ChatGPT-4中文镜像网站整理汇总【持续更新】

一、GPT中文镜像网站 ① yixiaai.com 支持GPT4、4o以及o1&#xff0c;支持MJ绘画 ② chat.lify.vip 支持通用全模型&#xff0c;支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4&#xff0c;4o以及MJ绘画 二、模型知识 o1/o1-mini&#xff1a;最新的版本模型&am…

跑lvs出现soft connect怎么处理?

首先&#xff0c;我们先了解一下什么是soft connect。简而言之&#xff0c;就是工具会将所有连接在psub上的信号认作soft connect&#xff08;也就是short&#xff09;。如图1所示&#xff0c;VSS和AVSS都接到了p上&#xff0c;它们通过psub便有了soft connect。 如果有soft co…

AfuseKt1.3.6-10110功能强大的安卓网络视频播放器,支持多种在线存储和媒体管理平台!

AfuseKt 是一款功能强大的安卓网络视频播放器&#xff0c;专为满足用户对多样化媒体播放需求而设计。它不仅支持多种流行的在线存储和媒体管理平台&#xff0c;如阿里云盘、Alist、WebDAV和Emby等&#xff0c;还提供了刮削功能和海报墙展示&#xff0c;使得用户能够更加便捷地管…

解锁视频生成新时代! 探索智谱CogVideoX-2b:轻松生成6秒视频的详细指南

文章目录 一、CogVideoX的诞生背景二、 创建丹摩平台实例三、 环境配置与依赖安装四、模型文件与配置五、 模型运行六、使用 Web 界面生成视频 一、CogVideoX的诞生背景 CogVideoX 的推出标志着视频生成技术进入了一个全新的阶段。在视频生成领域&#xff0c;长期以来一直存在效…

2024 年海上安全:技术集成商需要考虑的几件事

今年&#xff0c;海上发生了许多新的冲突&#xff0c;从索马里海盗到红海商船遇袭。这些事件表明&#xff0c;2024 年&#xff0c;安全专业人员做好准备帮助客户应对海上紧急情况&#xff08;无论是什么情况&#xff09;是多么重要。 技术是任何安全战略的关键推动因素。掌握最…

Python 课程19-FastAPI

前言 FastAPI 是一个用于构建 API 的现代化、快速的 Python Web 框架。它基于 Python 的 type hints 构建&#xff0c;能够自动生成 API 文档并提供出色的性能。FastAPI 的设计目标是简单易用、高性能和支持异步操作&#xff0c;因此它非常适合开发高并发的 Web 应用程序和 AP…

c# 子类继承父类接口问题

在C#中&#xff0c;子类并不直接“继承”父类继承的接口&#xff0c;但子类的确会继承父类对接口的实现&#xff08;如果父类实现了该接口&#xff09;。这里有一些关键的概念需要澄清&#xff1a; 接口继承&#xff1a;当一个类实现了某个接口时&#xff0c;它必须实现接口中…

Webpack教程-概述

什么是Webpack Webpack是一个静态资源打包工具。它以一个或多个文件作为打包入口&#xff0c;将整个项目所有的文件编译组合成一个或多个文件进行输出。(输出的文件即编译好的文件&#xff0c;就可以在浏览器上运行) Webpack官网 核心概念 entry (入口) entiry 指webpack…

2024下最全软考机考操作事项、绘图指南合集!

从2023年下半年软考全部科目改革为机考方式后&#xff0c;到现在已经进行过两场考试&#xff0c;鉴于有很多考生是初次参加软考&#xff0c;就给大家介绍下关于软考机考的具体操作指南&#xff0c;希望对大家有所帮助。 一、操作事项 在考试正式开始前&#xff0c;软考办会开放…

ClickHouse复杂查询单表亿级数据案例(可导出Excel)

通过本篇博客&#xff0c;读者可以了解到如何在 ClickHouse 中高效地创建和管理大规模销售数据。随机数据生成和复杂查询的示例展示了 ClickHouse 的强大性能和灵活性。掌握这些技能后&#xff0c;用户能够更好地进行数据分析和决策支持&#xff0c;提升业务洞察能力。 表结构…

性能测试1初步使用Jmeter

当你看到这边文章的时候&#xff0c;详细你已经知道啥是性能测试&#xff0c;以及也听说过Jmeter了&#xff0c;所以不过多介绍&#xff0c;这里&#xff0c;只是帮助你快速的使用Jmeter来测试接口。 1获取安装包 官网下载地址&#xff1a;https://jmeter.apache.org/downloa…

力扣19 删除链表的倒数第N个节点 Java版本

文章目录 题目描述代码 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 …

erlang学习:Linux命令学习4

顺序控制语句学习 if&#xff0c;else对文件操作 判断一个文件夹是否存在&#xff0c;如果存在则进行删除&#xff0c;如果不存在则创建该文件夹&#xff0c;并复制一份该脚本后&#xff0c;删除该脚本 if [ -d "/erlangtest/testdir"]; then echo "删除文件夹…

数字化转型:国内证书哪个更有用

探讨数字化转型&#xff0c;有哪些国内证书推荐&#xff1f;让我们一起来了解一下。 软考-系统集成项目管理工程师(中项)/信息系统项目管理师(高项)&#xff1a;由人社部和工信部联合颁发&#xff0c;紧密贴合国内IT领域的项目管理实际需求。 这两个软考科目没有考试门槛限制…

AI 文生图快速入门教程:让 Stable Diffusion 更易于上手

Stable Diffusion 是一个强大的 AI 图像生成工具&#xff0c;但它可能会消耗大量资源。在本指南中&#xff0c;我们将学习如何使用 AUTOMATIC1111 的 Stable Diffusion WebUI 来设置它。同时&#xff0c;我们将在 DigitalOcean GPU Droplet 云服务器上运行它&#xff0c;通过 H…

python爬虫:从12306网站获取火车站信息

代码逻辑 初始化 (init 方法)&#xff1a; 设置请求头信息。设置车站版本号。 同步车站信息 (synchronization 方法)&#xff1a; 发送GET请求获取车站信息。返回服务器响应的文本。 提取信息 (extract 方法)&#xff1a; 从服务器响应中提取车站信息字符串。去掉字符串末尾的…