使用Pygame制作“圣诞树”

1. 前言

圣诞节到来之际,来给自己写一个圣诞树小动画吧!我们可以利用 Pygame 的绘图功能,轻松地在 2D 屏幕上绘制各种几何形状,并为圣诞树加上灯光闪烁、装饰品等效果。本篇将带领你实现一个简易版本的“屏幕圣诞树”,效果虽然比较基础,但足以体验使用 Python 进行可视化和动画开发的乐趣。

2. 环境准备

  1. Python 3.x
  2. Pygame 库:如果尚未安装,可以在命令行执行:
    pip install pygame
    
  3. 支持图形界面的系统环境:Windows、macOS、Linux 桌面都可行。

安装完成后,先简单测试一下 import pygame,没有报错则说明安装成功。


3. 实现思路

为了在屏幕中呈现一棵“圣诞树”并进行简单的动画,可以按照下列思路:

  1. 背景:设置一个符合圣诞氛围的背景色或背景图。
  2. 树干与树冠
    • 树干通常是一个棕色矩形;
    • 树冠可以由多个叠加的绿色三角形或梯形组成,或者干脆用一个多边形/贝塞尔曲线模拟松针形状。
  3. 装饰品与灯光
    • 在树上随机/固定位置放置一些圆形或小图标,模拟彩球、雪花、铃铛、礼物等等。
    • 对于灯光,可以让它们随时间闪烁,时亮时暗。
  4. 顶端星星:在树冠顶端放一个闪亮的五角星。
  5. 动画循环
    • 每帧刷新时,重绘树和装饰;
    • 通过简单计时或随机函数让灯光闪烁,使其呈现动感效果。
  6. 事件监听
    • 监听关闭窗口事件,当用户点击关闭按钮时,退出游戏循环。

接下来进入实际的示例代码环节。


4. 示例代码

将以下代码保存为 christmas_tree.py 并运行,即可看到效果。你可以根据自己的需求进行修改和美化。

import pygame
import random
import math

# 屏幕大小
WIDTH, HEIGHT = 800, 600

# 一些颜色定义
WHITE  = (255, 255, 255)
BLACK  = (0, 0, 0)
GREEN  = (34, 139, 34)
BROWN  = (139, 69, 19)
YELLOW = (255, 215, 0)
RED    = (255, 0, 0)
BLUE   = (0, 0, 255)

# 初始化 Pygame
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("圣诞树 - Pygame 示例")
clock = pygame.time.Clock()

