当前位置:   article > 正文

Python烟花(有源码)

Python烟花(有源码)

本人将圣诞树和烟花相结合进行了绘制,话不多说,代码如下,赶紧给你的心仪之人吧!时间仓促,大家千万别嘲笑哈,祝大家一切顺利!使用前记得改署名呦!三连一下哦~谢谢!

效果图:

完整代码: 

  1. '''
  2. name:圣诞树+烟火
  3. author:Babysen
  4. '''
  5. import turtle as t
  6. import random
  7. import threading
  8. import time
  9. import tkinter as tk
  10. import math
  11. from math import cos, sin, atan, sqrt
  12. import numpy as np
  13. t.screensize(bg='black') # 定义背景颜色
  14. # 心函数
  15. def loving_heart(r):
  16. l = 2 * r
  17. t.left(45)
  18. t.forward(l)
  19. t.circle(r, 180)
  20. t.right(90)
  21. t.circle(r, 180)
  22. t.forward(l)
  23. # 星函数
  24. def loving_star(n):
  25. for i in range(5):
  26. t.forward(n / 5)
  27. t.right(144)
  28. t.forward(n / 5)
  29. t.left(72)
  30. # 树函数(递归)
  31. def tree(d, s):
  32. if d <= 0:
  33. return
  34. t.width(5)
  35. t.forward(s)
  36. tree(d - 1, s * .8)
  37. t.right(120)
  38. tree(d - 3, s * .5)
  39. t.right(120)
  40. tree(d - 3, s * .5)
  41. t.right(120)
  42. t.backward(s) # 回退函数
  43. # 画爱心部分
  44. t.penup()
  45. t.goto(0, 200) # 设置起点位置
  46. t.pendown()
  47. t.pencolor('red') # 设置画笔颜色
  48. t.color('red')
  49. t.begin_fill() # 对图形进行填充
  50. loving_heart(20) # 执行画爱心函数
  51. t.end_fill()
  52. # 画树部分
  53. n = 100
  54. t.speed(0)
  55. # t.Turtle().screen.delay(0)
  56. t.right(225)
  57. t.color("dark green")
  58. t.backward(n * 4.8)
  59. tree(15, n)
  60. t.backward(n / 5)
  61. # 绘制落叶
  62. for i in range(100):
  63. a = 100 - 200 * random.random()
  64. b = 10 - 20 * random.random()
  65. t.speed(0)
  66. t.up()
  67. t.forward(b)
  68. t.left(90)
  69. t.forward(a)
  70. t.down()
  71. if random.randint(1, 2) == 1:
  72. t.color('tomato')
  73. else:
  74. t.color('wheat')
  75. t.circle(4)
  76. t.up()
  77. t.backward(a)
  78. t.right(90)
  79. t.backward(b)
  80. # 绘制雪花
  81. def drawsnow(): # 定义画雪花的方法
  82. t.speed(0)
  83. t.ht() # 隐藏笔头,ht=hideturtle
  84. t.pensize(2) # 定义笔头大小
  85. for i in range(160): # 画多少雪花
  86. t.pencolor("white") # 定义画笔颜色为白色,其实就是雪花为白色
  87. t.pu() # 提笔,pu=penup
  88. t.setx(random.randint(-350, 350)) # 定义x坐标,随机从-350到350之间选择
  89. t.sety(random.randint(-100, 350)) # 定义y坐标,注意雪花一般在地上不会落下,所以不会从太小的纵座轴开始
  90. t.pd() # 落笔,pd=pendown
  91. dens = 6 # 雪花瓣数设为6
  92. snowsize = random.randint(2, 10) # 定义雪花大小
  93. for j in range(dens): # 就是6,那就是画5次,也就是一个雪花五角星
  94. # t.forward(int(snowsize)) #int()取整数
  95. t.fd(int(snowsize))
  96. t.backward(int(snowsize))
  97. # t.bd(int(snowsize)) #注意没有bd=backward,但有fd=forward,小bug
  98. t.right(int(360 / dens)) # 转动角度
  99. drawsnow()
  100. # 画五角星
  101. for i in range(-200,200,20):
  102. t.penup()
  103. t.goto(i, 300) # 设置起点位置
  104. t.pendown()
  105. t.pencolor('yellow') # 设置画笔颜色
  106. t.color('yellow')
  107. t.begin_fill() # 对图形进行填充
  108. loving_star(30)
  109. t.end_fill()
  110. t.right(0)
  111. for i in range(-150,150,20):
  112. t.penup()
  113. t.goto(i, 280) # 设置起点位置
  114. t.pendown()
  115. t.pencolor('yellow') # 设置画笔颜色
  116. t.color('yellow')
  117. t.begin_fill() # 对图形进行填充
  118. loving_star(30)
  119. t.end_fill()
  120. t.right(0)
  121. for i in range(-100,100,20):
  122. t.penup()
  123. t.goto(i, 260) # 设置起点位置
  124. t.pendown()
  125. t.pencolor('yellow') # 设置画笔颜色
  126. t.color('yellow')
  127. t.begin_fill() # 对图形进行填充
  128. loving_star(30)
  129. t.end_fill()
  130. t.right(0)
  131. for i in range(-50,50,20):
  132. t.penup()
  133. t.goto(i, 240) # 设置起点位置
  134. t.pendown()
  135. t.pencolor('yellow') # 设置画笔颜色
  136. t.color('yellow')
  137. t.begin_fill() # 对图形进行填充
  138. loving_star(30)
  139. t.end_fill()
  140. t.right(0)
  141. for i in range(-20,21,20):
  142. t.penup()
  143. t.goto(i, 220) # 设置起点位置
  144. t.pendown()
  145. t.pencolor('yellow') # 设置画笔颜色
  146. t.color('yellow')
  147. t.begin_fill() # 对图形进行填充
  148. loving_star(30)
  149. t.end_fill()
  150. t.right(0)
  151. # 写下署名
  152. t.color("white") # 填充颜色
  153. t.up() # 抬笔
  154. t.goto(170, -240)
  155. t.down() # 落笔
  156. t.write("Author:Babysen", font=("Times New Roman", 18, "normal"))
  157. t.ht()
  158. # t.done()
  159. t.hideturtle()
  160. time.sleep(2)
  161. #烟火
  162. WIDTH = 0
  163. HEIGHT = 0
  164. ORI = (0, 0)
  165. COLOR = {'0': '#070920', 'navyblue': '#000080'}
  166. FIRE = []
  167. def setParam():
  168. global WIDTH
  169. global HEIGHT
  170. global ORI
  171. global FIRE
  172. WIDTH = t.window_width()
  173. HEIGHT = t.window_height()
  174. ORI = (0, -HEIGHT / 2)
  175. # gold
  176. FIRE.append(['white', '#FFD700', '#DAA520', '#BDB76B', ])
  177. # red
  178. FIRE.append(['white', '#F08080', '#A0522D', '#DC143C', ])
  179. # green
  180. FIRE.append(['white', '#7FFF00', '#32CD32', '#006400', ])
  181. # cyan
  182. FIRE.append(['white', '#40E0D0', '#00FFFF', '#008080', ])
  183. # pink
  184. FIRE.append(['white', '#FF69B4', '#FF1493', '#8B008B', ])
  185. # buff
  186. FIRE.append(['white', '#FFE4C4', '#FFDAB9', '#F0FFF0', ])
  187. # bluish
  188. FIRE.append(['white', '#ADD8E6', '#AFEEEE', '#00BFFF', ])
  189. def dist(a, b): # 距离
  190. return ((a - b) * (a - b)).sum()
  191. def shoot():
  192. t.tracer(4) # 在循环中,图形将一次画出4次循环的图
  193. t.pu()
  194. target = np.array((np.random.randint(-WIDTH // 6, WIDTH // 6),
  195. HEIGHT // 6)) # 都在同一高度
  196. angle = atan((target - ORI)[1] / (target - ORI)[0])
  197. if angle < 0:
  198. angle += math.pi # 纠正负方向
  199. unit = np.array([cos(angle), sin(angle)]) # 方向向量
  200. print('angle: ', angle)
  201. print('target: ', target)
  202. # 镜头的顺序坐标
  203. seq = np.array([ORI, ORI - 55 * unit, ORI - 105 * unit, ORI - 155 * unit])
  204. t.speed(0) # 瞬动
  205. while dist(seq[0], target) > 120: # 如果没有到达爆炸中心
  206. seq = seq + 30 * unit
  207. t.goto(seq[1])
  208. t.pd()
  209. t.width(3)
  210. t.pencolor('white')
  211. t.goto(seq[0])
  212. t.pu()
  213. t.goto(seq[2])
  214. t.pd()
  215. t.width(3)
  216. t.pencolor('yellow')
  217. t.goto(seq[1])
  218. t.pu()
  219. # 清除发射上去的光束尾迹
  220. t.goto(seq[3])
  221. t.pd()
  222. t.width(10)
  223. t.pencolor(COLOR['0'])
  224. t.goto(seq[2])
  225. t.pu()
  226. time.sleep(0.05)
  227. # 发射上去的光束最后清除
  228. t.pd()
  229. t.width(10)
  230. t.goto(seq[0])
  231. t.pu()
  232. time.sleep(0.1)
  233. return target # 就在爆炸中心
  234. def explode(center):
  235. number = np.random.randint(50, 100) # 光束数
  236. colormode = np.random.randint(0, 5)
  237. unit = np.array([]) # 方向向量
  238. spd = [] # 每个光束的速度
  239. seq = [] # 每个波束的顺序坐标
  240. if colormode <= 1:
  241. coloridx = [np.random.randint(0, len(FIRE))]
  242. elif colormode == 2:
  243. coloridx = [np.random.randint(0, len(FIRE)),
  244. np.random.randint(0, len(FIRE))]
  245. elif colormode == 3:
  246. coloridx = [np.random.randint(0, len(FIRE)),
  247. np.random.randint(0, len(FIRE)),
  248. np.random.randint(0, len(FIRE))]
  249. elif colormode == 4:
  250. coloridx = []
  251. # 不同大小烟花的步骤
  252. steps = int((number ** 0.5) * 2)
  253. # 初始化
  254. for i in range(number):
  255. angle = np.random.rand() * 2 * math.pi - math.pi
  256. unit = np.append(unit, [cos(angle), sin(angle)]).reshape(-1, 2)
  257. seq = np.append(
  258. seq,
  259. [center,
  260. center - 10 * unit[i], center - 50 * unit[i],
  261. center - 90 * unit[i], center - 130 * unit[i],
  262. center - 135 * unit[i]]
  263. )
  264. spd.append(int(15 + (np.random.rand() - 0.5) * 5))
  265. if colormode <= 1:
  266. coloridx.append(coloridx[0])
  267. elif colormode == 2:
  268. coloridx.append(coloridx[np.random.randint(0, 2)])
  269. elif colormode == 3:
  270. coloridx.append(coloridx[np.random.randint(0, 3)])
  271. elif colormode == 4:
  272. coloridx.append(np.random.randint(0, len(FIRE)))
  273. seq = seq.reshape([-1, 6, 2]).astype(np.int32)
  274. t.tracer(0x3f3f3f3f) # 关闭自动更新,0x3f3f3f3f是一个大数字
  275. for stage in range(steps):
  276. for i in range(number):
  277. seq[i] = seq[i] + spd[i] * unit[i]
  278. seq[i][4] = center
  279. for cur in range(4):
  280. t.pu()
  281. t.goto(seq[i][cur + 1])
  282. t.pd()
  283. t.pencolor(FIRE[coloridx[i]][cur])
  284. t.width(4 - cur)
  285. t.goto(seq[i][cur])
  286. t.pu()
  287. if stage >= 5: # 等待所有光束就位
  288. t.update()
  289. time.sleep(0.04)
  290. # 清除每次绽放的烟花
  291. for cur in range(4, -1, -1):
  292. for i in range(number):
  293. t.pu()
  294. t.goto(seq[i][cur + 1])
  295. t.pd()
  296. t.pencolor(COLOR['0'])
  297. t.width(100)
  298. t.goto(seq[i][cur])
  299. t.pu()
  300. time.sleep(0.02)
  301. t.update()
  302. def main():
  303. t.setup(700, 750, 100, 0)
  304. setParam()
  305. while True:
  306. point = shoot()
  307. explode(point)
  308. exitonclick() # 在任何位置单击退出
  309. if __name__ == '__main__':
  310. main()

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

闽ICP备14008679号