使用Python绘制节日祝福——以端午节和儿童节为例

发布于:2025-06-03 ⋅ 阅读:(25) ⋅ 点赞:(0)

端午节

 端午节总算是回家了,感觉时间过得真快,马上就毕业了,用Python弄了一个端午节元素的界面,虽然有点不像,祝大家端午安康。端午节粽子(python)_python画粽子-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/131338766?spm=1001.2014.3001.5502

import tkinter as tk
from tkinter import messagebox, Canvas
import random
import math

# 端午节祝福语库
blessings = [
    "粽叶飘香五月五,浓情端午送祝福\n愿你生活如粽甜,幸福美满永安康!",
    "艾叶香,麦浪黄,人间美景是端阳\n愿您事业龙舟竞渡,生活粽享幸福!",
    "五色丝线系吉祥,一枚香囊保安康\n祝您端午时节诸事顺,美好生活万年长!",
    "龙舟破浪勇向前,糯米粘粘情相连\n愿您前程似锦赛龙舟,好运连连粽相伴!",
    "青青粽叶盈,赤赤枣香浓\n愿您端午安康,幸福永长!",
    "彩线轻缠红玉臂,小符斜挂绿云鬟\n祝您端午吉祥,万事如意!"
]
# 全局常量
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 700
paddle_angle = 0


