千家信息网

Python实现新年烟花秀的代码怎么写

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,今天就跟大家聊聊有关Python实现新年烟花秀的代码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。先介绍下 Pygame 绘制烟花的基本
千家信息网最后更新 2025年11月11日Python实现新年烟花秀的代码怎么写

今天就跟大家聊聊有关Python实现新年烟花秀的代码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

先介绍下 Pygame 绘制烟花的基本原理,烟花从发射到绽放一共分为三个阶段:

1,发射阶段:在这一阶段烟花的形状是线性向上,通过设定一组大小不同、颜色不同的点来模拟"向上发射" 的运动运动,运动过程中 5个点被赋予不同大小的加速度,随着时间推移,后面的点会赶上前面的点,最终所有点会汇聚在一起,处于 绽放准备阶段;

2,烟花绽放:烟花绽放这个阶段,是由一个点分散多个点向不同方向发散,并且每个点的移动轨迹可需要被记录,目的是为了追踪整个绽放轨迹。

3,烟花凋零,此阶段负责描绘绽放后烟花的效果,绽放后的烟花,而在每一时刻点的下降速度和亮度(代码中也叫透明度)是不一样的,因此在代码里,将烟花绽放后将每个点赋予两个属性:分别为重力向量和生命周期,来模拟烟花在不同时期时不同的展现效果。

程序运行截图:

完整程序代码:

import pygamefrom random import randint, uniform, choiceimport math vector = pygame.math.Vector2gravity = vector(0, 0.3)DISPLAY_WIDTH = DISPLAY_HEIGHT = 800  trail_colours = [(45, 45, 45), (60, 60, 60), (75, 75, 75), (125, 125, 125), (150, 150, 150)]dynamic_offset = 1static_offset = 3   class Firework:    def __init__(self):        # 随机颜色        self.colour = (randint(0, 255), randint(0, 255), randint(0, 255))        self.colours = (            (randint(0, 255), randint(0, 255), randint(0, 255)),            (randint(0, 255), randint(0, 255), randint(0, 255)),            (randint(0, 255), randint(0, 255), randint(0, 255)))        self.firework = Particle(randint(0, DISPLAY_WIDTH), DISPLAY_HEIGHT, True,                                 self.colour)  # Creates the firework particle        self.exploded = False        self.particles = []        self.min_max_particles = vector(100, 225)     def update(self, win):  # called every frame        if not self.exploded:            self.firework.apply_force(gravity)            self.firework.move()            for tf in self.firework.trails:                tf.show(win)             self.show(win)             if self.firework.vel.y >= 0:                self.exploded = True                self.explode()        else:            for particle in self.particles:                particle.apply_force(vector(gravity.x + uniform(-1, 1) / 20, gravity.y / 2 + (randint(1, 8) / 100)))                particle.move()                for t in particle.trails:                    t.show(win)                particle.show(win)     def explode(self):        # amount 数量        amount = randint(self.min_max_particles.x, self.min_max_particles.y)        for i in range(amount):            self.particles.append(Particle(self.firework.pos.x, self.firework.pos.y, False, self.colours))     def show(self, win):        pygame.draw.circle(win, self.colour, (int(self.firework.pos.x), int(self.firework.pos.y)), self.firework.size)     def remove(self):        if self.exploded:            for p in self.particles:                if p.remove is True:                    self.particles.remove(p)             if len(self.particles) == 0:                return True            else:                return False  class Particle:    def __init__(self, x, y, firework, colour):        self.firework = firework        self.pos = vector(x, y)        self.origin = vector(x, y)        self.radius = 20        self.remove = False        self.explosion_radius = randint(5, 18)        self.life = 0        self.acc = vector(0, 0)        # trail variables        self.trails = []  # stores the particles trail objects        self.prev_posx = [-10] * 10  # stores the 10 last positions        self.prev_posy = [-10] * 10  # stores the 10 last positions         if self.firework:            self.vel = vector(0, -randint(17, 20))            self.size = 5            self.colour = colour            for i in range(5):                self.trails.append(Trail(i, self.size, True))        else:            self.vel = vector(uniform(-1, 1), uniform(-1, 1))            self.vel.x *= randint(7, self.explosion_radius + 2)            self.vel.y *= randint(7, self.explosion_radius + 2)            # 向量            self.size = randint(2, 4)            self.colour = choice(colour)            # 5 个 tails总计            for i in range(5):                self.trails.append(Trail(i, self.size, False))     def apply_force(self, force):        self.acc += force     def move(self):        if not self.firework:            self.vel.x *= 0.8            self.vel.y *= 0.8        self.vel += self.acc        self.pos += self.vel        self.acc *= 0         if self.life == 0 and not self.firework:  # check if particle is outside explosion radius            distance = math.sqrt((self.pos.x - self.origin.x) ** 2 + (self.pos.y - self.origin.y) ** 2)            if distance > self.explosion_radius:                self.remove = True         self.decay()         self.trail_update()         self.life += 1     def show(self, win):        pygame.draw.circle(win, (self.colour[0], self.colour[1], self.colour[2], 0), (int(self.pos.x), int(self.pos.y)),                           self.size)     def decay(self):  # random decay of the particles        if 50 > self.life > 10:  # early stage their is a small chance of decay            ran = randint(0, 30)            if ran == 0:                self.remove = True        elif self.life > 50:            ran = randint(0, 5)            if ran == 0:                self.remove = True     def trail_update(self):        self.prev_posx.pop()        self.prev_posx.insert(0, int(self.pos.x))        self.prev_posy.pop()        self.prev_posy.insert(0, int(self.pos.y))         for n, t in enumerate(self.trails):            if t.dynamic:                t.get_pos(self.prev_posx[n + dynamic_offset], self.prev_posy[n + dynamic_offset])            else:                t.get_pos(self.prev_posx[n + static_offset], self.prev_posy[n + static_offset])  class Trail:    def __init__(self, n, size, dynamic):        self.pos_in_line = n        self.pos = vector(-10, -10)        self.dynamic = dynamic         if self.dynamic:            self.colour = trail_colours[n]            self.size = int(size - n / 2)        else:            self.colour = (255, 255, 200)            self.size = size - 2            if self.size < 0:                self.size = 0     def get_pos(self, x, y):        self.pos = vector(x, y)     def show(self, win):        pygame.draw.circle(win, self.colour, (int(self.pos.x), int(self.pos.y)), self.size)  def update(win, fireworks):    for fw in fireworks:        fw.update(win)        if fw.remove():            fireworks.remove(fw)     pygame.display.update()  def main():    pygame.init()    pygame.font.init()    pygame.display.set_caption("Fireworks in Pygame") # 标题    background = pygame.image.load("img/1.png") # 背景    myfont = pygame.font.Font("img/simkai.ttf",80)    myfont1 = pygame.font.Font("img/simkai.ttf", 30)     testsurface = myfont.render("新年快乐",False,(251, 59, 85))    testsurface1 = myfont1.render("By:Python代码大全", False, (251, 59, 85))     # pygame.image.load("")    win = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT))    # win.blit(background)    clock = pygame.time.Clock()     fireworks = [Firework() for i in range(2)]  # create the first fireworks    running = True     while running:        clock.tick(60)        for event in pygame.event.get():            if event.type == pygame.QUIT:                running = False            if event.type == pygame.KEYDOWN:  # Change game speed with number keys                if event.key == pygame.K_1: # 按下 1                    fireworks.append(Firework())                if event.key == pygame.K_2: # 按下 2 加入10个烟花                    for i in range(10):                        fireworks.append(Firework())        win.fill((20, 20, 30))  # draw background        win.blit(background,(0,0))        win.blit(testsurface,(200,30))        win.blit(testsurface1, (520,80))         if randint(0, 20) == 1:  # create new firework            fireworks.append(Firework())         update(win, fireworks)        # stats for fun        # total_particles = 0        # for f in fireworks:        #    total_particles += len(f.particles)         # print(f"Fireworks: {len(fireworks)}\nParticles: {total_particles}\n\n")     pygame.quit()    quit() main()

看完上述内容,你们对Python实现新年烟花秀的代码怎么写有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

烟花 代码 不同 阶段 内容 发射 运动 向量 大小 效果 程序 轨迹 颜色 三个 两个 亮度 加速度 原理 周期 多个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 学生网络安全课活动总结 公司给你培训软件开发 锐捷交换机日志发送至日志服务器 雷霆一击租服务器 小米笔记本用来软件开发 科技局网络安全和信息化 身边的网络安全有哪些 确保服务器安全要点 泗阳威力网络技术哪家好 北京潮流软件开发服务五星服务 网络安全与执法属于工学 荒野行动如何匹配到服务器 简略软件开发计划书 应用软件开发和技术前景 为啥导入一个数据库没有表 电力行业网络安全案例收费 项目管理和软件开发 我的世界人间彼岸服务器 服务器怎么查看后台管理 网络安全等级保护很贵吗 雅迅流媒体服务器参数设置 dayz最难服务器 服务器负载均衡怎么做 软件开发程序占用资源 以下属于小型数据库系统的是 数据库索引技术怎么样 服务器维护步骤 嘉宇网络技术工作室 能提供外科手术视频的数据库 为什么有些游戏要整合服务器
0