import random
import turtle

__Pen = turtle.Pen()


# 分形樱花树

# “画树”函数
# 参数分别是树枝长度、画笔

def tree(branchLen, t):
    if (branchLen > 3):
        if (8 <= branchLen and branchLen <= 12) :
            # 花朵层：用两种粉色交错，形成层次
            if (random.randint(0, 2) == 0) :
                t.pencolor('mistyrose')
            else :
                t.pencolor('lightpink')
            t.pensize((branchLen / 4))
        elif (branchLen < 8) :
            # 花瓣最密处：深一点的粉，让花团更饱满
            if (random.randint(0, 1) == 0) :
                t.pencolor('pink')
            else :
                t.pencolor('lightpink')
            t.pensize((branchLen / 3))
        else :
            # 树干树枝：用暖棕色，比 sienna 更柔和不刺眼
            t.pencolor('peru')
            t.pensize((branchLen / 12))
        t.forward(branchLen)
        a = (1.5 * (random.random()))
        t.right((20 * a))
        b = (1.5 * (random.random()))
        # 在tree函数内部调自己，这种方式叫递归调用
        # 递归可以大幅提升编程效率
        tree(branchLen - 10 * b, t)
        t.left((40 * a))
        tree(branchLen - 10 * b, t)
        t.right((20 * a))
        t.penup()
        t.backward(branchLen)
        t.pendown()

# 绘制树下花瓣，参数分别是画板数、画笔

def petal(m, t):
    for i in range(m):
        a = (200 - 400 * (random.random()))
        b = (10 - 20 * (random.random()))
        t.penup()
        t.forward(b)
        t.left(90)
        t.forward(a)
        t.pendown()
        # 落花用不同深浅的粉色随机点缀
        t.pencolor(random.choice(['lightpink', 'pink', 'mistyrose', 'hotpink']))
        t.circle(random.uniform(1, 2))   # 花瓣大小也有变化，更自然
        t.penup()
        t.backward(a)
        t.right(90)
        t.backward(b)

def main():
    t = turtle.Pen()
    __Pen.hideturtle()
    t.hideturtle()
    t.speed(0)

    # 【提速】每画 2 步刷新一次，速度约提升 100%
    turtle.tracer(2, 0)

    # 天空色：淡青蓝，比麦色更清透
    turtle.bgcolor('aliceblue')

    t.left(90)
    t.penup()
    t.backward(150)
    t.pendown()
    t.pencolor('peru')
    tree(60, t)
    petal(150, t)          # 花瓣数量从 100 增加到 150，落英更缤纷

    turtle.update()        # 最后补一次完整刷新
    turtle.done()

main()