class DragonBoat:
    def __init__(self, canvas):
        self.canvas = canvas
        self.SCREEN_WIDTH = SCREEN_WIDTH
        self.SCREEN_HEIGHT = SCREEN_HEIGHT
        self.x = -200
        self.y = SCREEN_HEIGHT * 0.7
        self.speed = max(1.0, SCREEN_WIDTH / 400)
        self.parts = []

        # 新增划手动画所需变量
        self.paddles = []  # 存储桨线段对象
        self.paddle_blades = []  # ✅ 添加这一行:存储桨叶对象
        self.paddle_angles = []  # 每个桨的角度
        self.paddle_angle_speeds = []  # 每个桨的摆动速度

        # 新增龙须变量
        self.beards = []  # 存储龙须线段对象
        self.beard_angles = []  # 每根龙须的角度偏移
        self.beard_oscillation_speed = 0.03  # 降低摆动速度
        self.beard_oscillation_amplitude = 2  # 减小摆动幅度

        self.create_boat()

    def create_boat(self):
        # 船体
        boat_size = max(30.0, self.SCREEN_WIDTH / 20.0)  # 根据屏幕大小调整船体尺寸
        hull = self.canvas.create_polygon(
            self.x, self.y,
            self.x - boat_size * 3, self.y + boat_size,
            self.x - boat_size * 2, self.y + boat_size * 2,
            self.x + boat_size * 2, self.y + boat_size * 2,
            self.x + boat_size * 3, self.y + boat_size,
            self.x, self.y,
            fill="#CD5C5C", outline="black", width=2, smooth=True
        )
        self.parts.append(hull)

        # 龙头
        head = self.canvas.create_polygon(
            self.x + boat_size * 3, self.y + boat_size,
            self.x + boat_size * 4, self.y + boat_size * 0.5,
            self.x + boat_size * 4.5, self.y + boat_size * 0.75,
            self.x + boat_size * 4.25, self.y + boat_size * 1.25,
            self.x + boat_size * 4, self.y + boat_size * 1.75,
            self.x + boat_size * 3.5, self.y + boat_size * 1.75,
            self.x + boat_size * 3, self.y + boat_size,
            fill="#8B0000", outline="black", width=2, smooth=True
        )
        self.parts.append(head)

        # 龙眼
        eye_size = max(2.0, boat_size / 10)
        eye = self.canvas.create_oval(
            self.x + boat_size * 4.1, self.y + boat_size * 0.875,
            self.x + boat_size * 4.25, self.y + boat_size,
            fill="white", outline="black"
        )
        self.parts.append(eye)
        pupil = self.canvas.create_oval(
            self.x + boat_size * 4.13, self.y + boat_size * 0.9,
            self.x + boat_size * 4.17, self.y + boat_size * 0.95,
            fill="black"
        )
        self.parts.append(pupil)

        # 龙角
        horn1 = self.canvas.create_polygon(
            self.x + boat_size * 4.25, self.y + boat_size * 0.75,
            self.x + boat_size * 4.375, self.y + boat_size * 0.375,
            self.x + boat_size * 4.5, self.y + boat_size * 0.5,
            self.x + boat_size * 4.25, self.y + boat_size * 0.75,
            fill="#8B4513", outline="black"
        )
        horn2 = self.canvas.create_polygon(
            self.x + boat_size * 4, self.y + boat_size * 0.5,
            self.x + boat_size * 4.125, self.y + boat_size * 0.25,
            self.x + boat_size * 4.25, self.y + boat_size * 0.375,
            self.x + boat_size * 4, self.y + boat_size * 0.5,
            fill="#8B4513", outline="black"
        )
        self.parts.extend([horn1, horn2])

        # 龙须
        beard1 = self.canvas.create_line(
            self.x + boat_size * 3.9, self.y + boat_size * 1.1,
            self.x + boat_size * 3.95, self.y + boat_size * 1.05,  # 缩短距离
            self.x + boat_size * 4.0, self.y + boat_size * 0.95,
            fill="gold", width=2, smooth=False
        )

        beard2 = self.canvas.create_line(
            self.x + boat_size * 3.9, self.y + boat_size * 1.3,
            self.x + boat_size * 3.95, self.y + boat_size * 1.35,
            self.x + boat_size * 4.0, self.y + boat_size * 1.4,
            fill="gold", width=2, smooth=False
        )

        self.parts.extend([beard1, beard2])
        self.beards.extend([beard1, beard2])

        # 初始化龙须摆动角度
        for _ in range(len(self.beards)):
            self.beard_angles.append(random.uniform(0, math.pi * 2))

        # 划桨手
        num_rowers = max(3, int(SCREEN_HEIGHT / 200))  # 根据屏幕宽度调整划手数量
        for i in range(num_rowers):
            rower_x = self.x - boat_size * 2 + i * (boat_size * 1.5)

            # 身体位置 - 在船体内部
            body_y = self.y + boat_size * 0.8  # 降低身体位置

            # 身体
            body = self.canvas.create_oval(
                rower_x, body_y,
                rower_x + boat_size * 0.375, body_y + boat_size * 0.5,
                fill="#FFD700"
            )

            # 头部
            head = self.canvas.create_oval(
                rower_x + boat_size * 0.075, body_y - boat_size * 0.4,
                rower_x + boat_size * 0.3, body_y,
                fill="#FFDEAD"
            )

            # 桨 - 修复位置问题
            # 桨柄位置在划手身体中间
            paddle_x = rower_x + boat_size * 0.1875
            paddle_y = body_y + boat_size * 0.25

            # 桨长度
            paddle_length = boat_size * random.uniform(1.5, 2.5)
            angle_deg = 30 + math.sin(paddle_angle) * 10  # 动态角度
            # 桨的角度 - 稍微向下倾斜
            paddle_end_x = paddle_x + paddle_length * math.cos(math.radians(angle_deg))
            paddle_end_y = paddle_y + paddle_length * math.sin(math.radians(angle_deg))

            # 绘制船桨
            paddle = self.canvas.create_line(
                paddle_x, paddle_y,
                paddle_end_x, paddle_end_y,
                fill="#8B4513", width=3
            )

            # 绘制桨叶
            paddle_blade = self.canvas.create_polygon(
                paddle_end_x, paddle_end_y,
                paddle_end_x + boat_size * 0.2, paddle_end_y + boat_size * 0.1,
                paddle_end_x + boat_size * 0.2, paddle_end_y - boat_size * 0.1,
                paddle_end_x, paddle_end_y,
                fill="#8B4513", outline="black"
            )

            self.parts.extend([body, head, paddle, paddle_blade])
            # 在创建桨后保存引用
            self.paddles.append(paddle)  # paddle 是 line 对象
            self.paddle_blades.append(paddle_blade)  # 这是关键!
            self.paddle_angles.append(random.uniform(0, math.pi * 2))  # 初始角度
            self.paddle_angle_speeds.append(random.uniform(0.05, 0.1))  # 摆动速度

    def move(self):
        for item in self.parts:
            self.canvas.move(item, self.speed, 0)
        self.x += self.speed

        if self.x > self.SCREEN_WIDTH + 200:
            self.reset_position()
            return

        # 更新每个桨的角度
        for i in range(len(self.paddles)):
            try:
                self.paddle_angles[i] += self.paddle_angle_speeds[i]

                # 获取桨起点
                coords = self.canvas.coords(self.paddles[i])
                if not coords:
                    continue

                paddle_x, paddle_y = coords[0], coords[1]

                # 计算新终点
                angle_deg = 30 + math.sin(self.paddle_angles[i]) * 15
                paddle_length = 60  # 固定长度或根据 boat_size 调整

                paddle_end_x = paddle_x + paddle_length * math.cos(math.radians(angle_deg))
                paddle_end_y = paddle_y + paddle_length * math.sin(math.radians(angle_deg))

                # 更新桨线段
                self.canvas.coords(
                    self.paddles[i],
                    paddle_x, paddle_y,
                    paddle_end_x, paddle_end_y
                )

                # 更新桨叶(如果存在)
                if i < len(self.paddle_blades) and self.paddle_blades[i]:
                    self.canvas.coords(
                        self.paddle_blades[i],
                        paddle_end_x, paddle_end_y,
                        paddle_end_x + 10, paddle_end_y + 5,
                        paddle_end_x + 10, paddle_end_y - 5,
                        paddle_end_x, paddle_end_y
                    )
            except IndexError:
                continue  # 忽略越界索引
        # ✅ 更新龙须的摆动动画
        global paddle_angle

        for i in range(len(self.beards)):
            coords = self.canvas.coords(self.beards[i])
            if not coords or len(coords) < 6:  # 确保有3个点(6个坐标)
                continue

            x1, y1, mid_x, mid_y, x2, y2 = coords

            # ✅ 使用全局 paddle_angle 控制龙须摆动
            # 计算端点摆动
            end_offset = math.sin(paddle_angle + i * 0.5) * self.beard_oscillation_amplitude
            new_x2 = x2 + end_offset * 0.5
            new_y2 = y2 + end_offset * 0.5

            # 对中间点增加小幅摆动
            mid_offset = math.sin(paddle_angle + i * 0.5) * self.beard_oscillation_amplitude * 0.3
            new_mid_x = mid_x + mid_offset * 0.2
            new_mid_y = mid_y + mid_offset * 0.2

            # 更新三个点坐标(形成折线)
            self.canvas.coords(self.beards[i],
                               x1, y1,
                               new_mid_x, new_mid_y,  # 中间点坐标
                               new_x2, new_y2)

    def reset_position(self):
        for item in self.parts:
            self.canvas.delete(item)
        self.parts = []
        self.x = -200
        self.y = self.SCREEN_HEIGHT * 0.7
        self.speed = max(1.0, self.SCREEN_WIDTH / 400)
        self.create_boat()


