2023跨年烟花代码|用Python送你一场跨年烟花秀

已经接近尾声了,2023 即将到来,本文我们用 Python 送你一场跨年烟花秀。

我们用到的 Python 模块包括:tkinter、PIL、time、random、math,如果第三方模块没有装的话,pip install 一下即可,下面看一下代码实现。

导库

import tkinter as tk
from PIL import Image, ImageTk
from time import time, sleep
from random import choice, uniform, randint
from math import sin, cos, radians

复制代码

烟花颜色

colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']

复制代码
定义烟花类
class fireworks:
    def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):
        self.id = idx
        # 烟花绽放 x 轴
        self.x = x
        # 烟花绽放 x 轴
        self.y = y
        self.initial_speed = explosion_speed
        # 外放 x 轴速度
        self.vx = vx
        # 外放 y 轴速度
        self.vy = vy
        # 绽放的粒子数
        self.total = total
        # 已停留时间
        self.age = 0
        # 颜色
        self.color = color
        # 画布
        self.cv = cv
        self.cid = self.cv.create_oval(x - size, y - size, x + size, y + size,
        fill=self.color)
        self.lifespan = lifespan

```js
复制代码
更新数据
  ```
  def update(self, dt):
      self.age += dt
      # 粒子膨胀
      if self.alive() and self.expand():
          move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speed
          move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed
          self.cv.move(self.cid, move_x, move_y)
          self.vx = move_x / (float(dt) * 1000)
      # 膨胀到最大下落
      elif self.alive():
          move_x = cos(radians(self.id * 360 / self.total))
          self.cv.move(self.cid, self.vx + move_x, self.vy + 0.5 * dt)
          self.vy += 0.5 * dt
      # 过期移除
      elif self.cid is not None:
          cv.delete(self.cid)
          self.cid = None

复制代码
# 定义膨胀效果的时间帧
def expand(self):
    return self.age <= 1.5

# 检查粒子是否仍在生命周期内
def alive(self):
    return self.age <= self.lifespan
复制代码

燃放烟花

def ignite(cv):
    t = time()
    # 烟花列表
    explode_points = []
    wait_time = randint(10, 100)
    # 爆炸的个数
    numb_explode = randint(6, 10)
    for point in range(numb_explode):
        # 爆炸粒子列表
        objects = []
        # 爆炸 x 轴
        x_cordi = randint(50, 550)
        # 爆炸 y 轴
        y_cordi = randint(50, 150)
        speed = uniform(0.5, 1.5)
        size = uniform(0.5, 3)
        color = choice(colors)
        # 爆炸的绽放速度
        explosion_speed = uniform(0.2, 1)
        # 爆炸的粒子数半径
        total_particles = randint(10, 50)
        for i in range(1, total_particles):
            r = fireworks(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,
                     vx=speed, vy=speed, color=color, size=size,
                     lifespan=uniform(0.6, 1.75))
            # 添加进粒子列表里
            objects.append(r)
        # 把粒子列表添加到烟花列表
        explode_points.append(objects)
    total_time = .0
    # 在 1.8 秒时间帧内保持更新
    while total_time < 1.8:
        # 让画面暂停 0.01s
        sleep(0.01)
        # 刷新时间
        tnew = time()
        t, dt = tnew, tnew - t
        # 遍历烟花列表
        for point in explode_points:
            # 遍历烟花里的粒子列表
            for item in point:
                # 更新时间
                item.update(dt)
        # 刷新页面
        cv.update()
        total_time += dt
    root.after(wait_time, ignite, cv)

复制代码
启动
if __name__ == "__main__":
    root = tk.Tk()
    # 绘制一个画布
    cv = tk.Canvas(root, height=400, width=600)
    # 背景图
    image = Image.open("bg.jpg")
    photo = ImageTk.PhotoImage(image)
    # 在画板上绘制一张图片
    cv.create_image(0, 0, image=photo, anchor='nw')
    cv.pack()
    root.protocol(close)
    root.after(100, ignite, cv)
    # 生成窗口
    root.mainloop()

```js
复制代码

看一下效果:

 

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
很抱歉,根据提供的引用内容,没有找到关于2023跨年烟花代码Python示例。但是,我可以为您提供一个基于Python的简单烟花效果的代码示例: ```python import pygame import random # 初始化pygame pygame.init() # 设置窗口大小 screen = pygame.display.set_mode((800, 600)) # 设置窗口标题 pygame.display.set_caption("2023跨年烟花") # 定义烟花粒子类 class Particle(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((2, 2)) self.image.fill((255, 255, 255)) self.rect = self.image.get_rect() self.rect.center = (x, y) self.speed_x = random.randint(-5, 5) self.speed_y = random.randint(-15, -5) self.gravity = 0.5 def update(self): self.speed_y += self.gravity self.rect.x += self.speed_x self.rect.y += self.speed_y # 创建粒子组 particles = pygame.sprite.Group() # 游戏主循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 生成烟花粒子 if random.randint(1, 10) == 1: particle = Particle(random.randint(0, 800), 600) particles.add(particle) # 更新粒子位置 particles.update() # 绘制粒子 screen.fill((0, 0, 0)) particles.draw(screen) # 刷新屏幕 pygame.display.flip() # 退出游戏 pygame.quit() ``` 这是一个使用Pygame库创建的简单烟花效果的Python代码示例。它会在窗口中生成随机位置的烟花粒子,并模拟它们的运动轨迹。您可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码云笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值