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

news2025/7/27 11:44:32

端午节

 端午节总算是回家了,感觉时间过得真快,马上就毕业了,用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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#项目07-二维数组的随机创建

实现需求 创建二维数组&#xff0c;数组的列和宽为随机&#xff0c;数组内的数也是随机 知识点 1、Random类 Public Random rd new Random(); int Num_Int rd.Next(1, 100);2、数组上下限。 //定义数组 int[] G_Array new int[1,2,3,4];//一维数组 int[,] G_Array_T …

光伏功率预测 | LSTM多变量单步光伏功率预测(Matlab完整源码和数据)

光伏功率预测 | MATLAB实现基于LSTM长短期记忆神经网络的光伏功率预测 目录 光伏功率预测 | MATLAB实现基于LSTM长短期记忆神经网络的光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 光伏功率预测 | LSTM多变量单步光伏功率预测&#xff08;Matlab完整源码和…

一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——3. 服务器软件更新,以及常用软件安装

前言 前面&#xff0c;我们已经 安装好了 Ubuntu 服务器系统&#xff0c;并且 配置好了 ssh 免密登录服务器 &#xff0c;现在&#xff0c;我们要来进一步的设置服务器。 那么&#xff0c;本文&#xff0c;就是进行服务器的系统更新&#xff0c;以及常用软件的安装 调整 Ubu…

PyTorch 入门学习笔记

一、简介 PyTorch 是由 Meta&#xff08;原 Facebook&#xff09; 开源的深度学习框架。其前身 Torch 是一个基于 LuaJIT 的科学计算框架&#xff0c;核心功能是提供高效的张量&#xff08;Tensor&#xff09;操作和神经网络支持。由于 Lua 语言的生态限制&#xff0c;Torch 逐…

pycharm生成图片

文章目录 图片例子生成图片并储存&#xff0c;设置中文字体支持两条线绘制散点图和直方图绘制条形图&#xff08;bar&#xff09;绘制条形图&#xff08;横着的&#xff09;&#xff08;plt.barh&#xff09;分组的条形图 颜色和线条风格1. **颜色字符 (color)**其他颜色指定方…

Android 云手机横屏模式下真机键盘遮挡输入框问题处理

一、背景 打开横屏应用,点击云机EditText输入框,输入框被键盘遮挡,如下图&#xff1a; 未打开键盘状态: 点击第二个输入框,键盘遮挡了输入框&#xff1a; 二、解决方案&#xff08;推荐第三中方案,博主采用的也是第三种方案&#xff09; 博主这里整理了三种方案&#xff1a;…

Axure设计案例——科技感对比柱状图

想让数据对比展示摆脱平淡无奇&#xff0c;瞬间抓住观众的眼球吗&#xff1f;那就来看看这个Axure设计的科技感对比柱状图案例&#xff01;科技感设计风格运用独特元素打破传统对比柱状图的常规&#xff0c;营造出一种极具冲击力的视觉氛围。每一组柱状体都仿佛是科技战场上的士…

FPGA仿真中阻塞赋值(=)和非阻塞赋值(<=)区别

FPGA仿真中阻塞赋值和非阻塞赋值的区别 单独仿真小模块对但将小模块加入整个工程仿真不对就有可能是没有注意到仿真中阻塞赋值和非阻塞赋值的区别 目录 前言 一、简介 二、设计实例 三、仿真实例 1、仿真用非阻塞赋值 2、仿真用阻塞赋值 总结 前言 网上很多人介绍verilo…

LabVIEW轴角编码器自动检测

LabVIEW 开发轴角编码器自动检测系统&#xff0c;针对指控系统中高故障率的轴角编码器性能检测需求&#xff0c;通过模块化硬件架构与软件设计&#xff0c;实现编码器运转状态模拟、扭矩 / 转速实时监测、19 位并行编码采集译码、数据自动分析及报告生成等功能&#xff0c;解决…

MySQL数据库从0到1

目录 数据库概述 基本命令 查询命令 函数 表的操作 增删改数据和表结构 约束 事务 索引 视图 触发器 存储过程和函数 三范式 数据库概述 SQL语句的分类&#xff1a; DQL&#xff1a;查询语句&#xff0c;凡是select语句都是DQL。 DML&#xff1a;insert,delete,up…

WiFi万能钥匙鲲鹏服务器部署 TiDB 集群实战指南