class FloatingZongzi:
    def __init__(self, canvas):
        self.canvas = canvas
        self.SCREEN_WIDTH = SCREEN_WIDTH
        self.SCREEN_HEIGHT = SCREEN_HEIGHT

        # 确保使用整数参数
        min_y = int(SCREEN_HEIGHT * 0.7)
        max_y = int(SCREEN_HEIGHT - 50)
        self.x = random.randint(50, SCREEN_WIDTH - 50)
        self.y = random.randint(min_y, max_y) if min_y < max_y else min_y

        self.size = random.randint(
            max(10, int(SCREEN_WIDTH / 80)),
            max(20, int(SCREEN_WIDTH / 40))
        )
        self.speed = random.uniform(0.3, 1.0)
        self.direction = random.choice([-1, 1])
        self.zongzi = self.create_zongzi()

    def create_zongzi(self):
        # 粽体
        body = self.canvas.create_polygon(
            self.x, self.y,
            self.x - self.size / 2, self.y + self.size,
            self.x + self.size / 2, self.y + self.size,
            self.x, self.y,
            fill="#3CB371", outline="black", width=1, smooth=True
        )

        # 粽叶纹理
        for i in range(3):
            y_offset = self.y + (i + 1) * self.size / 4
            line = self.canvas.create_line(
                self.x - self.size / 2 + 5, y_offset,
                self.x + self.size / 2 - 5, y_offset,
                fill="#2E8B57", width=1
            )

        # 绑绳
        rope_y = self.y + self.size * 0.7
        rope = self.canvas.create_line(
            self.x - self.size / 2, rope_y,
            self.x + self.size / 2, rope_y,
            fill="#8B4513", width=2
        )

        return [body, rope]

    def move(self):
        self.y -= self.speed
        self.x += self.speed * self.direction * 0.3

        for item in self.zongzi:
            self.canvas.move(item, self.speed * self.direction * 0.3, -self.speed)

        # 如果飘出屏幕,重置位置
        if self.y < -50:
            self.reset_position()

    def reset_position(self):
        for item in self.zongzi:
            self.canvas.delete(item)
        self.x = random.randint(50, self.SCREEN_WIDTH - 50)
        self.y = self.SCREEN_HEIGHT + 50
        self.zongzi = self.create_zongzi()


