千家信息网

怎么用Python实现雪夜烟花景

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要为大家展示了"怎么用Python实现雪夜烟花景",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"怎么用Python实现雪夜烟花景"这篇文章吧。运行
千家信息网最后更新 2026年11月04日怎么用Python实现雪夜烟花景

这篇文章主要为大家展示了"怎么用Python实现雪夜烟花景",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"怎么用Python实现雪夜烟花景"这篇文章吧。

运行截图

运行效果:

什么?你说你看不清烟花?那我换一种颜色,请点开看。

实现过程

准备工作

使用语言和框架:python、pygame。
安装pygame:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn pygame

你需要知道的基础知识

首先,pygame渲染是同步的,所以同屏渲染的点过多之后,就会造成卡顿的情况。
其次,pygame的代码逻辑是,周期性渲染一系列的屏,从而产生连续的动画。

你需要掌握的框架基础知识:

初始化过程

import pygamepygame.init()pygame.mixer.init()pygame.font.init()

获取字体

myfont = pygame.font.SysFont('simHei', 30)textsurface = myfont.render(a[i], False, random_color(150, 255))screen.blit(textsurface, (80, 30))

画圈

pygame.draw.circle(screen, (snow_list[i][4], snow_list[i][5], snow_list[i][6]), snow_list[i][:2],                           snow_list[i][3] - 3)

加载背景音乐

screen = pygame.display.set_mode(bg_size)pygame.display.set_caption("新年快乐")bg = pygame.image.load(bg_img)pygame.mixer.music.load('D:\\CloudMusic\\小时姑娘 - 霞光-《精灵世纪》片尾曲.mp3')

核心代码

基础架子

首先,需要实现一个基础的事件循环的架子,如下:

def main():    global show_n    global fk_list    bg_size = (WIN_W, WIN_H)    screen = pygame.display.set_mode(bg_size)    pygame.display.set_caption("新年快乐")    pygame.mixer.music.load('D:\\CloudMusic\\小时姑娘 - 霞光-《精灵世纪》片尾曲.mp3')    font_values = ['新年快乐']    grand_has = set()    clock = pygame.time.Clock()    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))        ... ...        pygame.display.update()        time_passed = clock.tick(50)if __name__ == '__main__':    main()

下雪的过程

现在,需要实现下雪的过程,首先,考虑定义定义一堆初始化的下雪点

def init_xue(bg_size):    snow_list = []    for i in range(200):        x_site = random.randrange(0, bg_size[0])  # 雪花圆心位置        y_site = random.randrange(0, bg_size[1])  # 雪花圆心位置        X_shift = random.randint(-1, 1)  # x 轴偏移量        radius = random.randint(4, 6)  # 半径和 y 周下降量        xxxxx = random_color(150, 255)        snow_list.append([x_site, y_site, X_shift, radius, 255, 255, 255])    return snow_list

然后实现渲染雪的过程

def draw_xue(snow_list: [], screen, bg_size: [], grand_has: set, grand_list: []):    # 雪花列表循环    # todo 空中的雪    for i in range(len(snow_list)):        # 绘制雪花,颜色、位置、大小        pygame.draw.circle(screen, (snow_list[i][4], snow_list[i][5], snow_list[i][6]), snow_list[i][:2],                           snow_list[i][3] - 3)        # 移动雪花位置(下一次循环起效)        snow_list[i][0] += snow_list[i][2]        snow_list[i][1] += snow_list[i][3]        # 如果雪花落出屏幕,重设位置        if snow_list[i][1] > bg_size[1]:            # tmp = []            snow_list[i][1] = random.randrange(-50, -10)            snow_list[i][0] = random.randrange(0, bg_size[0])            x = snow_list[i][0]            y = bg_size[1]            while (grand_has.__contains__(x * 10000 + y)):                y = y - snow_list[i][3]            grand_has.add(x * 10000 + y)            grand_list.append(                [x, y, snow_list[i][2], snow_list[i][3], snow_list[i][4], snow_list[i][5],                 snow_list[i][6]])

集成到上面的架子中,效果如下:

不过目前的下雪没有质感,可以考虑在底部堆一些雪,只需要在雪落到地上做特判即可。

雪落到地上堆起来的过程

在前面的下雪过程的代码中,我们维护了一个Grand_list的数组,目的就是维护堆雪的效果

min_height = 100000# todo 地上的积雪for i in range(len(grand_list)):    if grand_list[i][0] < 375:        min_height = min(min_height, grand_list[i][1])

然后进入维护程序:

draw_xue(snow_list, screen, bg_size, grand_has, grand_list)

最后再将雪画出来

for i in range(len(grand_list)):    pygame.draw.circle(screen, (grand_list[i][4], grand_list[i][5], grand_list[i][6]), grand_list[i][:2],                       grand_list[i][3] - 3)

