模拟竹笋生长:使用 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()