def show_blessing():
    """显示随机祝福"""
    blessing = random.choice(blessings)
    messagebox.showinfo("端午安康", blessing)


def create_background(canvas):
    """创建自适应背景"""
    # 清除现有背景
    canvas.delete("background")

    # 渐变天空
    for i in range(int(SCREEN_HEIGHT * 0.7)):
        y = i
        blue_value = max(100.0, 235 - i * 0.7)
        color = f"#87CE{int(blue_value):02X}"
        canvas.create_line(0, y, SCREEN_WIDTH, y, fill=color, width=1, tags="background")

    # 水面
    canvas.create_rectangle(
        0, SCREEN_HEIGHT * 0.7,
        SCREEN_WIDTH, SCREEN_HEIGHT,
        fill="#1E90FF", outline="", tags="background"
    )

    # 远山
    num_mountains = max(3, int(SCREEN_WIDTH / 200))
    for i in range(num_mountains):
        x_start = i * (SCREEN_WIDTH / num_mountains) - 100
        height = random.randint(int(SCREEN_HEIGHT * 0.1), int(SCREEN_HEIGHT * 0.2))
        points = [x_start, SCREEN_HEIGHT * 0.7]
        segments = 5
        for j in range(segments):
            points.extend([
                x_start + j * (SCREEN_WIDTH / num_mountains / segments),
                SCREEN_HEIGHT * 0.7 - random.randint(20, height)
            ])
        points.extend([x_start + SCREEN_WIDTH / num_mountains, SCREEN_HEIGHT * 0.7])
        canvas.create_polygon(points, fill="#228B22", outline="#006400", smooth=True, tags="background")

    # 水波纹
    wave_height = min(10.0, SCREEN_HEIGHT * 0.02)
    for i in range(int(SCREEN_HEIGHT * 0.3 / 10)):
        y = SCREEN_HEIGHT * 0.7 + i * 10
        for j in range(int(SCREEN_WIDTH / 40)):
            x_start = j * 40
            canvas.create_arc(
                x_start, y,
                x_start + 40, y + wave_height * 2,
                start=180, extent=-180,
                outline="#87CEEB", width=1, tags="background"
            )


def create_title(canvas):
    """创建自适应标题"""
    canvas.delete("title")
    canvas.create_text(
        SCREEN_WIDTH / 2, SCREEN_HEIGHT * 0.15,
        text="端午节安康",
        font=("楷体", 36, "bold"),
        fill="#B22222",
        activefill="#FF4500",
        tags="title"
    )

    # 装饰花纹
    for i in range(8):
        angle = i * math.pi / 4
        radius = min(150.0, SCREEN_WIDTH / 8)
        x = SCREEN_WIDTH / 2 + radius * math.cos(angle)
        y = SCREEN_HEIGHT * 0.15 + radius * math.sin(angle)
        canvas.create_line(SCREEN_WIDTH / 2, SCREEN_HEIGHT * 0.15, x, y, fill="gold", width=2, dash=(4, 4),
                           tags="title")

        # 装饰粽子
        size = max(10.0, min(20.0, SCREEN_WIDTH / 60))
        zongzi = canvas.create_polygon(
            x, y,
            x - size / 2, y + size,
            x + size / 2, y + size,
            x, y,
            fill="#3CB371", outline="black", width=1, tags="title"
        )
        # 装饰艾草
        if i % 2 == 0:
            canvas.create_line(x, y, x, y - size * 2, fill="#228B22", width=3, tags="title")
            canvas.create_line(x, y - size * 2, x - size, y - size * 3, fill="#228B22", width=2, tags="title")
            canvas.create_line(x, y - size * 2, x + size, y - size * 3, fill="#228B22", width=2, tags="title")


