Python烟花代码(需安装Pygame模块)

以下是对这段代码的分析(混元AI生成)

这段代码是一个使用 Python 的 Pygame 库实现的烟花效果程序,并且将文本以烟花的形式呈现。以下是对代码的详细分析:

1. 导入模块

收起

python

import pygame
import random
import math

导入了 Pygame 库用于创建游戏和图形界面,random库用于生成随机数,math库用于数学运算。

2. 初始化 Pygame

收起

python

pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("CSDN征稿项目")
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

初始化 Pygame,设置窗口的宽度和高度为 800×600 像素,设置窗口标题为 “CSDN 征稿项目”,定义白色和黑色的 RGB 值。

3. Firework

收起

python

class Firework:
    def __init__(self, x, y, char=None):
        self.x = x
        self.y = y
        self.char = char
        self.speed = random.randint(10, 20)
        self.colour = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
        self.exploded = False
        self.particles = []

Firework类表示烟花,初始化时设置烟花的位置(x, y),可能携带的字符char,上升速度speed,颜色colour,爆炸状态exploded和粒子列表particles

收起

python

    def update(self):
        if not self.exploded:
            self.y -= self.speed
            if self.y < HEIGHT // 2:
                self.explode()
        else:
            remove_particles = []
            for particle in self.particles:
                particle.update()
                if particle.is_dead():
                    remove_particles.append(particle)
            for particle in remove_particles:
                self.particles.remove(particle)
            if len(self.particles) == 0:
                return True
        return False

update方法用于更新烟花的状态。如果烟花尚未爆炸,它会向上移动,当到达窗口上半部分时触发爆炸。爆炸后,更新每个粒子的状态,并移除死亡的粒子。当所有粒子都死亡时,返回True

收起

python

    def explode(self):
        self.exploded = True
        num_particles = random.randint(120, 180)
        t = 0
        for _ in range(num_particles):
            t += 2 * math.pi / num_particles
            r = 16 * (1 + math.sin(t) ** 3)
            x_offset = r * math.cos(t)
            y_offset = r * math.sin(t)
            particle = Particle(self.x + x_offset, self.y + y_offset, self.colour)
            self.particles.append(particle)

explode方法用于触发烟花的爆炸。生成一定数量的粒子(120 到 180 个),根据数学公式计算每个粒子的初始位置,并将其添加到粒子列表中。

收起

python

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

draw方法用于在屏幕上绘制烟花。如果烟花尚未爆炸,绘制一个圆形表示烟花;如果已爆炸,绘制每个粒子。

4. Particle

收起

python

class Particle:
    def __init__(self, x, y, colour):
        self.x = x
        self.y = y
        self.colour = colour
        self.speed_x = random.uniform(-2, 2)
        self.speed_y = random.uniform(1, 3)
        self.life = 255

Particle类表示烟花爆炸后的粒子,初始化时设置粒子的位置(x, y),颜色colour,水平和垂直速度speed_xspeed_y,以及生命周期life

收起

python

    def update(self):
        self.x += self.speed_x
        self.y += self.speed_y
        self.life -= 2

update方法用于更新粒子的位置和生命周期。粒子会根据速度移动,并且生命周期会减少。

收起

python

    def is_dead(self):
        return self.life <= 0

is_dead方法用于判断粒子是否死亡,即生命周期是否小于等于 0。

收起

python

    def draw(self, screen):
        alpha = self.life if self.life > 0 else 0
        colour_with_alpha = self.colour + (alpha,)
        pygame.draw.circle(screen, colour_with_alpha, (int(self.x), int(self.y)), 2)

draw方法用于在屏幕上绘制粒子,根据粒子的生命周期设置透明度,并绘制一个圆形。

5. text_to_fireworks函数

收起

python

def text_to_fireworks(text, start_x, start_y, spacing):
    fireworks = []
    for i, char in enumerate(text):
        x = start_x + i * spacing
        y = start_y
        fireworks.append(Firework(x, y, char))
    return fireworks

该函数将文本转换为烟花列表。根据文本中的每个字符,在指定的起始位置和间距处创建一个Firework对象。

6. main函数

收起

python

def main():
    text = "I Love You!"
    start_x = WIDTH // 2 - len(text) * 30 // 2
    start_y = 50
    spacing = 60
    fireworks_text = text_to_fireworks(text, start_x, start_y, spacing)
    fireworks = fireworks_text + [Firework(random.randint(0, WIDTH), HEIGHT) for _ in range(10)]
    clock = pygame.time.Clock()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.fill(BLACK)
        remove_fireworks = []
        for firework in fireworks:
            if firework.update():
                remove_fireworks.append(firework)
            firework.draw(screen)
        for firework in remove_fireworks:
            fireworks.remove(firework)
        if random.random() < 0.05:
            fireworks.append(Firework(random.randint(0, WIDTH), HEIGHT))
        pygame.display.flip()
        clock.tick(60)
    pygame.quit()

main函数是程序的主入口。设置要显示的文本,计算文本烟花的起始位置和间距,创建文本烟花和一些随机位置的烟花。在主循环中,处理事件,填充屏幕背景,更新和绘制烟花,移除已死亡的烟花,随机添加新的烟花,最后更新屏幕显示并控制帧率。

7. 程序入口

收起

python

if __name__ == "__main__":
    main()

确保只有在直接运行脚本时才会执行main函数。

总结

这段代码通过 Pygame 库实现了一个动态的烟花效果,并且将文本以烟花的形式呈现。它展示了如何使用面向对象编程和 Pygame 的基本功能来创建有趣的图形应用程序。

项目已开源到Github

项目地址:View 1 · Python yanhuadaima

作者:Conaden战无不胜

物联沃分享整理
物联沃-IOTWORD物联网 » Python烟花代码(需安装Pygame模块)

发表回复