Creating Colorful Fireworks with Python and Pygame
This tutorial demonstrates how to build a vivid fireworks simulation in Python using Pygame, covering module imports, window setup, color configuration, a Fireworks class definition, particle dynamics, and the main game loop for rendering and animation.
When fireworks bloom they are dazzling, and this example shows how to recreate that effect with Python. The expected visual result is displayed first.
Step 1: Import modules
import pygame, math, time, random, os
from sys import exitStep 2: Define initial parameters
WIN_W = 2200
WIN_H = 1300Set time flow, display counters, and explosion frequency.
t1 = 0.18 # time speed
show_n = 0
show_frequency = 0.0015 # higher value means more frequent fireworksDefine a list of possible colors for the fireworks.
color_list = [
[255, 50, 50],
[50, 255, 50],
[50, 50, 255],
[255, 255, 50],
[255, 50, 255],
[50, 255, 255],
[255, 255, 255]
]Initialize Pygame and its mixer for background music.
pygame.init()
pygame.mixer.init()Create a resizable window and set its title.
screen = pygame.display.set_mode((WIN_W, WIN_H), pygame.RESIZABLE, 32)
pygame.display.set_caption("Five‑Color Fireworks Spectacle")Load and play background music (customizable).
sound_wav = pygame.mixer.music.load("123.mp3")
pygame.mixer.music.play()Define the Fireworks class
class Fireworks():
is_show = False
x, y = 0, 0
vy = 0
p_list = []
color = [0, 0, 0]
v = 0
def __init__(self, x, y, vy, n=300, color=[0, 255, 0], v=10):
self.x = x
self.y = y
self.vy = vy
self.color = color
self.v = v
for i in range(n):
self.p_list.append([random.random() * 2 * math.pi, 0,
v * math.pow(random.random(), 1/3)])
def again(self):
self.is_show = True
self.x = random.randint(WIN_W // 2 - 350, WIN_W // 2 + 350)
self.y = random.randint(int(WIN_H / 2), int(WIN_H * 3 / 5))
self.vy = -40 * (random.random() * 0.4 + 0.8) - self.vy * 0.2
self.color = color_list[random.randint(0, len(color_list) - 1)].copy()
n = len(self.p_list)
self.p_list = []
for i in range(n):
self.p_list.append([random.random() * 2 * math.pi, 0,
self.v * math.pow(random.random(), 1/3)])
def run(self):
global show_n
for p in self.p_list:
p[1] = p[1] + (random.random() * 0.6 + 0.7) * p[2]
p[2] = p[2] * 0.97
if p[2] < 1.2:
self.color[0] *= 0.9999
self.color[1] *= 0.9999
self.color[2] *= 0.9999
if max(self.color) < 10 or self.y > WIN_H + p[1]:
show_n -= 1
self.is_show = False
break
self.vy += 10 * t1
self.y += self.vy * t1Create a list of fireworks instances with different parameters.
fk_list = []
fk_list.append(Fireworks(300, 300, -20, n=100, color=[0, 255, 0], v=10))
fk_list.append(Fireworks(300, 300, -20, n=200, color=[0, 0, 255], v=11))
fk_list.append(Fireworks(300, 300, -20, n=200, color=[0, 0, 255], v=12))
fk_list.append(Fireworks(300, 300, -20, n=500, color=[0, 0, 255], v=12))
fk_list.append(Fireworks(300, 300, -20, n=600, color=[0, 0, 255], v=13))
fk_list.append(Fireworks(300, 300, -20, n=700, color=[255, 0, 0], v=15))
fk_list.append(Fireworks(300, 300, -20, n=800, color=[255, 255, 0], v=18))
clock = pygame.time.Clock()Main loop – handles music playback, quit events, clears the screen, triggers fireworks, updates particle positions, draws them, and refreshes the display.
# Game main loop
while True:
if not pygame.mixer.music.get_busy():
pygame.mixer.music.play()
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
screen.fill((0, 0, 0))
# Launch fireworks
for i, fk in enumerate(fk_list):
if not fk.is_show:
fk.is_show = False
if random.random() < show_frequency * (len(fk_list) - show_n):
show_n += 1
fk.again()
continue
fk.run()
for p in fk.p_list:
x, y = fk.x + p[1] * math.cos(p[0]), fk.y + p[1] * math.sin(p[0])
if random.random() < 0.055:
screen.set_at((int(x), int(y)), (255, 255, 255))
else:
screen.set_at((int(x), int(y)), (int(fk.color[0]), int(fk.color[1]), int(fk.color[2])))
pygame.display.update()
time_passed = clock.tick(50)The script ends with a simple "- END -" marker and a disclaimer that the content is for learning purposes only.
Python Programming Learning Circle
A global community of Chinese Python developers offering technical articles, columns, original video tutorials, and problem sets. Topics include web full‑stack development, web scraping, data analysis, natural language processing, image processing, machine learning, automated testing, DevOps automation, and big data.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.