作者&#xff1a; TiDBer_yangxi 原文来源&#xff1a; https://tidb.net/blog/15a234d0 一、环境准备 1. 硬件要求 服务器架构 &#xff1a;鲲鹏服务器&#xff08;ARM架构&#xff09;&#xff0c;TiDB 官方明确支持 ARM 架构服务器部署 推荐配置 &#xff08;生产环…

Vue 核心技术与实战智慧商城项目Day08-10

温馨提示&#xff1a;这个黑马的视频在b占可以找到&#xff0c;里面有完整的教学过程 然后这个项目有完整的代码&#xff0c;我已经上传了&#xff0c;如果审核成功大家就可以看了&#xff0c;但是需要审核多久我也不是很确定 1.项目演示 2. 项目收获 3. 创建项目 4. 调整初始化…

TCP/IP协议精华总结pdf分享

hi &#xff0c;大家好&#xff0c;应小伙伴们的要求&#xff0c;上次分享了个人的一些学习和职场经验&#xff0c;其中网络协议PDF文档是我之前学习协议的时候总结一些精华知识&#xff0c;网络属于基本功&#xff0c;是互联网必备知识&#xff0c;我深信掌握好核心20%知识&am…

⚡️ Linux grep 命令参数详解

⚡️ Linux grep 用法及参数详解 &#x1f4d8; 1. grep 简介 grep 是 Linux/Unix 系统中用于文本搜索的命令&#xff0c;其全称为 Global Regular Expression Print&#xff0c;意为全局正则表达式打印器。 它根据给定的 模式&#xff08;pattern&#xff09; 对文件或标准…

2025年第三届CCF·夜莺开源创新论坛通知

点击蓝字 关注我们 CCF Opensource Development Committee 01 大会简介 由中国计算机学会主办、CCF开源发展委员会及夜莺开源社区承办的第三届CCF夜莺开源创新论坛拟于2025年7月4日在北京召开。本次论坛以“AI 加速可观测”为主题&#xff0c;汇聚了开源夜莺核心开发团队&#…

GMDCMonitor企业版功能分享0602

企业版包含了拓扑中心、签退中心、知识库、通知渠道配置、平台自定义&#xff0c;这5个功能 1&#xff09;拓扑中心 拓扑中心绘制的时候需要注意2点&#xff1a; 1&#xff09;要先选择 “矩形区域” 或 “圆形区域” 来添加各个背景区域&#xff0c;同时录入区域尺寸&#x…

Warm-Flow发布1.7.3 端午节(设计器流和流程图大升级)

Warm-Flow发布1.7.3 端午节&#xff08;设计器流和流程图大升级&#xff09; 更新内容项目介绍功能思维导图演示地址官网Warm-Flow视频 更新内容 [feat] 新版流程图通过前端渲染[perf] 美化流程设计器ui[feat] 办理人权限处理器&#xff0c;新增办理人转换接口&#xff0c;比如…

【存储基础】SAN存储基础知识

文章目录 1. 什么是SAN存储&#xff1f;2. SAN存储组网架构3. SAN存储的主要协议SCSI光纤通道&#xff08;FC&#xff09;协议iSCSIFCoENVMe-oFIB 4. SAN存储的关键技术Thin Provision&#xff1a;LUN空间按需分配Tier&#xff1a;分级存储Cache&#xff1a;缓存机制QoS&#x…

2025年ESWA SCI1区TOP,改进成吉思汗鲨鱼算法MGKSO+肝癌疾病预测,深度解析+性能实测

1.摘要 本文针对肝癌&#xff08;HCC&#xff09;早期诊断难题&#xff0c;提出了一种基于改进成吉思汗鲨鱼优化算法&#xff08;MGKSO&#xff09;的计算机辅助诊断系统。由于HCC在早期症状不明显且涉及高维复杂数据&#xff0c;传统机器学习方法易受噪声和冗余特征干扰。为提…

Spark-TTS: AI语音合成的“变声大师“

嘿&#xff0c;各位AI爱好者&#xff01;还记得那些机器人般毫无感情的合成语音吗&#xff1f;或者那些只能完全模仿但无法创造的语音克隆&#xff1f;今天我要介绍的Spark-TTS模型&#xff0c;可能会让这些问题成为历史。想象一下&#xff0c;你可以让AI不仅说出任何文字&…