文章目录
前言:程序员也能玩转艺术创作!
最近发现一个超有意思的Python项目——用代码画动态樱花树!!!(绝对让你朋友圈点赞破百)这个项目不仅适合装X(划掉)展示编程魅力,还能练习turtle库和数学建模能力。最关键的是,只要50行代码就能实现超治愈的飘落樱花效果!
一、项目效果抢先看
先来点动力(效果描述):
- 随机生成的樱花树干(每棵树都是独一无二的!)
- 渐变粉色的立体花瓣层次
- 实时飘落的樱花雨特效
- 可调节的飘落速度与密度
- 动态生长的树枝动画
(运行效果参考:粉色背景下,樱花树从根部开始向上生长,树枝分叉处不断绽放花瓣,同时有花瓣随机飘落效果)
二、开发环境准备
2.1 所需工具
- Python 3.6+(推荐3.9版本)
- turtle标准库(无需安装)
- random库(用于随机效果)
- time库(控制动画速度)
2.2 避坑指南
- 如果出现窗口闪退:在代码结尾加
turtle.done() - 动画卡顿:尝试调整
turtle.speed(0)或减小递归深度 - 颜色显示异常:检查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:把背景色改为深蓝色,花瓣颜色改成浅紫色即可!
七、创意扩展方向
- 添加鼠标交互:点击屏幕生成新树
- 增加季节变换:用定时器切换开花/落叶状态
- 实现3D效果:用
matplotlib库做Z轴扩展 - 添加音效:结合
pygame播放背景音乐
(小彩蛋:在代码第34行后添加pen.pencolor("#{:06x}".format(random.randint(0,0xFFFFFF)))会出现彩虹树特效!)
结语:编程是另一种艺术创作
这个项目最让我惊艳的是——简单的递归算法+基础图形库,竟能创造出如此生动的自然景观!其实编程和绘画很像,都是在用不同的"笔触"(代码逻辑)描绘世界。
建议大家多尝试修改参数(记得备份原文件!),观察每个变量的影响。当看到自己调出的樱花树在屏幕上绽放时,那种成就感…(你试过就知道!)
1万+

被折叠的 条评论
为什么被折叠?