def create_button(canvas):
    """创建自适应按钮"""
    canvas.delete("button")
    button_width = 100
    button_height = 50
    button_x = SCREEN_WIDTH / 2 - button_width / 2
    button_y = SCREEN_HEIGHT * 0.85

    button_bg = canvas.create_rectangle(
        button_x, button_y,
        button_x + button_width, button_y + button_height,
        fill="#FFD700", outline="#8B0000", width=2, tags="button"
    )
    button_text = canvas.create_text(
        SCREEN_WIDTH / 2, button_y + button_height / 2,
        text="端午祝福",
        font=("微软雅黑", 18, "bold"),
        fill="#8B0000",
        tags="button"
    )

    # 绑定事件
    canvas.tag_bind(button_bg, "<Button-1>", lambda e: show_blessing())
    canvas.tag_bind(button_text, "<Button-1>", lambda e: show_blessing())

    # 添加悬停效果
    def on_enter(e):
        canvas.itemconfig(button_bg, fill="#FFA500")

    def on_leave(e):
        canvas.itemconfig(button_bg, fill="#FFD700")

    canvas.tag_bind(button_bg, "<Enter>", on_enter)
    canvas.tag_bind(button_bg, "<Leave>", on_leave)
    canvas.tag_bind(button_text, "<Enter>", on_enter)
    canvas.tag_bind(button_text, "<Leave>", on_leave)


def center_window(root):
    """将窗口置于屏幕中央"""
    root.update_idletasks()
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()

    x = (screen_width - SCREEN_WIDTH) // 2
    y = (screen_height - SCREEN_HEIGHT) // 4

    root.geometry(f"{SCREEN_WIDTH}x{SCREEN_HEIGHT}+{x}+{y}")


def animate():
    """动画循环"""
    global paddle_angle
    dragon_boat.move()
    for zongzi in floating_zongzis:
        zongzi.move()

    paddle_angle += 0.1  # 控制摆动速度
    root.after(30, animate)


# 创建主窗口
root = tk.Tk()
root.title("端午安康")
root.configure(bg="#F0F8FF")
root.resizable(False, False)

# 创建画布
canvas = Canvas(root, width=SCREEN_WIDTH, height=SCREEN_HEIGHT, bg="white", highlightthickness=0)
canvas.pack()

# 初始化元素
create_background(canvas)
create_title(canvas)
create_button(canvas)

# 初始化动画元素
dragon_boat = DragonBoat(canvas)
floating_zongzis = [FloatingZongzi(canvas) for _ in range(10)]

# 窗口居中
center_window(root)

# 开始动画
animate()

root.mainloop()

 儿童节

想绘制出一个好的节日祝福,需要考虑到这个节日有哪些特色的元素。

import pygame
import sys
import random
import math
from pygame import gfxdraw
from datetime import datetime

# 初始化pygame
pygame.init()

# 设置窗口
WIDTH, HEIGHT = 1000, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("儿童节快乐!")

# 颜色定义
BACKGROUND = (173, 216, 230)  # 淡蓝色背景
RED = (255, 50, 50)
GREEN = (50, 200, 50)
BLUE = (50, 50, 255)
YELLOW = (255, 255, 0)
PURPLE = (200, 50, 200)
ORANGE = (255, 165, 0)
PINK = (255, 105, 180)
CYAN = (0, 255, 255)
COLORS = [RED, GREEN, BLUE, YELLOW, PURPLE, ORANGE, PINK, CYAN]

# 字体
title_font = pygame.font.SysFont("simhei", 60, bold=True)
subtitle_font = pygame.font.SysFont("simhei", 36)
message_font = pygame.font.SysFont("simhei", 28)


