模拟竹笋生长

模拟竹笋生长:使用 turtle 绘制出竹笋从地下破土而出,然后快速生长的过程,通过改变图形的大小和形状表现竹笋的生长。

import turtle
import random
import time
# 初始化绘图环境
screen = turtle.Screen()
screen.setup(800, 800)
screen.bgcolor("#2d3436")
screen.tracer(6)
pen = turtle.Turtle()
pen.hideturtle()
pen.speed(0)
screen.colormode(255)

# 全局参数配置
GROUND_Y = -300
MAX_HEIGHT = 380
SEGMENTS = 22
SEGMENT_HEIGHT = 18
PHASE_SETTINGS = {
    "破土期": {"speed": 3, "delay": 0.25, "width_gain": 0.3},
    "快速生长期": {"speed": 12, "delay": 0.08, "width_gain": 0.6},
    "成熟期": {"speed": 5, "delay": 0.15, "width_gain": 0.2}
}


def draw_soil():
    """绘制土壤效果"""
    pen.color("#5d4037")
    for _ in range(30):
        pen.penup()
        pen.goto(random.randint(-60, 60), GROUND_Y + random.randint(-20, 30))
        pen.pendown()
        pen.dot(random.randint(8, 15), "#4e342e")
    screen.update()


def draw_segment(y, width, rgb):
    """绘制单个竹节模块"""
    pen.penup()
    pen.goto(-width // 2, y)
    pen.pendown()
    # 颜色渐变效果
    for alpha in range(3):
        blend = 0.5 + alpha * 0.2
        pen.color((
            min(255, int(rgb[0] * blend)),
            min(255, int(rgb[1] * blend)),
            min(255, int(rgb[2] * blend))
        ))
        pen.begin_fill()
        for _ in range(2):
            pen.forward(width)
            pen.left(90)
            pen.forward(SEGMENT_HEIGHT)
            pen.left(90)
        pen.end_fill()
        time.sleep(0.03)


def draw_root(y, base_width):
    """绘制根须"""
    num_roots = random.randint(3, 6)
    base_width = int(base_width)
    for _ in range(num_roots):
        pen.penup()
        angle = random.randint(135, 225)
        start_x = random.randint(-base_width // 2, base_width // 2)
        pen.goto(start_x, y)
        pen.pendown()
        pen.setheading(angle)
        root_length = random.randint(20, 50)
        root_width = random.randint(2, 5)
        for i in range(root_length):
            new_width = root_width - i * 0.1
            if new_width > 0:
                pen.pensize(new_width)
            else:
                pen.pensize(0.1)
            pen.forward(1)


def bamboo_growth():
    """主生长动画"""
    current_height = GROUND_Y
    base_width = 10
    color_phase = 0
    for phase in ["破土期", "快速生长期", "成熟期"]:
        phase_config = PHASE_SETTINGS[phase]
        target_height = (GROUND_Y + 80 if phase == "破土期" else
                         (MAX_HEIGHT - 80 if phase == "快速生长期" else MAX_HEIGHT))
        while current_height < target_height:
            pen.clear()
            draw_soil()
            # 颜色渐变算法
            color_r = 80 + int(130 * (color_phase / SEGMENTS))
            color_g = 40 + int(200 * (color_phase / SEGMENTS))
            color_b = 20 - int(10 * (color_phase / SEGMENTS))
            # 绘制可见节段
            visible_segments = min(SEGMENTS, int((current_height - GROUND_Y) / SEGMENT_HEIGHT) + 1)
            for i in range(visible_segments):
                y_pos = current_height - i * SEGMENT_HEIGHT
                # 修改竹节宽度计算逻辑,实现下粗上细
                segment_width = base_width * (1 + 0.1 * i)
                if segment_width > 35:
                    segment_width = 35
                if y_pos > GROUND_Y:
                    draw_segment(y_pos, segment_width, (color_r, color_g, color_b))
            # 绘制根须
            if current_height > GROUND_Y:
                draw_root(GROUND_Y, base_width)
            # 动态参数更新
            current_height += phase_config["speed"]
            base_width = min(base_width + phase_config["width_gain"], 35)
            color_phase += 0.35
            time.sleep(phase_config["delay"])
            screen.update()


bamboo_growth()
screen.mainloop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值