Python实现绘制圣诞树和烟花的示例代码

作者:嗨学编程 时间:2022-03-22 16:22:20 

序言

这不是圣诞节快到了,准备让让女朋友开心开心,也算是亲手做的,稍稍花了点心思。

话不多说,咱们直接来展示吧,学会了赶紧画给你的那个她吧!

本文分为两个大块,我们先来试试画圣诞树。

圣诞树

效果展示

Python实现绘制圣诞树和烟花的示例代码

代码展示

导入模块

import turtle as t
from turtle import *
import random as r
import time

圣诞树细节以及画布大小

画布大小,背景颜色都可以改,我之前把黑色背景换成粉色的,看着也还行。

n = 100.0

speed("fastest")
screensize(bg='black')
left(90)
forward(3 * n)
color("orange", "yellow")
begin_fill()
left(126)

for i in range(5):
   forward(n / 5)
   right(144)
   forward(n / 5)
   left(72)
end_fill()
right(126)

def drawlight():
   if r.randint(0, 30) == 0:
       color('tomato')
       circle(6)
   elif r.randint(0, 30) == 1:
       color('orange')
       circle(3)
   else:
       color('dark green')

color("dark green")
backward(n * 4.8)

def tree(d, s):
   if d <= 0: return
   forward(s)
   tree(d - 1, s * .8)
   right(120)
   tree(d - 3, s * .5)
   drawlight()  # 同时画小彩灯
   right(120)
   tree(d - 3, s * .5)
   right(120)
   backward(s)

tree(15, n)
backward(n / 2)

for i in range(200):
   a = 200 - 400 * r.random()
   b = 10 - 20 * r.random()
   up()
   forward(b)
   left(90)
   forward(a)
   down()
   if r.randint(0, 1) == 0:
       color('tomato')
   else:
       color('wheat')
   circle(2)
   up()
   backward(a)
   right(90)
   backward(b)

写字

这里的颜色 文字 自己都可以改哈 (这个应该不用教吧哈哈)

t.color("dark red", "red")
t.write("Merry Christmas", align="center", font=("Comic Sans MS", 40, "bold"))  

雪花

def drawsnow():
   t.ht()  
   t.pensize(2)  
   for i in range(200):
       t.pencolor("white")  
       t.pu()  
       t.setx(r.randint(-350, 350))  
       t.sety(r.randint(-100, 350))  
       t.pd()  
       dens = 6  
       snowsize = r.randint(1, 10)  
       for j in range(dens):  

t.fd(int(snowsize))
           t.backward(int(snowsize))

t.right(int(360 / dens))  
drawsnow()  
t.done()  

圣诞树上加烟花

效果展示

Python实现绘制圣诞树和烟花的示例代码

Python实现绘制圣诞树和烟花的示例代码

Python实现绘制圣诞树和烟花的示例代码

Python实现绘制圣诞树和烟花的示例代码

代码展示

导入模块

import turtle as t
import random
import threading
import time
import tkinter as tk
import math
from math import cos, sin, atan, sqrt
import numpy as np

背景颜色

t.screensize(bg='black')

心函数

def loving_heart(r):
   l = 2 * r
   t.left(45)
   t.forward(l)
   t.circle(r, 180)
   t.right(90)
   t.circle(r, 180)
   t.forward(l)

星函数

def loving_star(n):
   for i in range(5):
       t.forward(n / 5)
       t.right(144)
       t.forward(n / 5)
       t.left(72)

树函数(递归)

def tree(d, s):
   if d <= 0:
       return
   t.width(5)
   t.forward(s)
   tree(d - 1, s * .8)
   t.right(120)
   tree(d - 3, s * .5)
   t.right(120)
   tree(d - 3, s * .5)
   t.right(120)
   t.backward(s)  # 回退函数

画爱心

t.penup()
t.goto(0, 200)  # 设置起点位置
t.pendown()
t.pencolor('red')  # 设置画笔颜色
t.color('red')
t.begin_fill()  # 对图形进行填充
loving_heart(20)  # 执行画爱心函数
t.end_fill()

画树

n = 100
t.speed(0)
# t.Turtle().screen.delay(0)
t.right(225)
t.color("dark green")
t.backward(n * 4.8)
tree(15, n)
t.backward(n / 5)

绘制落叶

for i in range(100):
   a = 100 - 200 * random.random()
   b = 10 - 20 * random.random()
   t.speed(0)
   t.up()
   t.forward(b)
   t.left(90)
   t.forward(a)
   t.down()
   if random.randint(1, 2) == 1:
       t.color('tomato')
   else:
       t.color('wheat')
   t.circle(4)
   t.up()
   t.backward(a)
   t.right(90)
   t.backward(b)

绘制雪花

