基于Python实现一个浪漫烟花秀

为了实现一个类似烟花秀的效果,我们可以通过复杂的粒子系统来模拟烟花的升起、绽放和下落效果。以下是一个示例,旨在创建更为动态和逼真的烟花秀效果。

示例代码

这个代码示例将使用 matplotlibnumpy,并实现更丰富的视觉效果:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

class Particle:
    def __init__(self, x, y, vx, vy, color):
        self.x = x
        self.y = y
        self.vx = vx
        self.vy = vy
        self.color = color
        self.life = np.random.randint(50, 100)  # 生命值,控制粒子的存活时间

    def update(self):
        self.x += self.vx
        self.y += self.vy
        self.vy -= 0.05  # 重力影响
        self.life -= 1  # 每次更新生命值减少

    def is_alive(self):
        return self.life > 0

class Firework:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.particles = []
        self.exploded = False

    def explode(self):
        if not self.exploded:
            num_particles = np.random.randint(100, 200)
            angles = np.linspace(0, 2 * np.pi, num_particles)
            speeds = np.random.uniform(1, 4, num_particles)
            colors = plt.cm.hsv(np.random.rand(num_particles))  # 使用HSV颜色

            for angle, speed, color in zip(angles, speeds, colors):
                vx = speed * np.cos(angle)
                vy = speed * np.sin(angle)
                self.particles.append(Particle(self.x, self.y, vx, vy, color))
            self.exploded = True

    def update(self):
        if self.exploded:
            for particle in self.particles:
                particle.update()

    def get_particles(self):
        return [p for p in self.particles if p.is_alive()]

# 初始化画布
fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_facecolor('black')

fireworks = []

# 生成烟花
def generate_fireworks(num):
    for _ in range(num):
        x = np.random.uniform(1, 9)
        y = 0  # 从底部开始
        firework = Firework(x, y)
        fireworks.append(firework)

generate_fireworks(3)

# 动画更新函数
def update(frame):
    ax.clear()
    ax.set_xlim(0, 10)
    ax.set_ylim(0, 10)
    ax.set_facecolor('black')

    # 处理烟花升起
    for firework in fireworks:
        if firework.y < 8:  # 设置升起的高度
            firework.y += 0.1
        else:
            firework.explode()  # 当升至最高点,爆炸
            firework.update()  # 更新粒子

        # 绘制存活的粒子
        particles = firework.get_particles()
        for particle in particles:
            ax.scatter(particle.x, particle.y, color=particle.color, s=10)

# 创建动画
ani = animation.FuncAnimation(fig, update, frames=100, interval=50)
plt.show()

代码说明

  1. 粒子类

    • 每个粒子有随机的生命值、速度和颜色。
    • 更新方法考虑了重力的影响,使粒子逐渐下落。
  2. 烟花类

    • 生成大量粒子,每个粒子都有独特的颜色和速度,使效果更加多样化。
    • 当烟花达到一定高度后,会进行爆炸。
  3. 初始化和动画更新

    • 动画中,每个烟花从底部升起,并在达到最高点时爆炸,粒子下落,呈现出烟花绽放的效果。

运行代码

将以上代码复制到你的 Python 环境中运行,即可看到一个更为动态和逼真的烟花效果。你可以根据需要进一步调整粒子的数量、速度和颜色映射,以实现更符合您预期的效果。

### Python 实现烟花效果 #### 使用 `turtle` 库绘制简单烟花效果 `turtle` 是 Python 自带的一个非常适合初学者使用的绘图库。下面是一段利用 `turtle` 绘制简单烟花爆炸效果的代码示例: ```python import turtle import random def draw_firework(t, size): for _ in range(36): # 控制火花数量 t.forward(size) t.backward(size) t.right(10) screen = turtle.Screen() screen.bgcolor('black') fireworks = [] colors = ['red', 'blue', 'yellow', 'green'] for _ in range(5): # 创建五个不同位置的烟花 f = turtle.Turtle() f.speed(0) f.color(random.choice(colors)) f.penup() f.goto(random.randint(-200, 200), random.randint(-200, 200)) f.pendown() fireworks.append(f) for firework in fireworks: draw_firework(firework, 80) # 调整大小参数可以改变烟花尺寸 firework.hideturtle() turtle.done() ``` 这段程序通过循环调用 `draw_firework()` 函数,在随机的位置上画出五朵颜色各异的烟花[^1]。 #### 使用 `pygame` 制作更加真实的烟花动画 对于希望获得更复杂视觉体验的情况,可以选择安装第三方库 `pygame` 来构建交互式的烟花模拟器。这里给出一段简化版的基于 Pygame 的烟花发射逻辑框架: 首先需要确保已经安装了 pygame (`pip install pygame`) ,接着可以用如下方式编写代码: ```python import sys, math, random import pygame as pg class Particle(pg.sprite.Sprite): def __init__(self, pos, vel, color=(255, 255, 0)): super().__init__() self.image = pg.Surface((4, 4)).convert_alpha() # 小方块作为粒子图像 self.rect = self.image.get_rect(center=pos) self.vel = list(vel) self.acc = [0, .1 * random.uniform(.9, 1.1)] # 加速度使粒子下落加速 self.life_time = 60 + int(random.random()*40) # 随机生命时间 self.color = color def update(self): self.vel[0] += self.acc[0] self.vel[1] += self.acc[1] self.rect.x += self.vel[0] self.rect.y += self.vel[1] self.life_time -= 1 if self.life_time <= 0 or not screen.get_rect().colliderect(self.rect): self.kill() pg.init() size = width, height = (800, 600) screen = pg.display.set_mode(size) clock = pg.time.Clock() all_sprites_list = pg.sprite.Group() while True: clock.tick(30) for event in pg.event.get(): if event.type == pg.MOUSEBUTTONDOWN and event.button == 1: angle = random.uniform(0, math.pi*2) speed = random.uniform(7, 12) vx = math.cos(angle)*speed vy = math.sin(angle)*speed all_sprites_list.add(Particle(event.pos, [vx,vy])) all_sprites_list.update() screen.fill((0, 0, 0)) all_sprites_list.draw(screen) pg.display.flip() keys=pg.key.get_pressed() if keys[pg.K_ESCAPE]: break pg.quit() sys.exit() ``` 此脚本定义了一个名为 `Particle` 的类来表示单个颗粒,并且每当检测到鼠标点击时就会向该处发射一组带有初始速度方向不同的颗粒群形成绽放的效果[^2].
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值