基于Python实现加强版烟花

上一篇实现的烟花里面预留了很多bug,今天过年,把代码给重新规划了一下。

效果如下:

远处是山和月亮,近处是雪和烟花。

由于忙着吃年夜饭,暂时就不详细解释代码了,空下来了再补上。

这里给出代码,祝各位老哥新年快乐。

import pygame
import random
import math

pygame.init()
pygame.mixer.init()
pygame.font.init()

WIN_W = 1420
WIN_H = 900

t1 = 0.18  # 时间流速
show_n = 0
show_frequency = 0.0015  # 烟花绽放频率,数值越大频率越高

color_list = [
    [255, 0, 0]
]

shan_min_height = 400
shan_max_height = 150
yanhua_times = 30
yanhua_size = 900
yanhua_num = 5

yanhua_map = {}
fk_list = []
a = 30
gift = 1

class Fireworks():
    is_show = False
    x, y = 0, 0
    vy = 0
    p_list = []
    color = [0, 0, 0]
    v = 0
    cnt = 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
        self.cnt = 0
        self.p_list = []
        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.98
            # TODO 去掉的话会越变越大,打开的话会越来越淡
            # 淡或浓
            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 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 green_random(l, r):
    return [random.randint(l, r), 255, random.randint(l, r)]

def init_yanhua(bg_size):
    yanhua_list = []
    for i in range(yanhua_num):
        x_site = random.randrange(175, 350)  # 雪花圆心位置
        y_site = WIN_H  # 雪花圆心位置
        X_shift = 0  # x 轴偏移量
        radius = random.randint(4, 6)  # 半径和 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 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_list

def init_shan(bg_size):
    shan_list = []
    # [x,y,color]
    shan_list.append([0, shan_min_height, green_random(1, 150)])
    shan_list.append([200, shan_max_height, green_random(1, 150)])
    shan_list.append([400, shan_min_height, green_random(1, 150)])
    shan_list.append([600, shan_max_height, green_random(1, 150)])
    shan_list.append([800, shan_min_height, green_random(1, 150)])
    shan_list.append([1000, shan_max_height, green_random(1, 150)])
    shan_list.append([1200, shan_min_height, green_random(1, 150)])
    shan_list.append([1400, shan_max_height, green_random(1, 150)])
    shan_list.append([1600, shan_min_height, green_random(1, 150)])
    return shan_list

def draw_shan(shan_list: [], screen):
    n = len(shan_list)
    for i in range(1, n):
        pygame.draw.line(screen, shan_list[i - 1][2], (shan_list[i - 1][0], shan_list[i - 1][1]),
                         (shan_list[i][0], shan_list[i][1]), width=3)

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]])

def show_yanhua(fk, screen, n):
    global show_n
    # if not fk.is_show:
    #     fk.is_show = False
    #     if random.random() < show_frequency * (n - show_n):
    #         show_n += 1
    #         fk.again()
    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])
        # x, y = fk.x, fk.y
        if random.random() < 0.055:
            screen.set_at((int(x), int(y)), (int(fk.color[0]), int(fk.color[1]), int(fk.color[2])))
            # 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])))

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(175, 350)
        if yanhua_list[i][1] <= random.randint(150, 300):
            # todo 放烟花
            fk = Fireworks(yanhua_list[i][0], yanhua_list[i][1], -20, n=yanhua_size, color=red_random(1, 150), v=10)
            fk_list.append(fk)
            yanhua_list[i][1] = WIN_H
            yanhua_list[i][0] = random.randrange(175, 350)

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 show_gift(flag, screen, bg_size: list, a):
    if flag == 1:
        pygame.draw.rect(screen, red_random(1, 150), ((175, bg_size[1] - 105), (200, 100)))
        pygame.draw.line(screen, (255, 225, 79), (200, bg_size[1] - 105), (200, bg_size[1] - 5), width=3)
        pygame.draw.line(screen, (255, 225, 79), (350, bg_size[1] - 105), (350, bg_size[1] - 5), width=3)
        pygame.draw.line(screen, (255, 225, 79), (200, bg_size[1] - 105), (350, bg_size[1] - 5), width=3)
        pygame.draw.line(screen, (255, 225, 79), (350, bg_size[1] - 105), (200, bg_size[1] - 5), width=3)
        pygame.draw.circle(screen, (255, 225, 79), (275, bg_size[1] - 55), a / 2)

def show_gift2(flag, screen, bg_size: list, a):
    if flag == 1:
        pygame.draw.rect(screen, red_random(1, 150), ((1044, 793), (1241, 893)))
        pygame.draw.line(screen, (255, 225, 79), (bg_size[0] - 200, bg_size[1] - 105), (bg_size[0] - 200, bg_size[1] - 5), width=3)
        pygame.draw.line(screen, (255, 225, 79), (bg_size[0] - 350, bg_size[1] - 105), (bg_size[0] - 350, bg_size[1] - 5), width=3)
        pygame.draw.line(screen, (255, 225, 79), (bg_size[0] - 200, bg_size[1] - 105), (bg_size[0] - 350, bg_size[1] - 5), width=3)
        pygame.draw.line(screen, (255, 225, 79), (bg_size[0] - 350, bg_size[1] - 105), (bg_size[0] - 200, bg_size[1] - 5), width=3)
        pygame.draw.circle(screen, (255, 225, 79), (bg_size[0] - 275, bg_size[1] - 55), a / 2)