# 气球类
class Balloon:
    def __init__(self):
        self.radius = random.randint(20, 50)
        self.x = random.randint(self.radius, WIDTH - self.radius)
        self.y = HEIGHT + self.radius
        self.color = random.choice(COLORS)
        self.speed = random.uniform(0.5, 2.0)
        self.swing = random.uniform(0.01, 0.05)
        self.angle = random.uniform(0, 2 * math.pi)
        self.string_length = random.randint(80, 150)

    def update(self):
        self.y -= self.speed
        self.angle += self.swing
        self.x += math.sin(self.angle) * 0.5

    def draw(self, surface):
        # 绘制气球
        pygame.draw.circle(surface, self.color, (int(self.x), int(self.y)), self.radius)
        pygame.draw.circle(surface, (255, 255, 255), (int(self.x - self.radius // 3), int(self.y - self.radius // 3)),
                           self.radius // 4)

        # 绘制绳子
        points = []
        for i in range(self.string_length):
            px = self.x + math.sin(self.angle + i * 0.1) * 2
            py = self.y + self.radius + i
            points.append((px, py))
        if len(points) > 1:
            pygame.draw.lines(surface, (100, 100, 100), False, points, 1)

    def is_off_screen(self):
        return self.y < -self.radius


# 粒子效果类
class Particle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.size = random.randint(2, 6)
        self.color = random.choice(COLORS)
        self.speed_x = random.uniform(-3, 3)
        self.speed_y = random.uniform(-5, -2)
        self.gravity = 0.1
        self.life = 100

    def update(self):
        self.x += self.speed_x
        self.y += self.speed_y
        self.speed_y += self.gravity
        self.life -= 1

    def draw(self, surface):
        alpha = min(255, self.life * 3)
        color = (self.color[0], self.color[1], self.color[2], alpha)
        pygame.gfxdraw.filled_circle(surface, int(self.x), int(self.y), self.size, color)

    def is_dead(self):
        return self.life <= 0


# 祝福语
messages = [
    "祝所有小朋友儿童节快乐!",
    "愿你们永远保持童真和好奇心!",
    "健康成长,快乐学习!",
    "天天开心,笑容常在!",
    "梦想成真,未来可期!",
    "愿你们的童年充满欢乐和美好回忆!",
    "六一儿童节快乐!愿你永远保持纯真笑脸,健康成长每一天!",
    "童心未泯,快乐常在!祝小朋友节日快乐,梦想成真!",
    "愿你像小树苗一样茁壮成长,像小星星一样闪闪发光!",
    "儿童节到啦!愿你的童年充满糖果般的甜蜜和彩虹般的色彩!",
    "保持好奇心,探索大世界!祝聪明的小朋友节日快乐!",
    "愿你眼中永远有星光,心中永远有童话,节日快乐小天使!",
    "乘着快乐的翅膀,飞向梦想的远方!儿童节快乐!",
    "今天是你的专属节日!尽情欢笑,尽情玩耍,做最快乐的小孩!",
    "愿你的书包装满知识,口袋装满糖果,心里装满快乐!",
    "像奥特曼一样勇敢,像哆啦A梦一样神奇!节日快乐小超人!",
    "画个太阳照亮童年,折个纸飞机放飞梦想!六一快乐!",
    "愿你用蜡笔画下七彩童年,用积木搭建美好未来!",
    "保持童真看世界,带着梦想向前冲!儿童节快乐!",
    "今天是童话成真的日子,愿你的生活像动画片一样精彩!",
    "愿快乐常驻你的酒窝,智慧点亮你的双眸!节日快乐!",
    "像小蜜蜂一样勤劳,像小蝴蝶一样美丽!做最棒的小朋友!",
    "吹起欢乐的泡泡,荡起幸福的秋千,享受属于你的节日!",
    "愿你拥有佩奇的快乐,熊大的勇敢,汪汪队的智慧!",
    "童年是生命中最美的乐章,愿你奏响最欢快的音符!",
    "收集全世界的阳光,装点你的笑脸!儿童节快乐小太阳!"
]

# 创建气球
balloons = []
particles = []
message_index = 0
message_timer = 0
current_message = messages[0]  # 初始祝福语
previous_message = None

# 主循环
clock = pygame.time.Clock()
running = True

while running:
    current_time = pygame.time.get_ticks()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif event.key == pygame.K_SPACE:
                # 空格键添加气球
                for _ in range(5):
                    balloons.append(Balloon())

    # 随机添加气球
    if random.random() < 0.05:
        balloons.append(Balloon())

    # 更新气球
    for balloon in balloons[:]:
        balloon.update()
        if balloon.is_off_screen():
            balloons.remove(balloon)

    # 更新粒子
    for particle in particles[:]:
        particle.update()
        if particle.is_dead():
            particles.remove(particle)

    # 随机生成粒子
    if random.random() < 0.2:
        particles.append(Particle(random.randint(0, WIDTH), HEIGHT - 10))

    # 更新祝福语
    message_timer += 1
    if message_timer > 200:  # 每200帧切换一次祝福语
        while True:
            new_msg = random.choice(messages)
            if new_msg != previous_message:
                previous_message = new_msg
                current_message = new_msg
                break
        message_timer = 0

    # 绘制背景
    screen.fill(BACKGROUND)

    # 绘制云朵
    for i in range(3):
        cloud_x = (current_time // 30 + i * 300) % (WIDTH + 200) - 100
        cloud_y = 100 + i * 80
        pygame.draw.circle(screen, (250, 250, 250), (cloud_x, cloud_y), 30)
        pygame.draw.circle(screen, (250, 250, 250), (cloud_x + 20, cloud_y - 15), 25)
        pygame.draw.circle(screen, (250, 250, 250), (cloud_x + 40, cloud_y), 30)
        pygame.draw.circle(screen, (250, 250, 250), (cloud_x + 20, cloud_y + 15), 25)

    # 绘制草地
    pygame.draw.rect(screen, (100, 200, 100), (0, HEIGHT - 50, WIDTH, 50))
    for i in range(20):
        x = i * 50
        pygame.draw.arc(screen, (0, 150, 0), (x, HEIGHT - 80, 50, 50), 0, math.pi, 3)

    # 绘制气球
    for balloon in balloons:
        balloon.draw(screen)

    # 绘制粒子
    for particle in particles:
        particle.draw(screen)

    # 绘制标题
    title = title_font.render("儿童节快乐!", True, (200, 0, 100))
    screen.blit(title, (WIDTH // 2 - title.get_width() // 2, 30))

    # 绘制日期
    today = datetime.now().strftime("%Y年%m月%d日")
    date_text = subtitle_font.render(today, True, (0, 100, 200))
    screen.blit(date_text, (WIDTH // 2 - date_text.get_width() // 2, 100))

    # 绘制祝福语
    message = current_message
    msg_surface = message_font.render(message, True, (0, 0, 150))
    screen.blit(msg_surface, (WIDTH // 2 - msg_surface.get_width() // 2, HEIGHT - 200))

    # 绘制气球提示
    hint = message_font.render("按空格键添加更多气球", True, (100, 100, 100))
    screen.blit(hint, (WIDTH // 2 - hint.get_width() // 2, HEIGHT - 150))

    # 绘制退出提示
    exit_hint = message_font.render("按ESC键退出", True, (100, 100, 100))
    screen.blit(exit_hint, (WIDTH - exit_hint.get_width() - 20, HEIGHT - 40))

    # 绘制儿童节标志
    pygame.draw.circle(screen, (255, 240, 0), (WIDTH // 2, HEIGHT // 2 - 50), 60)
    pygame.draw.circle(screen, (255, 150, 0), (WIDTH // 2, HEIGHT // 2 - 50), 55, 5)

    # 绘制笑脸 - 修正后的笑脸
    pygame.draw.circle(screen, (0, 0, 0), (WIDTH // 2 - 20, HEIGHT // 2 - 60), 8)  # 左眼
    pygame.draw.circle(screen, (0, 0, 0), (WIDTH // 2 + 20, HEIGHT // 2 - 60), 8)  # 右眼

    # 绘制笑脸的嘴巴(向上弯曲)
    mouth_rect = (WIDTH // 2 - 25, HEIGHT // 2 - 40, 50, 40)
    pygame.draw.arc(screen, (0, 0, 0), mouth_rect, math.pi, 2 * math.pi, 3)

    # 绘制彩带
    for i in range(8):
        angle = i * math.pi / 4 + current_time / 1000
        length = 100
        end_x = WIDTH // 2 + math.cos(angle) * length
        end_y = HEIGHT // 2 - 50 + math.sin(angle) * length
        pygame.draw.line(screen, COLORS[i % len(COLORS)],
                         (WIDTH // 2, HEIGHT // 2 - 50),
                         (end_x, end_y), 3)

    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()


网站公告

今日签到

点亮在社区的每一天
去签到