# -*- coding: utf-8 -*-""""""import pygameimport randomimport mathimport colorsysfrom dataclasses import dataclassfrom typing import List, Tuple, Optionalfrom enum import Enum# 常量定义SCREEN_WIDTH = 800SCREEN_HEIGHT = 600FPS = 60# 颜色常量BACKGROUND_COLOR = (5, 5, 15)TEXT_COLOR = (255, 255, 255)DEFAULT_HUE_RANGE = (0.12, 0.14) # 橙色到金色# 粒子参数TEXT_PARTICLE_SIZE_RANGE = (1.5, 2.5)SPARK_PARTICLE_LENGTH_RANGE = (10, 20)SPARK_PARTICLE_WIDTH_RANGE = (0.5, 1.5)TRAIL_LENGTH = 6TEXT_SPARK_LENGTH = 8# 烟花参数MIN_PARTICLES = 2MAX_PARTICLES = 3FIREWORK_SIZE_RANGE = (0.6, 2.4)PARTICLE_COUNT_SCALE = 300SPECIAL_FIREWORK_CHANCE = 0.1COLORFUL_CHANCE = 0.15# 生命周期TEXT_MOVE_LIFE = 280TEXT_FORM_LIFE = 180SPARK_LIFE = 220# 物理参数GRAVITY = 0.2AIR_RESISTANCE = 0.88TEXT_PARTICLE_SPEED_RANGE = (6, 9)SPARK_PARTICLE_SPEED_RANGE = (8, 20)# 文本设置FONT_NAME = 'simhei'FONT_SIZE = 160TEXT = '新年快乐'TEXT_POINT_DENSITY = 3class ParticleState(Enum): """粒子状态枚举""" MOVING = "moving" FORMING = "forming"@dataclassclass ParticleTrail: """粒子轨迹数据类""" positions: List[Tuple[float, float]] max_length: intclass ParticleBase: """粒子基类""" def __init__(self, x: float, y: float, hue: float): self.x = x self.y = y self.hue = hue self.life = 0 self.trail = ParticleTrail([], 0) def update(self) -> bool: """更新粒子状态,返回是否存活""" raise NotImplementedError def draw(self, screen: pygame.Surface) -> None: """绘制粒子""" raise NotImplementedErrorclass TextParticle(ParticleBase): """文字粒子类""" def __init__(self, start_pos: Tuple[float, float], target_pos: Tuple[float, float]): super().__init__(start_pos[0], start_pos[1], random.uniform(*DEFAULT_HUE_RANGE)) self.start_x, self.start_y = start_pos self.target_x, self.target_y = target_pos self.radius = random.uniform(*TEXT_PARTICLE_SIZE_RANGE) # 计算初始速度 dx = self.target_x - self.start_x dy = self.target_y - self.start_y distance = math.hypot(dx, dy) speed = random.uniform(*TEXT_PARTICLE_SPEED_RANGE) + distance / 60 self.vx = dx / distance * speed if distance > 0 else 0 self.vy = dy / distance * speed if distance > 0 else 0 # 初始化状态 self.state = ParticleState.MOVING self.life = TEXT_MOVE_LIFE self.trail = ParticleTrail([], TRAIL_LENGTH) def _move_to_target(self) -> None: """向目标位置移动""" self.x += self.vx self.y += self.vy # 检查是否到达目标 distance_to_target = math.hypot(self.target_x - self.x, self.target_y - self.y) if distance_to_target < 2 and self.state == ParticleState.MOVING: self.state = ParticleState.FORMING self.life = TEXT_FORM_LIFE def update(self) -> bool: """更新文字粒子状态""" if self.state == ParticleState.MOVING: self._move_to_target() # 更新轨迹 self.trail.positions.append((self.x, self.y)) if len(self.trail.positions) > self.trail.max_length: self.trail.positions.pop(0) # 减少生命周期 self.life -= 2 return self.life > 0 def draw(self, screen: pygame.Surface) -> None: """绘制文字粒子及其轨迹""" trail_length = len(self.trail.positions) for i, (x, y) in enumerate(self.trail.positions): alpha = int(255 * (i + 1) / trail_length) size = max(1, self.radius * (trail_length - i) / trail_length) color = hsv_to_rgb(self.hue, 0.15, 0.95) # 绘制轨迹点 pygame.draw.circle(screen, (*color, alpha), (int(x), int(y)), int(size))class SparkParticle(ParticleBase): """火花粒子类""" def __init__(self, x: float, y: float, angle: float, speed: float, hue: float): super().__init__(x, y, hue) self.length = random.uniform(*SPARK_PARTICLE_LENGTH_RANGE) self.width = random.uniform(*SPARK_PARTICLE_WIDTH_RANGE) self.angle = angle # 初始速度 self.vx = math.cos(angle) * speed self.vy = math.sin(angle) * speed # 物理参数 self.gravity = GRAVITY self.air_resist = AIR_RESISTANCE # 生命周期和轨迹 self.life = SPARK_LIFE self.trail = ParticleTrail([], TEXT_SPARK_LENGTH) def update(self) -> bool: """更新火花粒子状态""" # 应用物理效果 self.vx *= self.air_resist self.vy = self.vy * self.air_resist + self.gravity self.x += self.vx self.y += self.vy # 更新轨迹 self.trail.positions.append((self.x, self.y)) if len(self.trail.positions) > self.trail.max_length: self.trail.positions.pop(0) # 减少生命周期 self.life -= 4 # 检查是否超出屏幕 is_alive = self.life > 0 and self.y < SCREEN_HEIGHT + 50 return is_alive def draw(self, screen: pygame.Surface) -> None: """绘制火花粒子及其轨迹""" # 绘制轨迹线 for i in range(len(self.trail.positions) - 1): x1, y1 = self.trail.positions[i] x2, y2 = self.trail.positions[i + 1] progress = i / (len(self.trail.positions) - 1) alpha = int(255 * (1 - progress)) line_width = int(self.width * (1 - progress)) color = hsv_to_rgb(self.hue, 0.15 + progress * 0.1, 0.9 - progress * 0.2) pygame.draw.line(screen, (*color, alpha), (int(x1), int(y1)), (int(x2), int(y2)), line_width + 1) # 绘制粒子头部 pygame.draw.circle(screen, hsv_to_rgb(self.hue, 0.1, 0.98), (int(self.x), int(self.y)), int(self.width * 1.2))class Firework: """烟花类,包含多个粒子""" def __init__(self, x: float, y: float, size_scale: float = 1.0, text_points: Optional[List[Tuple[float, float]]] = None): self.particles: List[ParticleBase] = [] self.size_scale = size_scale self.is_colorful = random.random() < COLORFUL_CHANCE if text_points: self._create_text_particles(x, y, text_points) else: self._create_spark_particles(x, y) def _create_text_particles(self, x: float, y: float, text_points: List[Tuple[float, float]]) -> None: """创建文字粒子""" for point in text_points: self.particles.append(TextParticle((x, y), point)) def _create_spark_particles(self, x: float, y: float) -> None: """创建火花粒子""" particle_count = int(PARTICLE_COUNT_SCALE * self.size_scale) for _ in range(particle_count): angle = random.uniform(0, 2 * math.pi) speed = random.uniform(*SPARK_PARTICLE_SPEED_RANGE) * self.size_scale # 随机决定颜色 if self.is_colorful: hue = random.random() else: hue = (random.uniform(*DEFAULT_HUE_RANGE) if random.random() < SPECIAL_FIREWORK_CHANCE else random.random()) self.particles.append(SparkParticle(x, y, angle, speed, hue)) def update(self) -> bool: """更新所有粒子,返回烟花是否还有存活粒子""" self.particles = [p for p in self.particles if p.update()] return len(self.particles) > 0 def draw(self, screen: pygame.Surface) -> None: """绘制所有粒子""" for particle in self.particles: particle.draw(screen)class TextRenderer: """文字渲染器""" def __init__(self): self.font = pygame.font.SysFont(FONT_NAME, FONT_SIZE) def generate_text_points(self, density: int = TEXT_POINT_DENSITY) -> List[Tuple[float, float]]: """生成文字轮廓点集""" text_surface = self.font.render(TEXT, True, TEXT_COLOR) mask = pygame.mask.from_surface(text_surface) rect = text_surface.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)) points = [] for x in range(0, text_surface.get_width(), density): for y in range(0, text_surface.get_height(), density): if mask.get_at((x, y)): # 添加随机偏移,使文字效果更自然 points.append(( rect.x + x + random.uniform(-1, 1), rect.y + y + random.uniform(-1, 1) )) return pointsclass GameState(Enum): """游戏状态枚举""" TEXT_GENERATION = "text_generation" TEXT_DISPLAY = "text_display" NORMAL_FIREWORKS = "normal_fireworks"class FireworkDisplay: """烟花表演主控制器""" def __init__(self): pygame.init() self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("烟花秀") self.clock = pygame.time.Clock() self.fireworks: List[Firework] = [] self.state = GameState.TEXT_GENERATION self.text_display_start = 0 self.background = self._create_background() self.text_renderer = TextRenderer() def _create_background(self) -> pygame.Surface: """创建背景表面""" background = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT)) background.fill(BACKGROUND_COLOR) return background def _handle_events(self) -> bool: """处理事件,返回是否继续运行""" for event in pygame.event.get(): if event.type == pygame.QUIT: return False return True def _update_text_state(self, current_time: int) -> None: """更新文字烟花状态""" if self.state == GameState.TEXT_GENERATION: # 生成文字烟花 text_points = self.text_renderer.generate_text_points() self.fireworks.append(Firework( SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2, 1.4, text_points )) self.text_display_start = current_time self.state = GameState.TEXT_DISPLAY elif self.state == GameState.TEXT_DISPLAY: # 显示文字一段时间后切换到普通烟花 if current_time - self.text_display_start > 1000: self.state = GameState.NORMAL_FIREWORKS def _update_normal_state(self) -> None: """更新普通烟花状态""" if not self.fireworks: # 生成新的烟花 for _ in range(random.randint(MIN_PARTICLES, MAX_PARTICLES)): x = random.randint(100, SCREEN_WIDTH - 100) y = random.randint(100, SCREEN_HEIGHT // 2) size = random.uniform(*FIREWORK_SIZE_RANGE) self.fireworks.append(Firework(x, y, size)) def _update_fireworks(self) -> None: """更新所有烟花""" for fw in self.fireworks[:]: if not fw.update(): self.fireworks.remove(fw) def _draw_fireworks(self) -> None: """绘制所有烟花""" for fw in self.fireworks: fw.draw(self.screen) def run(self) -> None: """运行主循环""" running = True while running: # 处理事件 running = self._handle_events() # 清屏 self.screen.blit(self.background, (0, 0)) # 获取当前时间 current_time = pygame.time.get_ticks() # 状态管理 if self.state in [GameState.TEXT_GENERATION, GameState.TEXT_DISPLAY]: self._update_text_state(current_time) elif self.state == GameState.NORMAL_FIREWORKS: self._update_normal_state() # 更新和绘制烟花 self._update_fireworks() self._draw_fireworks() # 更新屏幕 pygame.display.flip() self.clock.tick(FPS) # 退出游戏 pygame.quit()def hsv_to_rgb(h: float, s: float, v: float) -> Tuple[int, int, int]: """HSV颜色空间转RGB颜色空间""" rgb = colorsys.hsv_to_rgb(h, s, v) return tuple(round(i * 255) for i in rgb)def main(): """主函数""" display = FireworkDisplay() display.run()if __name__ == "__main__": main()
"""圣诞树动画 - 修复star_pulse属性错误"""import turtleimport randomimport mathfrom typing import List, Tuple, Dict, Anyclass EnhancedChristmasTree: def __init__(self): # 初始化屏幕 self.screen = turtle.Screen() self.setup_screen() # 初始化画笔 self.pen = turtle.Turtle() self.setup_pen() # 颜色定义 self.setup_colors() # 存储动画元素 self.lights: List[Dict] = [] self.snowflakes: List[Dict] = [] self.ornaments: List[Dict] = [] # 动画控制 self.animation_speed = 0.05 self.time_counter = 0 self.star_pulse = 0 # 添加star_pulse属性初始化 def setup_screen(self): """设置屏幕参数""" self.screen.setup(width=800, height=700) self.screen.bgcolor("#0a0f1f") self.screen.title("🎄 动态圣诞树 🎄") self.screen.tracer(0) self.screen.colormode(255) def setup_pen(self): """设置画笔参数""" self.pen.speed(0) self.pen.hideturtle() self.pen.pensize(2) def setup_colors(self): """设置颜色方案""" self.colors = { "bg": "#0a0f1f", "trunk": "#5d4037", "star": "#ffeb3b", "snow": "#ffffff", } self.tree_gradient = [ "#0a5c36", "#1b7a4b", "#2e8b57", "#4caf50", "#81c784" ] self.ornament_colors = [ (200, 50, 50), (200, 100, 0), (200, 180, 50), (76, 175, 80), (33, 150, 200), (150, 39, 176), (200, 64, 129) ] self.light_colors = [ (200, 180, 50), (200, 150, 7), (200, 100, 34), (0, 150, 180), (200, 30, 99) ] def hex_to_rgb(self, hex_color: str) -> Tuple: """十六进制颜色转RGB""" hex_color = hex_color.lstrip('#') return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) def draw_ground(self): """绘制渐变地面""" self.pen.penup() self.pen.goto(-400, -250) for i in range(50): y = -250 - i color_factor = i / 50 r = int(26 + (60 * color_factor)) g = int(35 + (30 * color_factor)) b = int(33 + (20 * color_factor)) self.pen.pendown() self.pen.color(r, g, b) self.pen.pensize(2) self.pen.goto(400, y) self.pen.penup() self.pen.goto(-400, y) for _ in range(20): x = random.randint(-380, 380) y = random.randint(-280, -250) self.pen.goto(x, y) self.pen.dot(2, (100, 80, 60)) def draw_trunk(self): """绘制有纹理的树干""" self.pen.penup() self.pen.goto(-20, -250) self.pen.pendown() self.pen.color(self.colors["trunk"]) self.pen.begin_fill() for _ in range(2): self.pen.forward(40) self.pen.left(90) self.pen.forward(80) self.pen.left(90) self.pen.end_fill() trunk_colors = [(93, 64, 55), (121, 85, 72), (78, 52, 46)] for i in range(3): x_offset = -15 + i * 15 self.pen.penup() self.pen.goto(x_offset, -250) self.pen.pendown() self.pen.color(trunk_colors[i]) self.pen.pensize(3) self.pen.setheading(90) self.pen.forward(80) def draw_tree_layer_gradient(self, x: float, y: float, width: float, height: float, color_index: int): """绘制渐变树冠层""" self.pen.penup() self.pen.goto(x, y) for i in range(int(height)): current_y = y + i current_width = width * (1 - i/height) current_x = x + (width - current_width) / 2 color_factor = i / height if color_index < len(self.tree_gradient) - 1: r1, g1, b1 = self.hex_to_rgb(self.tree_gradient[color_index]) r2, g2, b2 = self.hex_to_rgb(self.tree_gradient[color_index + 1]) r = int(r1 + (r2 - r1) * color_factor) g = int(g1 + (g2 - g1) * color_factor) b = int(b1 + (b2 - b1) * color_factor) else: r, g, b = self.hex_to_rgb(self.tree_gradient[color_index]) self.pen.penup() self.pen.goto(current_x, current_y) self.pen.pendown() self.pen.color(r, g, b) self.pen.pensize(2) self.pen.goto(current_x + current_width, current_y) def draw_tree(self): """绘制整棵圣诞树""" layers = [ (-120, -190, 240, 90, 0), (-100, -130, 200, 80, 1), (-80, -70, 160, 70, 2), (-60, -10, 120, 60, 3), (-40, 50, 80, 50, 4) ] for x, y, width, height, color_idx in layers: self.draw_tree_layer_gradient(x, y, width, height, color_idx) def draw_ornament(self, x: float, y: float, size: float = 8) -> turtle.Turtle: """绘制单个装饰球""" ornament = turtle.Turtle() ornament.speed(0) ornament.hideturtle() ornament.penup() base_color = random.choice(self.ornament_colors) ornament.goto(x, y - size) ornament.color(base_color) ornament.begin_fill() ornament.circle(size) ornament.end_fill() highlight_size = size * 0.4 highlight_x = x - size * 0.3 highlight_y = y - size + highlight_size * 0.5 ornament.penup() ornament.goto(highlight_x, highlight_y) ornament.color(240, 240, 240) ornament.begin_fill() ornament.circle(highlight_size) ornament.end_fill() self.ornaments.append({ "turtle": ornament, "x": x, "y": y, "size": size, "base_color": base_color, "pulse_phase": random.uniform(0, math.pi * 2), "pulse_speed": random.uniform(0.02, 0.05), "rotation": 0, "rotation_speed": random.uniform(-0.5, 0.5) }) return ornament def draw_ornaments(self, count: int = 20): """绘制多个装饰球""" positions = [ {"x_range": (-110, -60), "y_range": (-180, -120)}, {"x_range": (-60, -20), "y_range": (-120, -60)}, {"x_range": (-20, 20), "y_range": (-60, 0)}, {"x_range": (20, 60), "y_range": (0, 60)}, {"x_range": (60, 110), "y_range": (60, 100)} ] for _ in range(count): area = random.choice(positions) x = random.uniform(area["x_range"][0], area["x_range"][1]) y = random.uniform(area["y_range"][0], area["y_range"][1]) size = random.uniform(6, 10) self.draw_ornament(x, y, size) def draw_fairy_light(self, x: float, y: float, size: float = 4) -> turtle.Turtle: """绘制单个彩灯""" light = turtle.Turtle() light.speed(0) light.hideturtle() light.penup() base_color = random.choice(self.light_colors) light.goto(x, y - size) light.color(base_color) light.begin_fill() light.circle(size) light.end_fill() self.lights.append({ "turtle": light, "x": x, "y": y, "size": size, "base_color": base_color, "current_color": base_color, "target_color": random.choice(self.light_colors), "color_progress": 0, "color_speed": random.uniform(0.01, 0.03), "pulse_phase": random.uniform(0, math.pi * 2), "pulse_speed": random.uniform(0.03, 0.07) }) return light def draw_fairy_lights(self, count: int = 30): """绘制多个彩灯""" positions = [ {"x_range": (-120, -80), "y_range": (-190, -150)}, {"x_range": (-80, -50), "y_range": (-150, -100)}, {"x_range": (-50, -20), "y_range": (-100, -40)}, {"x_range": (-20, 10), "y_range": (-40, 20)}, {"x_range": (10, 40), "y_range": (20, 70)}, {"x_range": (40, 120), "y_range": (70, 100)} ] for _ in range(count): area = random.choice(positions) x = random.uniform(area["x_range"][0], area["x_range"][1]) y = random.uniform(area["y_range"][0], area["y_range"][1]) size = random.uniform(3, 5) self.draw_fairy_light(x, y, size) def draw_star(self, x: float = 0, y: float = 120, size: float = 25): """绘制动态星星""" self.star_turtle = turtle.Turtle() self.star_turtle.speed(0) self.star_turtle.hideturtle() self.star_turtle.penup() self.star_turtle.goto(x, y) self.star_turtle.setheading(72) self.star_turtle.pendown() # 绘制初始星星 self.star_turtle.color(self.colors["star"]) self.star_turtle.begin_fill() for _ in range(5): self.star_turtle.forward(size) self.star_turtle.right(144) self.star_turtle.forward(size) self.star_turtle.left(72) self.star_turtle.end_fill() def create_snowflake(self) -> Dict: """创建单个雪花""" flake = turtle.Turtle() flake.speed(0) flake.hideturtle() flake.penup() x = random.uniform(-380, 380) y = random.uniform(320, 400) flake.goto(x, y) flake.color(self.colors["snow"]) flake.shape("circle") flake.shapesize(random.uniform(0.1, 0.3)) return { "turtle": flake, "x": x, "y": y, "size": random.uniform(3, 8), "fall_speed": random.uniform(0.5, 2.0), "drift_speed": random.uniform(-0.5, 0.5), "drift_amplitude": random.uniform(0.5, 2.0), "rotation": random.uniform(0, math.pi * 2), "rotation_speed": random.uniform(-0.05, 0.05), "pulse_phase": random.uniform(0, math.pi * 2), "pulse_speed": random.uniform(0.02, 0.05) } def draw_snow(self, count: int = 60): """创建雪花""" for _ in range(count): snowflake = self.create_snowflake() self.snowflakes.append(snowflake) def draw_message(self): """绘制祝福消息""" message = turtle.Turtle() message.speed(0) message.hideturtle() message.penup() message.goto(0, -300) message.color("#ffffff") message.write("Merry Christmas!", align="center", font=("Arial", 24, "bold")) message.penup() message.goto(0, -330) message.color("#ffd700") message.write("愿您和您的家人圣诞快乐!", align="center", font=("Arial", 16, "italic")) def update_lights(self): """更新彩灯颜色和大小""" for light in self.lights: if light["color_progress"] >= 1: light["color_progress"] = 0 light["current_color"] = light["target_color"] light["target_color"] = random.choice(self.light_colors) else: light["color_progress"] += light["color_speed"] r = int(light["current_color"][0] + (light["target_color"][0] - light["current_color"][0]) * light["color_progress"]) g = int(light["current_color"][1] + (light["target_color"][1] - light["current_color"][1]) * light["color_progress"]) b = int(light["current_color"][2] + (light["target_color"][2] - light["current_color"][2]) * light["color_progress"]) r = max(0, min(255, r)) g = max(0, min(255, g)) b = max(0, min(255, b)) light["turtle"].clear() light["turtle"].penup() light["turtle"].goto(light["x"], light["y"] - light["size"]) light["turtle"].pendown() light["turtle"].color(r, g, b) light["turtle"].begin_fill() light["turtle"].circle(light["size"]) light["turtle"].end_fill() pulse = math.sin(light["pulse_phase"]) * 0.2 + 0.9 light["pulse_phase"] += light["pulse_speed"] current_size = light["size"] * pulse light["turtle"].shapesize(current_size/20, current_size/20) def update_ornaments(self): """更新装饰球""" for ornament in self.ornaments: pulse = math.sin(ornament["pulse_phase"]) * 0.1 + 0.95 ornament["pulse_phase"] += ornament["pulse_speed"] ornament["rotation"] += ornament["rotation_speed"] r, g, b = ornament["base_color"] brightness = pulse * 0.1 + 0.9 r = int(r * brightness) g = int(g * brightness) b = int(b * brightness) r = max(0, min(255, r)) g = max(0, min(255, g)) b = max(0, min(255, b)) ornament["turtle"].clear() ornament["turtle"].penup() ornament["turtle"].goto(ornament["x"], ornament["y"] - ornament["size"]) ornament["turtle"].setheading(ornament["rotation"]) ornament["turtle"].color(r, g, b) ornament["turtle"].begin_fill() ornament["turtle"].circle(ornament["size"]) ornament["turtle"].end_fill() highlight_size = ornament["size"] * 0.4 highlight_x = ornament["x"] - ornament["size"] * 0.3 highlight_y = ornament["y"] - ornament["size"] + highlight_size * 0.5 ornament["turtle"].penup() ornament["turtle"].goto(highlight_x, highlight_y) ornament["turtle"].color(240, 240, 240) ornament["turtle"].begin_fill() ornament["turtle"].circle(highlight_size) ornament["turtle"].end_fill() def update_snow(self): """更新雪花位置""" for snowflake in self.snowflakes: snowflake["y"] -= snowflake["fall_speed"] snowflake["x"] += math.sin(self.time_counter + snowflake["pulse_phase"]) * snowflake["drift_amplitude"] snowflake["rotation"] += snowflake["rotation_speed"] pulse = math.sin(self.time_counter + snowflake["pulse_phase"]) * 0.2 + 0.9 current_size = snowflake["size"] * pulse snowflake["turtle"].goto(snowflake["x"], snowflake["y"]) snowflake["turtle"].setheading(snowflake["rotation"] * 180 / math.pi) snowflake["turtle"].shapesize(current_size/20, current_size/20) if snowflake["y"] < -320: snowflake["y"] = random.uniform(320, 400) snowflake["x"] = random.uniform(-380, 380) snowflake["fall_speed"] = random.uniform(0.5, 2.0) def update_star(self): """更新星星效果""" # 更新脉动相位 self.star_pulse += 0.1 # 星星脉动效果 pulse_size = 25 + math.sin(self.star_pulse) * 3 # 脉动颜色 r = 255 g = 235 + int(math.sin(self.star_pulse) * 20) b = 59 g = max(0, min(255, g)) # 清除并重新绘制星星 self.star_turtle.clear() self.star_turtle.penup() self.star_turtle.goto(0, 120) self.star_turtle.setheading(72) self.star_turtle.pendown() self.star_turtle.color(r, g, b) self.star_turtle.begin_fill() for _ in range(5): self.star_turtle.forward(pulse_size) self.star_turtle.right(144) self.star_turtle.forward(pulse_size) self.star_turtle.left(72) self.star_turtle.end_fill() def animate(self): """主动画循环""" self.time_counter += 0.05 self.update_lights() self.update_ornaments() self.update_snow() self.update_star() if random.random() < 0.1 and len(self.snowflakes) < 100: self.snowflakes.append(self.create_snowflake()) self.snowflakes = [flake for flake in self.snowflakes if flake["y"] > -320] self.screen.update() self.screen.ontimer(self.animate, 20) def draw(self): """绘制所有元素""" print("🎨 绘制圣诞树...") self.draw_ground() self.draw_trunk() self.draw_tree() self.draw_ornaments(20) self.draw_fairy_lights(30) self.draw_star() self.draw_snow(60) self.draw_message() self.screen.update() print("✨ 圣诞树绘制完成!") self.animate() def run(self): """运行主程序""" print("=" * 50) print("🎄 动态圣诞树动画 🎄") print("=" * 50) print("正在初始化...") self.draw() self.screen.mainloop()def main(): """主函数""" tree = EnhancedChristmasTree() tree.run()if __name__ == "__main__": main()