用Python绘制会动的樱花树(附完整源代码)

前言:程序员也能玩转艺术创作!

最近发现一个超有意思的Python项目——用代码画动态樱花树!!!(绝对让你朋友圈点赞破百)这个项目不仅适合装X(划掉)展示编程魅力,还能练习turtle库和数学建模能力。最关键的是,只要50行代码就能实现超治愈的飘落樱花效果!

一、项目效果抢先看

先来点动力(效果描述):

  • 随机生成的樱花树干(每棵树都是独一无二的!)
  • 渐变粉色的立体花瓣层次
  • 实时飘落的樱花雨特效
  • 可调节的飘落速度与密度
  • 动态生长的树枝动画

(运行效果参考:粉色背景下,樱花树从根部开始向上生长,树枝分叉处不断绽放花瓣,同时有花瓣随机飘落效果)

二、开发环境准备

2.1 所需工具

  • Python 3.6+(推荐3.9版本)
  • turtle标准库(无需安装)
  • random库(用于随机效果)
  • time库(控制动画速度)

2.2 避坑指南

  1. 如果出现窗口闪退:在代码结尾加turtle.done()
  2. 动画卡顿:尝试调整turtle.speed(0)或减小递归深度
  3. 颜色显示异常:检查RGB值是否在0-1范围

三、核心代码逐行解析

3.1 树干生成(递归大法好!)

def draw_tree(branch_len, pen):
    if branch_len > 5:  # 递归终止条件
        # 动态调整画笔粗细(超真实!)
        pen.pensize(max(2, branch_len/10))
        
        # 主干绘制
        pen.forward(branch_len)
        
        # 右侧分支(带3度随机偏移)
        right_angle = 20 + random.randint(-3,3)
        pen.right(right_angle)
        draw_tree(branch_len - 15 + random.randint(0,10), pen)  # 随机长度变化
        
        # 左侧分支(不对称设计更自然)
        left_angle = 20 + random.randint(-5,5)
        pen.left(left_angle + right_angle)  # 关键!先回正再加左转
        draw_tree(branch_len - 15 + random.randint(0,10), pen)
        
        # 回退到分支起点
        pen.up()
        pen.backward(branch_len)
        pen.down()

3.2 花瓣飘落(物理引擎简化版)

def petal(m, petal):  # m为花瓣数量
    for _ in range(m):
        # 随机起始位置(模拟不同高度落下)
        x = random.randint(-300, 300)
        y = random.randint(100, 200)
        
        petal.goto(x, y)
        petal.showturtle()
        
        # 抛物线运动分解
        vx = random.uniform(-1, 1)  # 横向速度
        vy = random.uniform(-3, -1)  # 纵向速度
        gravity = 0.1  # 重力加速度
        
        # 动态下落过程
        while y > -200:  # 直到落到地面
            x += vx
            vy += gravity
            y += vy
            petal.goto(x, y)
        
        petal.hideturtle()

四、完整源代码(直接复制可用!)

import turtle as t
import random

# 初始化画布
t.setup(800, 600)
t.bgcolor("lightpink")
t.title("动态樱花树 By 程序员老K")
t.tracer(False)  # 关闭自动刷新

# 创建画笔
pen = t.Turtle()
pen.left(90)
pen.up()
pen.backward(200)
pen.down()
pen.color("sienna")

# 绘制树干(递归函数)
def draw_tree(branch_len):
    if branch_len > 5:
        pen.pensize(max(2, branch_len/10))
        pen.forward(branch_len)
        
        # 右侧分支
        angle = 20 + random.randint(-3,3)
        pen.right(angle)
        draw_tree(branch_len - 15 + random.randint(0,10))
        
        # 左侧分支
        angle = 20 + random.randint(-5,5)
        pen.left(angle * 2)
        draw_tree(branch_len - 15 + random.randint(0,10))
        
        pen.up()
        pen.backward(branch_len)
        pen.down()

# 绘制花朵
def draw_flower():
    flower = t.Turtle()
    flower.hideturtle()
    flower.speed(0)
    
    colors = ["#FFB3B3", "#FF9999", "#FF7F7F"]  # 渐变色系
    
    for _ in range(50):  # 花朵数量
        flower.penup()
        x = random.randint(-300, 300)
        y = random.randint(-200, 200)
        flower.goto(x, y)
        flower.pendown()
        
        flower.color(random.choice(colors))
        flower.begin_fill()
        flower.circle(2)
        flower.end_fill()

# 动画主循环
draw_tree(100)  # 初始树干长度
draw_flower()

# 花瓣飘落动画
petal = t.Turtle()
petal.shape("circle")
petal.shapesize(0.5)
petal.color("#FF69B4")
petal.speed(0)
petal.penup()

while True:  # 持续动画
    petal(random.randint(3,5), petal)
    t.update()  # 手动刷新画面

t.mainloop()

五、参数调优指南(打造专属樱花树)

5.1 形态调整

  • draw_tree(100):数值越大树越高
  • 递归中的-15:控制分支缩短幅度
  • random.randint(0,10):增加树枝不规则度

5.2 颜色修改

  • 背景色:bgcolor("颜色值")
  • 树干色:pen.color("颜色值")
  • 花瓣色:修改colors列表中的色值

5.3 飘落效果

  • vx范围:控制横向飘动幅度
  • gravity:重力感强弱
  • while y > -200:修改花瓣消失位置

六、常见问题Q&A

Q:为什么我的树只长一边?
A:检查分支角度计算,确保左右分支都有合理角度偏移

Q:如何保存为GIF动画?
A:推荐使用turtle.getcanvas().postscript(file="输出.ps")再转换格式

Q:能改成夜樱效果吗?
A:把背景色改为深蓝色,花瓣颜色改成浅紫色即可!

七、创意扩展方向

  1. 添加鼠标交互:点击屏幕生成新树
  2. 增加季节变换:用定时器切换开花/落叶状态
  3. 实现3D效果:用matplotlib库做Z轴扩展
  4. 添加音效:结合pygame播放背景音乐

(小彩蛋:在代码第34行后添加pen.pencolor("#{:06x}".format(random.randint(0,0xFFFFFF)))会出现彩虹树特效!)

结语:编程是另一种艺术创作

这个项目最让我惊艳的是——简单的递归算法+基础图形库,竟能创造出如此生动的自然景观!其实编程和绘画很像,都是在用不同的"笔触"(代码逻辑)描绘世界。

建议大家多尝试修改参数(记得备份原文件!),观察每个变量的影响。当看到自己调出的樱花树在屏幕上绽放时,那种成就感…(你试过就知道!)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值