有点趣味性的python代码——燃放烟花

# 使用Python和Pygame创建惊艳的烟花表演

你有没有想过在不离开桌子的情况下就能看到一场烟花表演?Python的Pygame库使得创建有趣的视觉效果变得出乎意料的简单,包括色彩斑斓的烟花。在这篇博客中,我将向你展示如何构建一个生动的烟花表演,你可以直接在电脑上运行。

### 场景设置

为了创建我们的烟花表演,我们将使用Pygame——一个流行的Python库,用于制作2D游戏。首先,我们将设置显示窗口,初始化颜色,并准备主要组件。以下是基本设置:

```python
import pygame
import random
import math
import time

# 初始化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)
RED = (255, 0, 0)
PINK = (255, 105, 180)
YELLOW = (255, 255, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
PURPLE = (128, 0, 128)
ORANGE = (255, 165, 0)
```

这里,我们设置了一个800x600像素的窗口,烟花的魔法将在这里发生。我们还定义了将在整个表演中使用的几种颜色。

### 定义烟花类

烟花表演的核心是`Firework`类,它处理每个烟花的移动、爆炸和粒子效果。每个烟花从屏幕底部开始,向上移动,最终爆炸成多个彩色粒子。

让我们一步一步拆解`Firework`类:

```python
class Firework:
    def __init__(self):
        self.x = random.randint(100, WIDTH - 100)
        self.y = HEIGHT
        self.target_y = random.randint(100, 300)
        self.color = random.choice([RED, BLUE, GREEN, PURPLE, ORANGE, YELLOW])
        self.radius = 5
        self.exploded = False
        self.particles = []
```

在构造函数中,烟花在屏幕底部的随机位置初始化,并目标到达一定的高度。我们还为每个烟花随机选择一个颜色,使表演更加多样化。

### 创建爆炸效果

烟花上升到目标高度后爆炸,爆炸会产生多个粒子向四周移动,模拟真实的烟花效果。

```python
def explode(self):
    self.exploded = True
    num_particles = 50
    for _ in range(num_particles):
        angle = random.uniform(0, 2 * math.pi)
        speed = random.uniform(2, 5)
        px = self.x
        py = self.y
        p_radius = random.uniform(3, 5)
        p_color = random.choice([RED, BLUE, GREEN, PURPLE, ORANGE, YELLOW])
        vx = math.cos(angle) * speed
        vy = math.sin(angle) * speed
        self.particles.append((px, py, vx, vy, p_radius, p_color))
```

每个烟花会爆炸成50个粒子。每个粒子被赋予一个随机方向和速度,创造出一种混乱的爆炸效果。粒子随着下降逐渐消失,就像真实的烟花表演一样。

### 更新和绘制烟花

`update()`和`draw()`方法控制烟花的移动和如何在屏幕上显示:

- **`update()`**: 这个方法控制烟花的移动并更新爆炸后每个粒子的状态。
- **`draw()`**: 这个方法在屏幕上绘制烟花和它们的粒子。

以下是我们如何管理烟花和粒子的移动:

```python
def update(self):
    if not self.exploded:
        self.y -= 5
        if self.y <= self.target_y:
            self.explode()
    else:
        new_particles = []
        for px, py, vx, vy, p_radius, p_color in self.particles:
            px += vx
            py += vy
            vy += 0.1  # 重力效果
            p_radius -= 0.05
            if p_radius > 0:
                new_particles.append((px, py, vx, vy, p_radius, p_color))
        self.particles = new_particles
```

粒子受到重力影响(`vy += 0.1`),因此在爆炸后会逐渐下落。每个粒子也会逐渐缩小(`p_radius -= 0.05`),直到它消失。

### 整合所有部分:主循环

最后,我们有一个主循环,将所有部分结合在一起:

```python
def main():
    clock = pygame.time.Clock()
    running = True
    fireworks = [Firework() for _ in range(3)]
    fade_alpha = 5  # 用于淡出效果
    overlay = pygame.Surface((WIDTH, HEIGHT))
    overlay.fill(BLACK)
    
    while running:
        screen.fill(BLACK)
        for firework in fireworks:
            firework.update()
            firework.draw(screen)
        
        # 添加淡出效果
        overlay.set_alpha(fade_alpha)
        screen.blit(overlay, (0, 0))
        
        pygame.display.flip()
        clock.tick(30)
        
        # 检查所有烟花是否都已爆炸且粒子消失,然后重置
        if all(firework.exploded and not firework.particles for firework in fireworks):
            time.sleep(2)
            fireworks = [Firework() for _ in range(3)]

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

    pygame.quit()
```

在这个循环中,我们创建了一个烟花数组,并在每一帧中更新它们。如果所有烟花都完成爆炸,我们就创建新的烟花。循环一直运行,直到用户关闭窗口。

结论

通过几行Python代码,我们创建了一个色彩斑斓、动态有趣的烟花表演!这个例子展示了如何使用Pygame创建有趣且视觉吸引力强的效果,使其成为游戏开发和创意项目的绝佳工具。

你可以自由修改这个代码,添加更多效果或不同类型的烟花。你可以添加不同的形状、新的颜色,甚至将烟花与音乐同步,以创造更身临其境的体验。可能性是无穷的!

如果你喜欢这个教程,一定要尝试自己制作烟花表演。祝你编码愉快,享受属于你个人的烟花秀!

import pygame
import random
import math
import time

# Initialize pygame
pygame.init()

# Set up display
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Fireworks Show")

# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
PINK = (255, 105, 180)
YELLOW = (255, 255, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
PURPLE = (128, 0, 128)
ORANGE = (255, 165, 0)


# Firework class
class Firework:
    def __init__(self):
        self.x = random.randint(100, WIDTH - 100)
        self.y = HEIGHT
        self.target_y = random.randint(100, 300)
        self.color = random.choice([RED, BLUE, GREEN, PURPLE, ORANGE, YELLOW])
        self.radius = 5
        self.exploded = False
        self.particles = []

    def update(self):
        if not self.exploded:
            self.y -= 5
            if self.y <= self.target_y:
                self.explode()
        else:
            new_particles = []
            for px, py, vx, vy, p_radius, p_color in self.particles:
                px += vx
                py += vy
                vy += 0.1  # Gravity effect
                p_radius -= 0.05
                if p_radius > 0:
                    new_particles.append((px, py, vx, vy, p_radius, p_color))
            self.particles = new_particles

    def draw(self, surface):
        if not self.exploded:
            pygame.draw.circle(surface, self.color, (self.x, self.y), self.radius)
        else:
            for px, py, _, _, p_radius, p_color in self.particles:
                pygame.draw.circle(surface, p_color, (int(px), int(py)), int(p_radius))

    def explode(self):
        self.exploded = True
        num_particles = 50
        for _ in range(num_particles):
            angle = random.uniform(0, 2 * math.pi)
            speed = random.uniform(2, 5)
            px = self.x
            py = self.y
            p_radius = random.uniform(3, 5)
            p_color = random.choice([RED, BLUE, GREEN, PURPLE, ORANGE, YELLOW])
            vx = math.cos(angle) * speed
            vy = math.sin(angle) * speed
            self.particles.append((px, py, vx, vy, p_radius, p_color))


# Main loop
def main():
    clock = pygame.time.Clock()
    running = True
    fireworks = [Firework() for _ in range(3)]
    fade_alpha = 5  # For fading effect
    overlay = pygame.Surface((WIDTH, HEIGHT))
    overlay.fill(BLACK)

    while running:
        screen.fill(BLACK)
        for firework in fireworks:
            firework.update()
            firework.draw(screen)

        # Add fading effect
        overlay.set_alpha(fade_alpha)
        screen.blit(overlay, (0, 0))

        pygame.display.flip()
        clock.tick(30)

        # Check if all fireworks have exploded and particles have disappeared, then reset
        if all(firework.exploded and not firework.particles for firework in fireworks):
            time.sleep(2)
            fireworks = [Firework() for _ in range(3)]

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

    pygame.quit()


if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值