def draw_yueliang(screen):
    pygame.draw.circle(screen, (200, 200, 200), (1350, 50), 100, 100)

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)
    shan_list = init_shan(bg_size)
    # 游戏主循环
    while True:
        show_n = 0
        if not pygame.mixer.music.get_busy():
            pygame.mixer.music.play()
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONUP:
                print(event)
            if event.type == pygame.QUIT:
                exit()
        screen.fill((0, 0, 0))
        flag = 0
        min_height = 100000
        # todo 地上的积雪
        for i in range(len(grand_list)):
            if grand_list[i][0] < 375 and grand_list[i][1] < bg_size[1] - gift:
                flag = 1
            if grand_list[i][0] < 375:
                min_height = min(min_height, grand_list[i][1])
        # if len(fk_list) != 0:
        #     print(len(fk_list))
        # # 放烟花
        show_shi(font_values, 0, screen)
        draw_yueliang(screen)
        draw_shan(shan_list, screen)
        if flag == 1:
            draw_yanhua(yanhua_list, screen, bg_size)
            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])
                    screen.set_at((int(x), int(y)), (int(fk.color[0]), int(fk.color[1]), int(fk.color[2])))
                fk.cnt = fk.cnt + 1
        tmp = []
        for fk in fk_list:
            if fk.cnt <= yanhua_times:
                tmp.append(fk)
                break
        show_gift(flag, screen, bg_size, a)
        # show_gift2(flag, screen, bg_size, a)
        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实现加强版烟花的详细内容,更多关于Python烟花的资料请关注我们其它相关文章!

(0)