效果图如上。

实现烟花的过程

首先定义出烟花类:

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 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 * t1

然后,我们需要画出烟花释放前上升的过程点,这部分与下雪的初始化差不多。

def init_yanhua(bg_size):    yanhua_list = []    for i in range(5):        x_site = random.randrange(0, WIN_W)  # 雪花圆心位置        y_site = WIN_H  # 雪花圆心位置        X_shift = 0  # x 轴偏移量        radius = random.randint(6, 10)  # 半径和 y 周上升降量        xxxxx = random_color(150, 255)        red = xxxxx[0]        green = xxxxx[1]        blue = xxxxx[2]        yanhua_list.append([x_site, y_site, X_shift, radius, red, green, blue])    return yanhua_list

然后是画上升过程

def draw_yanhua(yanhua_list: [], screen, bg_size: []):    global fk_list    for i in range(len(yanhua_list)):        # 绘制雪花,颜色、位置、大小        pygame.draw.circle(screen, (yanhua_list[i][4], yanhua_list[i][5], yanhua_list[i][6]), yanhua_list[i][:2],                           yanhua_list[i][3] - 3)                yanhua_list[i][0] += yanhua_list[i][2]        yanhua_list[i][1] -= yanhua_list[i][3]        if yanhua_list[i][1] <= 0:            # tmp = []            yanhua_list[i][1] = WIN_H            yanhua_list[i][0] = random.randrange(0, bg_size[0])        if yanhua_list[i][1] <= random.randint(200, 400):            # todo 放烟花            fk = Fireworks(yanhua_list[i][0], yanhua_list[i][1], -20, n=300, color=red_random(1, 150), v=10)            fk_list.append(fk)            yanhua_list[i][1] = WIN_H            yanhua_list[i][0] = random.randrange(0, bg_size[0])

效果图如下:

圈出来的就是上升过程的烟花。
最后就是绽放部分,其实在上升过程的代码中有维护,如果超过某个随机高度,就会生成一个烟花,只是没有渲染,现在我们把渲染加上。

 for fk in fk_list:            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])))        tmp = []        for fk in fk_list:            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 y < WIN_H - 1000:                    tmp.append(fk)                    break        fk_list = tmp

最终的运行效果就如最顶上的效果一样。

完整代码

将上述过程进行组合,结果如下,感兴趣的朋友可以按自己的需求进行优化。