# 定义装饰灯光类
class Light:
    """
    树上的一盏小灯
    """
    def __init__(self, x, y, color, radius=5):
        self.x = x
        self.y = y
        self.color = color
        self.radius = radius
        # 初始亮度状态
        self.blink_state = True

    def update(self, frame_count):
        """
        让灯每隔若干帧闪烁一次,可根据 frame_count 或随机数来控制频率
        """
        if frame_count % 30 == 0:
            self.blink_state = not self.blink_state

    def draw(self, surface):
        if self.blink_state:
            pygame.draw.circle(surface, self.color, (int(self.x), int(self.y)), self.radius)
        else:
            # 暗灯时可以换成暗色 / 或者不画
            dark_color = (self.color[0] // 3, self.color[1] // 3, self.color[2] // 3)
            pygame.draw.circle(surface, dark_color, (int(self.x), int(self.y)), self.radius)


def draw_tree(surface):
    """
    绘制静态部分:树干与树冠
    你可以根据喜好更改树的形状。
    """
    # 1) 树干
    trunk_width = 40
    trunk_height = 80
    trunk_x = WIDTH // 2 - trunk_width // 2
    trunk_y = HEIGHT - 100
    pygame.draw.rect(surface, BROWN, (trunk_x, trunk_y, trunk_width, trunk_height))

    # 2) 树冠(用多个绿色三角叠加)
    # 顶层小三角
    pygame.draw.polygon(surface, GREEN, [
        (WIDTH//2, 80),    # 树顶
        (WIDTH//2 - 50, 180),
        (WIDTH//2 + 50, 180)
    ])
    # 中层中三角
    pygame.draw.polygon(surface, GREEN, [
        (WIDTH//2, 140),
        (WIDTH//2 - 80, 260),
        (WIDTH//2 + 80, 260)
    ])
    # 底层大三角
    pygame.draw.polygon(surface, GREEN, [
        (WIDTH//2, 200),
        (WIDTH//2 - 110, 360),
        (WIDTH//2 + 110, 360)
    ])

    # 3) 在树顶绘制一颗星星
    draw_star(surface, (WIDTH//2, 70), 20, 10, YELLOW)


def draw_star(surface, center, outer_radius, inner_radius, color):
    """
    绘制一个五角星。outer_radius 控制外顶点距离中心的半径,
    inner_radius 控制内凹点距离中心的半径。
    """
    cx, cy = center
    points = []
    # 五角星通常有10个点:外点、内点交替
    for i in range(10):
        angle = math.radians(36 * i - 90)  # -90 为了让星星尖朝上
        if i % 2 == 0:
            r = outer_radius
        else:
            r = inner_radius
        x = cx + r * math.cos(angle)
        y = cy + r * math.sin(angle)
        points.append((x, y))
    pygame.draw.polygon(surface, color, points)


def main():
    # 背景色
    bg_color = (30, 30, 60)

    # 随机生成若干灯光装饰在树上
    # 例如在三角区域内或自定义坐标范围
    lights = []
    # 简化做法:我们手动给定一个大概的三角区域范围
    # 当然你可以根据多边形逻辑来更精确地分布
    for _ in range(30):
        # 随机 x, y 范围要在大三角区内
        x = random.randint(WIDTH//2 - 100, WIDTH//2 + 100)
        y = random.randint(140, 360)
        # 随机挑选一个鲜艳颜色
        color_choice = random.choice([RED, BLUE, YELLOW, (0, 255, 0)])
        lights.append(Light(x, y, color_choice, radius=5))

    running = True
    frame_count = 0
    while running:
        clock.tick(30)
        frame_count += 1

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        # 更新灯光闪烁
        for light in lights:
            light.update(frame_count)

        # 绘制
        screen.fill(bg_color)
        # 先画树
        draw_tree(screen)
        # 再画灯光(在树身上,保证不被后续覆盖)
        for light in lights:
            light.draw(screen)

        pygame.display.flip()

    pygame.quit()

if __name__ == "__main__":
    main()

  • draw_tree(surface)
    • 先用 pygame.draw.rect 画树干;
    • 然后依次画几个绿色三角形叠加,简单地模拟圣诞树的层层枝叶;
    • 最后用 draw_star 函数在顶部绘制一颗五角星。
  • draw_star(surface, center, outer_radius, inner_radius, color)
    • 使用数学方法,在 360° 范围内定位五角星的 10 个顶点,偶数点半径为外圆半径、奇数点半径为内圆半径。
    • 使用 pygame.draw.polygon 一次性绘制多边形即可形成五角星。
  • Light 类
    • 用于表示树上的一盏灯,含有位置、颜色、半径,以及 blink_state(灯是否点亮)。
    • 每隔一定帧数(在本示例中是 30 帧)就进行一次 self.blink_state = not self.blink_state 切换,造成闪烁效果。
  • 随机灯光生成
    • 简易写法:在大三角下部使用一定范围的随机 x、y 坐标放置彩灯;
    • 可扩展的写法:可以根据树的多边形形状进行“点在多边形内”的计算,将彩灯更准确地贴合树形。
  • 动画循环
    • 不断刷新帧(while running),更新灯光状态,绘制背景、树和灯光。
    • 用户点击关闭后退出循环,调用 pygame.quit() 清理资源。

5. 运行效果

image.png


6. 总结

通过本篇示例,你已经见识了使用 Pygame 绘制 2D 圣诞树并实现简单灯光闪烁的流程。从基础的多边形绘制开始,到为灯光加上动画闪烁,都是 Pygame 里常见的 游戏循环图形绘制 技巧。你可以自由发挥想象,对圣诞树进行更多装饰和功能扩展,让这个节日小作品更加绚丽夺目。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、使用Chatbox进行交互5.1 下载Chatbox安装包…

《AI大模型开发笔记》DeepSeek技术创新点

一、DeepSeek横空出世 DeepSeek V3 以颠覆性技术架构创新强势破局!革命性的上下文处理机制实现长文本推理成本断崖式下降,综合算力需求锐减90%,开启高效 AI 新纪元! 最新开源的 DeepSeek V3模型不仅以顶尖基准测试成绩比肩业界 …

【深度学习】softmax回归的从零开始实现

softmax回归的从零开始实现 (就像我们从零开始实现线性回归一样,)我们认为softmax回归也是重要的基础,因此(应该知道实现softmax回归的细节)。 本节我们将使用Fashion-MNIST数据集,并设置数据迭代器的批量大小为256。 import torch from IP…

python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…

如果通过认证方式调用Sf的api

导读 OAuth 2.0:是一个开放的授权框架,当用户想要访问Service Provider提供的资源时,OAuth客户端可以从IdP(Identity Provider)获得授权而不需要获取用户名和密码就可以访问该资源题。 作者:vivi,来源:osinnovation …

SpringBoot 整合 SpringMVC:SpringMVC的注解管理

分类&#xff1a; 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器&#xff1a; 中央转发器被 SpringBoot 自动接管&#xff0c;不需要我们在 web.xml 中配置&#xff1a; <servlet><servlet-name>chapter2&l…

【含文档+PPT+源码】基于微信小程序农家乐美食餐厅预约推广系统

项目介绍 本课程演示的是一款基于微信小程序农家乐美食餐厅预约推广系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 …

什么是门控循环单元?

一、概念 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Cho等人在2014年提出。GRU是LSTM的简化版本&#xff0c;通过减少门的数量和简化结构&#xff0c;保留了LSTM的长时间依赖…

基于深度学习的输电线路缺陷检测算法研究(论文+源码)

输电线路关键部件的缺陷检测对于电网安全运行至关重要&#xff0c;传统方法存在效率低、准确性不高等问题。本研究探讨了利用深度学习技术进行输电线路关键组件的缺陷检测&#xff0c;目的是提升检测的效率与准确度。选用了YOLOv8模型作为基础&#xff0c;并通过加入CA注意力机…

【LLM-agent】(task6)构建教程编写智能体

note 构建教程编写智能体 文章目录 note一、功能需求二、相关代码&#xff08;1&#xff09;定义生成教程的目录 Action 类&#xff08;2&#xff09;定义生成教程内容的 Action 类&#xff08;3&#xff09;定义教程编写智能体&#xff08;4&#xff09;交互式操作调用教程编…

C++游戏开发实战:从引擎架构到物理碰撞

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 C 是游戏开发中最受欢迎的编程语言之一&#xff0c;因其高性能、低延迟和强大的底层控制能力&#xff0c;被广泛用于游戏…

Time Constant | RC、RL 和 RLC 电路中的时间常数

注&#xff1a;本文为 “Time Constant” 相关文章合辑。 机翻&#xff0c;未校。 How To Find The Time Constant in RC and RL Circuits June 8, 2024 &#x1f4a1; Key learnings: 关键学习点&#xff1a; Time Constant Definition: The time constant (τ) is define…

DeepSeek Janus-Pro:多模态AI模型的突破与创新

近年来&#xff0c;人工智能领域取得了显著的进展&#xff0c;尤其是在多模态模型&#xff08;Multimodal Models&#xff09;方面。多模态模型能够同时处理和理解文本、图像等多种类型的数据&#xff0c;极大地扩展了AI的应用场景。DeepSeek(DeepSeek-V3 深度剖析&#xff1a;…

w188校园商铺管理系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

DeepSeek R1本地化部署 Ollama + Chatbox 打造最强 AI 工具

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; Ollama &#x1f98b; 下载 Ollama&#x1f98b; 选择模型&#x1f98b; 运行模型&#x1f98b; 使用 && 测试 二&#xff1a;&#x1f525; Chat…

图漾相机——Sample_V1示例程序

文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.SDK基本知识2.1 SDK目录结构2.2 设备组件简介2.3 设备组件属性2.4 设备的帧数据管理机制2.5 SDK中的坐标系变换 3.Sample_V1示例程序3.1 DeviceStorage3.2 DumpCalibInfo3.3 NetStatistic3.4 SimpleView_SaveLoad…

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…

小程序项目-购物-首页与准备

前言 这一节讲一个购物项目 1. 项目介绍与项目文档 我们这里可以打开一个网址 https://applet-base-api-t.itheima.net/docs-uni-shop/index.htm 就可以查看对应的文档 2. 配置uni-app的开发环境 可以先打开这个的官网 https://uniapp.dcloud.net.cn/ 使用这个就可以发布到…

深入解析Python机器学习库Scikit-Learn的应用实例

深入解析Python机器学习库Scikit-Learn的应用实例 随着人工智能和数据科学领域的迅速发展&#xff0c;机器学习成为了当下最炙手可热的技术之一。而在机器学习领域&#xff0c;Python作为一种功能强大且易于上手的编程语言&#xff0c;拥有庞大的生态系统和丰富的机器学习库。其…

大模型训练(5):Zero Redundancy Optimizer(ZeRO零冗余优化器)

0 英文缩写 Large Language Model&#xff08;LLM&#xff09;大型语言模型Data Parallelism&#xff08;DP&#xff09;数据并行Distributed Data Parallelism&#xff08;DDP&#xff09;分布式数据并行Zero Redundancy Optimizer&#xff08;ZeRO&#xff09;零冗余优化器 …