def drawsnow():  # 定义画雪花的方法
   t.speed(0)
   t.ht()  # 隐藏笔头,ht=hideturtle
   t.pensize(2)  # 定义笔头大小
   for i in range(160):  # 画多少雪花
       t.pencolor("white")  # 定义画笔颜色为白色,其实就是雪花为白色
       t.pu()  # 提笔,pu=penup
       t.setx(random.randint(-350, 350))  # 定义x坐标,随机从-350到350之间选择
       t.sety(random.randint(-100, 350))  # 定义y坐标,注意雪花一般在地上不会落下,所以不会从太小的纵座轴开始
       t.pd()  # 落笔,pd=pendown
       dens = 6  # 雪花瓣数设为6
       snowsize = random.randint(2, 10)  # 定义雪花大小
       for j in range(dens):  # 就是6,那就是画5次,也就是一个雪花五角星
           # t.forward(int(snowsize))  #int()取整数
           t.fd(int(snowsize))
           t.backward(int(snowsize))
           # t.bd(int(snowsize))  #注意没有bd=backward,但有fd=forward,小bug
           t.right(int(360 / dens))  # 转动角度

画五角星

for i in range(-200, 200, 20):
   t.penup()
   t.goto(i, 300)  # 设置起点位置
   t.pendown()
   t.pencolor('yellow')  # 设置画笔颜色
   t.color('yellow')
   t.begin_fill()  # 对图形进行填充
   loving_star(30)
   t.end_fill()
   t.right(0)

for i in range(-150, 150, 20):
   t.penup()
   t.goto(i, 280)  # 设置起点位置
   t.pendown()
   t.pencolor('yellow')  # 设置画笔颜色
   t.color('yellow')
   t.begin_fill()  # 对图形进行填充
   loving_star(30)
   t.end_fill()
   t.right(0)

for i in range(-100, 100, 20):
   t.penup()
   t.goto(i, 260)  # 设置起点位置
   t.pendown()
   t.pencolor('yellow')  # 设置画笔颜色
   t.color('yellow')
   t.begin_fill()  # 对图形进行填充
   loving_star(30)
   t.end_fill()
   t.right(0)

for i in range(-50, 50, 20):
   t.penup()
   t.goto(i, 240)  # 设置起点位置
   t.pendown()
   t.pencolor('yellow')  # 设置画笔颜色
   t.color('yellow')
   t.begin_fill()  # 对图形进行填充
   loving_star(30)
   t.end_fill()
   t.right(0)

for i in range(-20, 21, 20):
   t.penup()
   t.goto(i, 220)  # 设置起点位置
   t.pendown()
   t.pencolor('yellow')  # 设置画笔颜色
   t.color('yellow')
   t.begin_fill()  # 对图形进行填充
   loving_star(30)
   t.end_fill()
   t.right(0)

署名

t.color("white")  # 填充颜色
t.up()  # 抬笔
t.goto(170, -240)
t.down()  # 落笔
t.write("圣诞节快乐!", font=("Times New Roman", 18, "normal"))
t.ht()
# t.done()
t.hideturtle()
time.sleep(2)

烟火

WIDTH = 0
HEIGHT = 0
ORI = (0, 0)
COLOR = {'0': '#070920', 'navyblue': '#000080'}
FIRE = []

def setParam():
   global WIDTH
   global HEIGHT
   global ORI
   global FIRE
   WIDTH = t.window_width()
   HEIGHT = t.window_height()
   ORI = (0, -HEIGHT / 2)
   # gold
   FIRE.append(['white', '#FFD700', '#DAA520', '#BDB76B', ])
   # red
   FIRE.append(['white', '#F08080', '#A0522D', '#DC143C', ])
   # green
   FIRE.append(['white', '#7FFF00', '#32CD32', '#006400', ])
   # cyan
   FIRE.append(['white', '#40E0D0', '#00FFFF', '#008080', ])
   # pink
   FIRE.append(['white', '#FF69B4', '#FF1493', '#8B008B', ])
   # buff
   FIRE.append(['white', '#FFE4C4', '#FFDAB9', '#F0FFF0', ])
   # bluish
   FIRE.append(['white', '#ADD8E6', '#AFEEEE', '#00BFFF', ])

def dist(a, b):  # 距离
   return ((a - b) * (a - b)).sum()