import pygameimport randomimport mathpygame.init()pygame.mixer.init()pygame.font.init()WIN_W = 2200WIN_H = 1300t1 = 0.18  # 时间流速show_n = 0show_frequency = 0.0015  # 烟花绽放频率,数值越大频率越高color_list = [    [255, 0, 0]]yanhua_map = {}fk_list = []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 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 * t1def random_color(l, r):    return [random.randint(l, r), random.randint(l, r), random.randint(l, r)]def red_random(l, r):    return [255, random.randint(l, r), random.randint(l, r)]def init_yanhua(bg_size):    yanhua_list = []    for i in range(5):        x_site = random.randrange(0, WIN_W)  # 雪花圆心位置        y_site = WIN_H  # 雪花圆心位置        X_shift = 0  # x 轴偏移量        radius = random.randint(6, 10)  # 半径和 y 周上升降量        xxxxx = random_color(150, 255)        red = xxxxx[0]        green = xxxxx[1]        blue = xxxxx[2]        yanhua_list.append([x_site, y_site, X_shift, radius, red, green, blue])    return yanhua_listdef init_xue(bg_size):    snow_list = []    for i in range(200):        x_site = random.randrange(0, bg_size[0])  # 雪花圆心位置        y_site = random.randrange(0, bg_size[1])  # 雪花圆心位置        X_shift = random.randint(-1, 1)  # x 轴偏移量        radius = random.randint(4, 6)  # 半径和 y 周下降量        xxxxx = random_color(150, 255)        # red = xxxxx[0]        # green = xxxxx[1]        # blue = xxxxx[2]        snow_list.append([x_site, y_site, X_shift, radius, 255, 255, 255])    return snow_listdef draw_xue(snow_list: [], screen, bg_size: [], grand_has: set, grand_list: []):    # 雪花列表循环    # todo 空中的雪    for i in range(len(snow_list)):        # 绘制雪花,颜色、位置、大小        pygame.draw.circle(screen, (snow_list[i][4], snow_list[i][5], snow_list[i][6]), snow_list[i][:2],                           snow_list[i][3] - 3)        # 移动雪花位置(下一次循环起效)        snow_list[i][0] += snow_list[i][2]        snow_list[i][1] += snow_list[i][3]        # 如果雪花落出屏幕,重设位置        if snow_list[i][1] > bg_size[1]:            # tmp = []            snow_list[i][1] = random.randrange(-50, -10)            snow_list[i][0] = random.randrange(0, bg_size[0])            x = snow_list[i][0]            y = bg_size[1]            while (grand_has.__contains__(x * 10000 + y)):                y = y - snow_list[i][3]            grand_has.add(x * 10000 + y)            grand_list.append(                [x, y, snow_list[i][2], snow_list[i][3], snow_list[i][4], snow_list[i][5],                 snow_list[i][6]])def draw_yanhua(yanhua_list: [], screen, bg_size: []):    global fk_list    for i in range(len(yanhua_list)):        # 绘制雪花,颜色、位置、大小        pygame.draw.circle(screen, (yanhua_list[i][4], yanhua_list[i][5], yanhua_list[i][6]), yanhua_list[i][:2],                           yanhua_list[i][3] - 3)        # 移动雪花位置(下一次循环起效)        yanhua_list[i][0] += yanhua_list[i][2]        yanhua_list[i][1] -= yanhua_list[i][3]        # 如果雪花落出屏幕,重设位置        if yanhua_list[i][1] <= 0:            # tmp = []            yanhua_list[i][1] = WIN_H            yanhua_list[i][0] = random.randrange(0, bg_size[0])        if yanhua_list[i][1] <= random.randint(200, 400):            # todo 放烟花            fk = Fireworks(yanhua_list[i][0], yanhua_list[i][1], -20, n=300, color=red_random(1, 150), v=10)            fk_list.append(fk)            yanhua_list[i][1] = WIN_H            yanhua_list[i][0] = random.randrange(0, bg_size[0])def show_shi(a: list, n, screen):    i = 2 * n - 1    j = 2 * n    if i >= len(a):        i = len(a) - 2        j = len(a) - 1    if i >= 0:        myfont = pygame.font.SysFont('simHei', 30)        textsurface = myfont.render(a[i], False, random_color(150, 255))        screen.blit(textsurface, (WIN_W / 2, 30))    if j >= 0:        myfont = pygame.font.SysFont('simHei', 100)        textsurface = myfont.render(a[j], False, red_random(1, 1))        screen.blit(textsurface, (WIN_W / 2 - 200, 50))def main():    global show_n    global fk_list    bg_size = (WIN_W, WIN_H)    screen = pygame.display.set_mode(bg_size)    # bg_img = "./1.png"    pygame.display.set_caption("新年快乐")    # bg = pygame.image.load(bg_img)    pygame.mixer.music.load('D:\\CloudMusic\\小时姑娘 - 霞光-《精灵世纪》片尾曲.mp3')    grand_list = []    font_values = ['新年快乐']    grand_has = set()    clock = pygame.time.Clock()    yanhua_list = init_yanhua(bg_size)    snow_list = init_xue(bg_size)    # 游戏主循环    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))        draw_yanhua(yanhua_list, screen, bg_size)        if len(fk_list) != 0:            print(len(fk_list))        # # 放烟花        show_shi(font_values, 0, screen)        for fk in fk_list:            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])))        tmp = []        for fk in fk_list:            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 y < WIN_H - 1000:                    tmp.append(fk)                    break        fk_list = tmp        min_height = 100000        # todo 地上的积雪        for i in range(len(grand_list)):            if grand_list[i][0] < 375:                min_height = min(min_height, grand_list[i][1])        draw_xue(snow_list, screen, bg_size, grand_has, grand_list)        for i in range(len(grand_list)):            pygame.draw.circle(screen, (grand_list[i][4], grand_list[i][5], grand_list[i][6]), grand_list[i][:2],                               grand_list[i][3] - 3)        pygame.display.update()        time_passed = clock.tick(50)if __name__ == '__main__':    main()

以上是"怎么用Python实现雪夜烟花景"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

雪花 位置 过程 烟花 圆心 效果 循环 快乐 代码 颜色 半径 基础 大小 偏移 雪夜 世纪 内容 姑娘 小时 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司 互联网下的科技发展 网络科技有限互联网 智网互联网科技 互联网科技上市公司 深圳艾佳互联网科技 互联网科技咨询 中国互联网金融科技基金 互联网科技创新企业排名 深圳互联网科技怎么样 开启互联网科技时代小说 恒银科技与互联网金融 互联网科技热点资讯 浙江互联网科技研学营 青岛科技大学互联网大赛研究生 深圳市罗太互联网科技有限公司 上海万顺科技互联网有限公司招聘 中国互联网公司的科技投入 东风日产互联网科技公司叫什么 恒生科技互联网指数十大成分股 上海睿民互联网科技有限公司 互联网科技公司的优势 狮子座互联网科技有限公司 互联网科技类展会 互联网科技股午盘股票涨跌 山东吉时兔互联网科技有限公司 广州慧亚互联网科技怎么样 广东工业互联网大赛深圳学泰科技 下一代互联网重大应用科技园 数字科技和互联网金融哪个好
0