【Python】 使用pygame库实现新年烟花

祝大家金蛇衔财,蛇来运转

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

复制代码
pip install pygame

接下来是烟花效果的 Python 代码:

复制代码
import pygame
import random
import math
import sys

# 初始化pygame
pygame.init()

# 设置窗口尺寸和颜色
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("新年烟花")

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255)]

# 烟花类
class Firework:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.size = random.randint(5, 8)
        self.color = random.choice(COLORS)
        self.particles = []
        self.exploded = False

    def update(self):
        if not self.exploded:
            self.y -= 5  # 向上飞
            if self.y < HEIGHT // 2:  # 达到爆炸高度
                self.explode()
        else:
            for particle in self.particles:
                particle.update()

    def draw(self):
        if not self.exploded:
            pygame.draw.circle(screen, self.color, (self.x, self.y), self.size)
        else:
            for particle in self.particles:
                particle.draw()

    def explode(self):
        self.exploded = True
        num_particles = random.randint(50, 100)
        for _ in range(num_particles):
            angle = random.uniform(0, 2 * math.pi)
            speed = random.uniform(2, 6)
            dx = math.cos(angle) * speed
            dy = math.sin(angle) * speed
            color = random.choice(COLORS)
            particle = Particle(self.x, self.y, dx, dy, color)
            self.particles.append(particle)

# 粒子类
class Particle:
    def __init__(self, x, y, dx, dy, color):
        self.x = x
        self.y = y
        self.dx = dx
        self.dy = dy
        self.color = color
        self.size = random.randint(2, 4)
        self.lifetime = random.randint(50, 100)

    def update(self):
        self.x += self.dx
        self.y += self.dy
        self.lifetime -= 1
        if self.lifetime <= 0:
            self.size -= 1
        if self.size <= 0:
            self.size = 0

    def draw(self):
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.size)

# 游戏主循环
def main():
    clock = pygame.time.Clock()
    fireworks = []
    running = True

    while running:
        screen.fill(BLACK)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        # 随机生成烟花
        if random.random() < 0.03:  # 3% 概率生成新烟花
            firework = Firework(random.randint(100, WIDTH - 100), HEIGHT)
            fireworks.append(firework)

        # 更新和绘制所有烟花
        for firework in fireworks[:]:
            firework.update()
            firework.draw()
            if firework.exploded and not firework.particles:  # 爆炸并且所有粒子消失后移除烟花
                fireworks.remove(firework)

        pygame.display.flip()
        clock.tick(60)  # 每秒60帧

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()

代码解释

  1. 烟花类 (Firework):

    • 初始化时设定烟花的起始位置、大小、颜色等。
    • 当烟花飞到一定高度时,会调用 explode() 方法,生成多个粒子。
  2. 粒子类 (Particle):

    • 每个烟花爆炸后都会生成若干个粒子,每个粒子有方向、速度、颜色和生命周期等属性。
    • 粒子会随时间更新位置和大小。
  3. 主循环 (main()):

    • 游戏窗口不断更新,生成新的烟花,并且更新已经存在的烟花的状态。
    • 使用 pygame.event.get() 处理退出事件。

运行效果

  • 烟花会从屏幕底部随机位置发射,飞到一定高度后爆炸,产生色彩斑斓的粒子效果,粒子逐渐消散。
  • 每隔一段时间,会有新的烟花生成,模拟一个持续的烟花秀。
相关推荐
宸津-代码粉碎机4 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
Y3815326624 小时前
SERP API 计费口径:credits_charged、执行失败扣费与退款边界
python·搜索引擎
chenbingjie_c4 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
Escalating_xu6 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
蒸鱼Yuzheng6 小时前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
实心儿儿6 小时前
Qt — Qt 事件
开发语言·qt
周杰偷奶茶6 小时前
【Java】数据类型与变量
java·开发语言
code斗6 小时前
Java数据结构:堆详解
java·开发语言·数据结构
重生之小比特6 小时前
【C++进阶】map和set
java·开发语言·c++
圆圆讲门店6 小时前
挑选同城获客服务机构时需要考量的核心因素都有哪些?
大数据·网络·人工智能·python