def shoot():
   t.tracer(4)  # 在循环中,图形将一次画出4次循环的图
   t.pu()
   target = np.array((np.random.randint(-WIDTH // 6, WIDTH // 6),
                      HEIGHT // 6))  # 都在同一高度
   angle = atan((target - ORI)[1] / (target - ORI)[0])
   if angle < 0:
       angle += math.pi  # 纠正负方向
   unit = np.array([cos(angle), sin(angle)])  # 方向向量
   print('angle: ', angle)
   print('target: ', target)
   # 镜头的顺序坐标
   seq = np.array([ORI, ORI - 55 * unit, ORI - 105 * unit, ORI - 155 * unit])
   t.speed(0)  # 瞬动
   while dist(seq[0], target) > 120:  # 如果没有到达 * 中心
       seq = seq + 30 * unit

t.goto(seq[1])
       t.pd()
       t.width(3)
       t.pencolor('white')
       t.goto(seq[0])
       t.pu()

t.goto(seq[2])
       t.pd()
       t.width(3)
       t.pencolor('yellow')
       t.goto(seq[1])
       t.pu()

# 清除发射上去的光束尾迹
       t.goto(seq[3])
       t.pd()
       t.width(10)
       t.pencolor(COLOR['0'])
       t.goto(seq[2])
       t.pu()
       time.sleep(0.05)

# 发射上去的光束最后清除
   t.pd()
   t.width(10)
   t.goto(seq[0])
   t.pu()
   time.sleep(0.1)
   return target  # 就在 * 中心

def explode(center):
   number = np.random.randint(50, 100)  # 光束数
   colormode = np.random.randint(0, 5)
   unit = np.array([])  # 方向向量
   spd = []  # 每个光束的速度
   seq = []  # 每个波束的顺序坐标
   if colormode <= 1:
       coloridx = [np.random.randint(0, len(FIRE))]
   elif colormode == 2:
       coloridx = [np.random.randint(0, len(FIRE)),
                   np.random.randint(0, len(FIRE))]
   elif colormode == 3:
       coloridx = [np.random.randint(0, len(FIRE)),
                   np.random.randint(0, len(FIRE)),
                   np.random.randint(0, len(FIRE))]
   elif colormode == 4:
       coloridx = []

不同大小烟花的步骤

steps = int((number ** 0.5) * 2)

初始化

for i in range(number):
       angle = np.random.rand() * 2 * math.pi - math.pi
       unit = np.append(unit, [cos(angle), sin(angle)]).reshape(-1, 2)
       seq = np.append(
           seq,
           [center,
            center - 10 * unit[i], center - 50 * unit[i],
            center - 90 * unit[i], center - 130 * unit[i],
            center - 135 * unit[i]]
       )
       spd.append(int(15 + (np.random.rand() - 0.5) * 5))

if colormode <= 1:
           coloridx.append(coloridx[0])
       elif colormode == 2:
           coloridx.append(coloridx[np.random.randint(0, 2)])
       elif colormode == 3:
           coloridx.append(coloridx[np.random.randint(0, 3)])
       elif colormode == 4:
           coloridx.append(np.random.randint(0, len(FIRE)))

seq = seq.reshape([-1, 6, 2]).astype(np.int32)
   t.tracer(0x3f3f3f3f)  # 关闭自动更新,0x3f3f3f3f是一个大数字

for stage in range(steps):
       for i in range(number):
           seq[i] = seq[i] + spd[i] * unit[i]
           seq[i][4] = center
           for cur in range(4):
               t.pu()
               t.goto(seq[i][cur + 1])
               t.pd()
               t.pencolor(FIRE[coloridx[i]][cur])
               t.width(4 - cur)
               t.goto(seq[i][cur])
               t.pu()
       if stage >= 5:  # 等待所有光束就位
           t.update()
           time.sleep(0.04)

清除每次绽放的烟花

for cur in range(4, -1, -1):
       for i in range(number):
           t.pu()
           t.goto(seq[i][cur + 1])
           t.pd()
           t.pencolor(COLOR['0'])
           t.width(100)
           t.goto(seq[i][cur])
           t.pu()
       time.sleep(0.02)
       t.update()

来源:https://blog.csdn.net/fei347795790/article/details/128225147

标签:Python,圣诞树,烟花
0
投稿

猜你喜欢

  • Vuex模块化实现待办事项的状态管理

    2024-04-27 15:59:55
  • Python中lambda的用法及其与def的区别解析

    2021-09-22 13:59:03
  • Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作

    2023-07-07 08:25:36
  • [翻译]标记语言和样式手册 Chapter 14 图片替换

    2008-02-18 12:56:00
  • 某年第一周开始日期实现方法

    2024-01-21 08:37:44
  • javascript定时变换图片实例代码

    2024-04-17 10:24:14
  • Vue过滤器的用法和自定义过滤器使用

    2024-05-09 10:41:20
  • 设定php简写功能的方法

    2024-05-13 09:25:21
  • python实现简单井字棋游戏

    2023-08-08 21:38:01
  • python和php学习哪个更有发展

    2023-05-06 17:40:20
  • 小型Drupal数据库备份以及大型站点MySQL备份策略分享

    2024-01-28 05:32:50
  • getElementsByAttribute

    2009-10-27 12:13:00
  • GoLang基础学习之go test测试

    2024-02-06 16:28:19
  • SQLSERVER SQL性能优化技巧

    2024-01-22 14:02:42
  • opencv-python图像增强解读

    2022-10-10 04:29:16
  • python调用fortran模块

    2023-12-22 23:36:40
  • Python闭包与装饰器原理及实例解析

    2023-04-08 19:44:30
  • python爬虫入门教程之点点美女图片爬虫代码分享

    2021-01-14 21:45:07
  • Xml中SelectSingleNode方法中的xpath用法

    2010-01-30 12:46:00
  • 图文详解mysql5.7安装教程

    2024-01-26 10:47:03
  • asp之家 网络编程 m.aspxhome.com