当前位置:   article > 正文

小年到了,用 Python 实现一场环保无污染的烟花秀,祝大家节日快乐_写一个关于环保的小游戏用python

写一个关于环保的小游戏用python

烟花由中国古代人民较早发明,常用于盛大的典礼或表演中,也在除夕夜及元宵节中燃放用来烘托节日氛围。小年到了,但是近年来随着环境污染的加剧,一些地区已经禁止燃放烟花了,那我们就用 Python 实现一场无污染的烟花秀。

环境

  • 操作系统:Windows
  • Python 版本:3.6
  • 涉及模块:tkinter、PIL、time、random、math

实现

导入库

  1. import tkinter as tk
  2. from PIL import Image, ImageTk
  3. from time import time, sleep
  4. from random import choice, uniform, randint
  5. from math import sin, cos, radians

烟花颜色

colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
  • 定义烟花类
  1. class fireworks:
  2. def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):
  3. self.id = idx
  4. # 烟花绽放 x 轴
  5. self.x = x
  6. # 烟花绽放 x 轴
  7. self.y = y
  8. self.initial_speed = explosion_speed
  9. # 外放 x 轴速度
  10. self.vx = vx
  11. # 外放 y 轴速度
  12. self.vy = vy
  13. # 绽放的粒子数
  14. self.total = total
  15. # 已停留时间
  16. self.age = 0
  17. # 颜色
  18. self.color = color
  19. # 画布
  20. self.cv = cv
  21. self.cid = self.cv.create_oval(x - size, y - size, x + size, y + size,
  22. fill=self.color)
  23. self.lifespan = lifespan
  24. # 更新数据
  25. def update(self, dt):
  26. self.age += dt
  27. # 粒子膨胀
  28. if self.alive() and self.expand():
  29. move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speed
  30. move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed
  31. self.cv.move(self.cid, move_x, move_y)
  32. self.vx = move_x / (float(dt) * 1000)
  33. # 膨胀到最大下落
  34. elif self.alive():
  35. move_x = cos(radians(self.id * 360 / self.total))
  36. self.cv.move(self.cid, self.vx + move_x, self.vy + 0.5 * dt)
  37. self.vy += 0.5 * dt
  38. # 过期移除
  39. elif self.cid is not None:
  40. cv.delete(self.cid)
  41. self.cid = None
  42. # 定义膨胀效果的时间帧
  43. def expand(self):
  44. return self.age <= 1.5
  45. # 检查粒子是否仍在生命周期内
  46. def alive(self):
  47. return self.age <= self.lifespan

燃放烟花

  1. def ignite(cv):
  2. t = time()
  3. # 烟花列表
  4. explode_points = []
  5. wait_time = randint(10, 100)
  6. # 爆炸的个数
  7. numb_explode = randint(6, 10)
  8. for point in range(numb_explode):
  9. # 爆炸粒子列表
  10. objects = []
  11. # 爆炸 x 轴
  12. x_cordi = randint(50, 550)
  13. # 爆炸 y 轴
  14. y_cordi = randint(50, 150)
  15. speed = uniform(0.5, 1.5)
  16. size = uniform(0.5, 3)
  17. color = choice(colors)
  18. # 爆炸的绽放速度
  19. explosion_speed = uniform(0.2, 1)
  20. # 爆炸的粒子数半径
  21. total_particles = randint(10, 50)
  22. for i in range(1, total_particles):
  23. r = fireworks(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,
  24. vx=speed, vy=speed, color=color, size=size,
  25. lifespan=uniform(0.6, 1.75))
  26. # 添加进粒子列表里
  27. objects.append(r)
  28. # 把粒子列表添加到烟花列表
  29. explode_points.append(objects)
  30. total_time = .0
  31. # 在 1.8 秒时间帧内保持更新
  32. while total_time < 1.8:
  33. # 让画面暂停 0.01s
  34. sleep(0.01)
  35. # 刷新时间
  36. tnew = time()
  37. t, dt = tnew, tnew - t
  38. # 遍历烟花列表
  39. for point in explode_points:
  40. # 遍历烟花里的粒子列表
  41. for item in point:
  42. # 更新时间
  43. item.update(dt)
  44. # 刷新页面
  45. cv.update()
  46. total_time += dt
  47. root.after(wait_time, ignite, cv)

启动

  1. if __name__ == "__main__":
  2. root = tk.Tk()
  3. # 绘制一个画布
  4. cv = tk.Canvas(root, height=400, width=600)
  5. # 背景图
  6. image = Image.open("bg.jpg")
  7. photo = ImageTk.PhotoImage(image)
  8. # 在画板上绘制一张图片
  9. cv.create_image(0, 0, image=photo, anchor='nw')
  10. cv.pack()
  11. root.protocol(close)
  12. root.after(100, ignite, cv)
  13. # 生成窗口
  14. root.mainloop()

最终效果,如图所示:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/149223
推荐阅读
相关标签
  

闽ICP备14008679号