各位朋友们,小编在这里要分享,python画图代码大全画雪人 用python画雪人编程代码,让我们开始吧!
前言
已经2024年了 ,到了这个时间点,部分小伙伴已经开始复盘这一年的得与失python中文手机版安装,python中文版软件下载。比如今年增加了多少技能点,看了多少本书,写了多少篇文章或者年前的小目标实现进度大概多少等等;做一个象征性的年终总结来告别2023,迎接2024:
本篇文章,带大家用 Python 制作一个炫酷烟花秀,来迎接即将到来的春节。开始之前先看一下最终效果
环境介绍:
语言:Python;
库:Pygame;
原理介绍
在介绍代码之前,先介绍下 Pygame 绘制烟花的基本原理,烟花从发射到绽放一共分为三个阶段:
1, 发射阶段 :在这一阶段烟花的形状是线性向上,通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动,运动过程中 5个点被赋予不同大小的加速度,随着时间推移,后面的点会赶上前面的点,最终所有点会汇聚在一起,处于 绽放准备阶段 ;
2, 烟花绽放 :烟花绽放这个阶段,是由一个点分散多个点向不同方向发散,并且每个点的移动轨迹可需要被记录,目的是为了追踪整个绽放轨迹。
3, 烟花凋零 ,此阶段负责描绘绽放后烟花的效果,绽放后的烟花,而在每一时刻点的下降速度和亮度(代码中也叫透明度)是不一样的,因此在代码里,将烟花绽放后将每个点赋予两个属性:分别为重力向量和生命周期,来模拟烟花在不同时期时不同的展现效果,
代码实操
代码部分将烟花封装为三个类:
Firework : 烟花整体;
Particle : 烟花粒子(包含轨迹)
Trail : 烟花轨迹,本质上是一个点 。
三个类之间的关系为:一个Firework 由多个 Particle 构成,而一个 Particle 由多个 Trail 构成
首先设置全局变量,例如重力向量,窗口大小,Trail 的颜色列表(多为灰色或白色)以及不同状态下 Trail 之间间隔
gravity = 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 = 1
static_offset = 3
创建 Trail 类,定义 show 方法绘制轨迹 、get_pos 实时获取轨迹坐标
class Trail:
def __init__(self, n, size, dynamic):
_in_line = n
= vector(-10, -10)
self.dynamic = dynamic
if self.dynamic:
self.colour = trail_colours[n]
= int(size - n / 2)
else:
self.colour = (255, 255, 200)
= size - 2
if < 0:
= 0
def get_pos(self, x, y):
= vector(x, y)
def show(self, win):
.circle(win, self.colour, (int(.x), int(.y)), )
Particle 类核心代码
class Particle:
def __init__(self, x, y, firework, colour):
self.firework = firework
= vector(x, y)
self.origin = vector(x, y)
self.radius = 20
self.remove = False
self.explosion_radius = randint(5, 18)
= 0
= 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:
= vector(0, -randint(17, 20))
= 5
self.colour = colour
for i in range(5):
self.trails.append(Trail(i, , True))
else:
= vector(uniform(-1, 1), uniform(-1, 1))
.x *= randint(7, self.explosion_radius + 2)
.y *= randint(7, self.explosion_radius + 2)
# 向量
= randint(2, 4)
self.colour = choice(colour)
# 5 个 tails总计
for i in range(5):
self.trails.append(Trail(i, , False))
def apply_force(self, force):
+= force
def move(self):
if not self.firework:
.x *= 0.8
.y *= 0.8
+=
+=
*= 0
if == 0 and not self.firework: # check if particle is outside explosion radius
distance = ((.x - self.origin.x) ** 2 + (.y - self.origin.y) ** 2)
if distance > self.explosion_radius:
self.remove = True
self.decay()
self.trail_update()
+= 1
def show(self, win):
.circle(win, (self.colour[0], self.colour[1], self.colour[2], 0), (int(.x), int(.y)),
)
def decay(self): # random decay of the particles
if 50 > > 10: # early stage their is a small chance of decay
ran = randint(0, 30)
if ran == 0:
self.remove = True
elif > 50:
ran = randint(0, 5)
if ran == 0:
self.remove = True
Firework 类核心代码
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)
()
for tf in self.firework.trails:
(win)
(win)
if .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)))
()
for t in particle.trails:
t.show(win)
(win)
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
最后,写一个 main 方法来对 pygame 环境进行初始化,例如背景图片,文字,设置页面刷新间隔,程序中设置的每 60ms 刷新一次。
pygame.display.set_caption("Fireworks in Pygame") # 标题
background = ("") # 背景
myfont = ("",80)
myfont1 = ("", 30)
testsurface = myfont.render("元旦快乐",False,(255,255,255))
testsurface1 = myfont1.render("By:小张Python", False, (255, 255, 255))
# ("")
win = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT))
# (background)
clock = .Clock()
fireworks = [Firework() for i in range(2)] # create the first fireworks
running = True
while running:
(60)
((20, 20, 30)) # draw background
(background,(0,0))
(testsurface,(200,200))
(testsurface1, (300,200))
if randint(0, 20) == 1: # create new firework
fireworks.append(Firework())
update(win, fireworks)
另外程序中会对你的按键命令进行监控:
当按下键 1时 ,会立即生成一个新的 “烟花”; 当按下键 2时,会同时生成 10 个 “烟花”
for event in ():
if == :
running = False
if == pygame.KEYDOWN: # Change game speed with number keys
if == pygame.K_1: # 按下 1
fireworks.append(Firework())
if == pygame.K_2: # 按下 2 加入10个烟花
for i in range(10):
fireworks.append(Firework())
总的来说,整个小案例的代码量不算很多,一共250行左右,但案例中涉及到较为复杂的绘制逻辑和抽象的类之间的封装关系,因此大家理解代码相对会需要耗费点时间。
写到这里,本篇文章算基本结束了,主要介绍就是如何用 Pygame 来模拟一个烟花绽放过程,核心内容大致两点:第一,如何用绘制点的方式来模拟烟花绽放运动轨迹;第二 介绍Pygame 一些基础用法:替换背景,绘制文字,更新状态等功能。
代码前出塞
如果你对Python感兴趣,想要学习python,这里给大家分享一份Python前出塞前出塞,都是我自己学习时整理的,希望可以帮到你,一起加油!
😝有需要的小伙伴,可以V前出塞下方二维码前出塞🆓
1️⃣零基础入门
① 学习路线
对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
2️⃣国内外Python书籍、文档
① 文档和书籍资料
3️⃣Python工具包+项目源码合集
①Python工具包
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
②Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
③Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
4️⃣Python面试题
我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
上述所有资料 ⚡️ ,朋友们如果有需要的,可以前出塞下方👇👇👇二维码前出塞🆓
原文地址1:https://blog.csdn.net/xiaoganbuaiuk/article/details/135980018
python手册 http://www.78tp.com/python/