相关推荐

  • 利用Python Pygame放个烟花

    uu们,有多久没放烟花了?今年你所在的地方允许放烟花么?既然我们不能线下放,那么我们就在线上放个够吧,先上最后效果图 老规矩,先导包,导入pygame,Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows.Linux.Mac OS 等操作系统,具有良好的跨平台性. import pygame from random import randint, uniform, choice import math Pygame 绘制烟花的基本原理 1.发射阶段

  • python烟花效果的代码实例

    天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花,工作之余也可以随时让程序为自己放一场烟花秀. 这个有趣的小项目并不复杂,只需一点可视化技巧,100余行Python代码和程序库Tkinter,最后我们就能达到下面这个效果: 学完本教程后,你也能做出这样的烟花秀. 整体概念梳理 我们的整个理念比较简单. 如上图示,我们这里通过让画面上一个粒子分裂为X数量的粒子来模拟爆炸效果.粒子会发生"膨胀",意思是它们会以恒速移动且相互之间的角度相等.

  • 利用Python写一场新年烟花秀

    目录 1.导库 2.烟花颜色 3.定义烟花类 4.燃放烟花 5.启动 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模块没有装的话,pip install 一下即可,下面看一下代码实现. 1.导库 import tkinter as tk from PIL import Image, ImageTk from time import time, sleep from random import choice, uniform, randi

  • Python Pygame制作雪夜烟花景

    目录 运行截图 实现过程 核心代码 基础架子 下雪的过程 雪落到地上堆起来的过程 实现烟花的过程 完整代码 运行截图 运行效果: 什么?你说你看不清烟花?那我换一种颜色,请点开看. 实现过程 准备工作 使用语言和框架:python.pygame. 安装pygame: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn pygame 你需要知道的基础知识

  • Python Pygame实现可控制的烟花游戏

    目录 实现效果描述 效果 代码地址 解析 main.py core.py fireworks.py 写在最后 自控烟花升空 实现效果描述效果代码地址解析main.pycore.pyfireworks.py 写在最后 实现效果描述 这大过年的不弄点有意思的怎么行呢?可以考虑用编程实现一个烟花升空-爆炸-绚丽地效果.随机的烟花也玩习惯了,这次我们用pygame实现用户鼠标点击屏幕实现放烟花并在指定高度绽放~ 效果 鼠标点击时,烟花点会从屏幕底部正中心发射至鼠标点击点处并绽放出随机的颜色,烟花颗粒符合

  • python代码实现烟花实例

    实现代码如下: # -*- coding: utf-8 -*- import math, random,time import threading import tkinter as tk import re #import uuid Fireworks=[] maxFireworks=8 height,width=600,600 class firework(object): def __init__(self,color,speed,width,height): #uid=uuid.uuid

  • Python新年炫酷烟花秀代码

    先介绍下 Pygame 绘制烟花的基本原理,烟花从发射到绽放一共分为三个阶段: 1,发射阶段:在这一阶段烟花的形状是线性向上,通过设定一组大小不同.颜色不同的点来模拟“向上发射” 的运动运动,运动过程中 5个点被赋予不同大小的加速度,随着时间推移,后面的点会赶上前面的点,最终所有点会汇聚在一起,处于 绽放准备阶段: 2,烟花绽放:烟花绽放这个阶段,是由一个点分散多个点向不同方向发散,并且每个点的移动轨迹可需要被记录,目的是为了追踪整个绽放轨迹. 3,烟花凋零,此阶段负责描绘绽放后烟花的效果,绽放

  • 基于Python实现加强版烟花

    上一篇实现的烟花里面预留了很多bug,今天过年,把代码给重新规划了一下. 效果如下: 远处是山和月亮,近处是雪和烟花. 由于忙着吃年夜饭,暂时就不详细解释代码了,空下来了再补上. 这里给出代码,祝各位老哥新年快乐. import pygame import random import math pygame.init() pygame.mixer.init() pygame.font.init() WIN_W = 1420 WIN_H = 900 t1 = 0.18 # 时间流速 show_n

  • 基于Python实现简易的自制头像神器

    目录 前言 正文 1)原理简介 2)准备中 3)代码展示 4)效果展示 前言 都说新年新气象,所以,为了迎接2022年的到来! 小编决定换一波头像——于是问题来了!换一个什么样的头像比较合适呢? 来!开一波脑洞——作为一个不会PS的普通程序员要怎么快速制作一个属于自己的渐变头像呢?十行 Python 代码就能解决,非常简单! ​ 正文 首先来给大家白嫖几组新年的头像啦!快接着哈 1)原理简介 主要使用到了 Python 的 PIL 库(pip install Pillow),实现步骤也很简单:

  • 基于Python os模块常用命令介绍

    1.os.name---判断现在正在实用的平台,Windows返回'nt':linux返回'posix' 2.os.getcwd()---得到当前工作的目录. 3.os.listdir()--- 4.os.remove---删除指定文件 5.os.rmdir()---删除指定目录 6.os.mkdir()---创建目录(只能创建一层) 7.os.path.isfile()---判断指定对象是否为文件.是则返回True. 8.os.path.isdir()---判断指定对象是否为目录 9.os.p

  • 基于python中的TCP及UDP(详解)

    python中是通过套接字即socket来实现UDP及TCP通信的.有两种套接字面向连接的及无连接的,也就是TCP套接字及UDP套接字. TCP通信模型 创建TCP服务器 伪代码: ss = socket() # 创建服务器套接字 ss.bind() # 套接字与地址绑定 ss.listen() # 监听连接 inf_loop: # 服务器无限循环 cs = ss.accept() # 接受客户端连接 comm_loop: # 通信循环 cs.recv()/cs.send() # 对话(接收/发

  • 基于python中staticmethod和classmethod的区别(详解)

    例子 class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod def class_foo(cls,x): print "executing class_foo(%s,%s)"%(cls,x) @staticmethod def static_foo(x): print "executing static_foo(%s)"%x a=A(

  • 基于python时间处理方法(详解)

    在处理数据和进行机器学习的时候,遇到了大量需要处理的时间序列.比如说:数据库读取的str和time的转化,还有time的差值计算.总结一下python的时间处理方面的内容. 一.字符串和时间序列的转化 time.strptime():字符串=>时间序列 time.strftime():时间序列=>字符串 import time start = "2017-01-01" end = "2017-8-12" startTime = time.strptime

  • 基于Python 的进程管理工具supervisor使用指南

    Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k. 什么情况下我们需要进程管理呢?就是执行一些需要以守护进程方式执行的程序,比如一个后台任务,我最常用的是用来启动和管理基于 Tornado 写的 Web 程序. 除此之

  • 基于python select.select模块通信的实例讲解

    要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值. select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接收所有要发出去的data(outgoing data),第3个监控错误信息在网上一直在找这个select.select的参数解释, 但实在是没有, 哎...自己硬着头皮分析了一下. readable, writable, exceptional = select.select(inputs, ou

  • 基于Python和Scikit-Learn的机器学习探索

    你好,%用户名%! 我叫Alex,我在机器学习和网络图分析(主要是理论)有所涉猎.我同时在为一家俄罗斯移动运营商开发大数据产品.这是我第一次在网上写文章,不喜勿喷. 现在,很多人想开发高效的算法以及参加机器学习的竞赛.所以他们过来问我:"该如何开始?".一段时间以前,我在一个俄罗斯联邦政府的下属机构中领导了媒体和社交网络大数据分析工具的开发.我仍然有一些我团队使用过的文档,我乐意与你们分享.前提是读者已经有很好的数学和机器学习方面的知识(我的团队主要由MIPT(莫斯科物理与技术大学)和

  • 基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解

    Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在画布中创建一个绘图区.在绘图区上画几条线.给图像添加文字说明等.下面我们就通过实例代码来领略一下他的魅力. import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() 上图是我们通

随机推荐