用Python绘制梦幻星空

news2025/7/18 14:44:19

用Python绘制梦幻星空

在这篇教程中,我们将学习如何使用Python创建一个美丽的星空场景。我们将使用Python的图形库Pygame和随机库来创建闪烁的星星、流星和月亮,打造一个动态的夜空效果。
在这里插入图片描述
在这里插入图片描述

项目概述

我们将实现以下功能:

  1. 创建深蓝色的夜空背景
  2. 绘制随机分布的星星
  3. 实现星星的闪烁效果
  4. 添加一轮明月
  5. 创建流星效果

所需知识

  • Python基础编程
  • Pygame库的基本使用
  • 随机数生成
  • 基本的图形学知识

完整代码实现

import pygame
import random
import math

# 初始化Pygame
pygame.init()

# 设置窗口
WIDTH = 800
HEIGHT = 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("梦幻星空")

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 50)
YELLOW = (255, 255, 0)

# 星星类
class Star:
    def __init__(self):
        self.x = random.randint(0, WIDTH)
        self.y = random.randint(0, HEIGHT)
        self.size = random.randint(1, 3)
        self.brightness = random.random()
        self.speed = random.random() * 0.1

    def twinkle(self):
        self.brightness += self.speed
        if self.brightness > 1.0 or self.brightness < 0.0:
            self.speed = -self.speed
            self.brightness = max(0.0, min(1.0, self.brightness))  # 确保亮度在0到1之间
        
        brightness_value = max(0, min(255, int(255 * self.brightness)))  # 确保颜色值在0到255之间
        color = (brightness_value, brightness_value, brightness_value)
        pygame.draw.circle(screen, color, (self.x, self.y), self.size)

# 流星类
class ShootingStar:
    def __init__(self):
        self.reset()
        
    def reset(self):
        self.x = random.randint(0, WIDTH)
        self.y = 0
        self.speed = random.randint(5, 15)
        self.length = random.randint(20, 50)
        self.active = True
        
    def move(self):
        if not self.active:
            if random.random() < 0.01:  # 1%的概率生成新流星
                self.reset()
            return
            
        self.x += self.speed
        self.y += self.speed
        
        if self.x > WIDTH or self.y > HEIGHT:
            self.active = False
            return
            
        # 绘制流星
        pygame.draw.line(screen, WHITE, 
                        (self.x, self.y), 
                        (self.x - self.length, self.y - self.length), 
                        2)

# 月亮类
class Moon:
    def __init__(self):
        self.x = WIDTH // 4
        self.y = HEIGHT // 4
        self.radius = 40
        
    def draw(self):
        # 绘制月亮
        pygame.draw.circle(screen, WHITE, (self.x, self.y), self.radius)
        # 绘制月亮的阴影部分
        shadow = pygame.Surface((self.radius*2, self.radius*2), pygame.SRCALPHA)
        pygame.draw.circle(shadow, (0, 0, 0, 128), 
                         (self.radius, self.radius), self.radius)
        screen.blit(shadow, (self.x - self.radius + 10, self.y - self.radius))

def main():
    # 创建对象
    stars = [Star() for _ in range(200)]
    shooting_stars = [ShootingStar() for _ in range(3)]
    moon = Moon()
    
    # 游戏主循环
    running = True
    clock = pygame.time.Clock()
    
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                
        # 绘制背景
        screen.fill(BLUE)
        
        # 绘制星星
        for star in stars:
            star.twinkle()
            
        # 绘制月亮
        moon.draw()
        
        # 绘制流星
        for shooting_star in shooting_stars:
            shooting_star.move()
            
        # 更新显示
        pygame.display.flip()
        clock.tick(30)
        
    pygame.quit()

if __name__ == "__main__":
    main()

代码详解

1. 基础设置

首先,我们设置了窗口大小和基本颜色:

WIDTH = 800
HEIGHT = 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))

2. Star类

Star类实现了单个星星的属性和行为:

  • 随机位置(x, y坐标)
  • 随机大小(1-3像素)
  • 闪烁效果(通过brightness和speed控制)
  • 亮度限制在0-1之间,确保安全的颜色值范围

3. ShootingStar类

ShootingStar类实现了流星效果:

  • 随机起始位置(从屏幕顶部开始)
  • 随机速度(5-15像素/帧)
  • 随机长度(20-50像素)
  • 1%概率重新生成新流星
  • 对角线运动轨迹

4. Moon类

Moon类负责绘制月亮:

  • 固定位置(屏幕左上方1/4处)
  • 40像素的半径
  • 使用SRCALPHA实现半透明阴影效果
  • 阴影偏移创造月相效果

效果展示

运行代码后,你将看到:

  1. 深蓝色的夜空背景
  2. 200颗大小不一的闪烁星星
  3. 一轮带有阴影效果的明月
  4. 3个随机出现的流星

扩展优化建议

  1. 视觉效果增强

    • 添加云彩效果
    • 实现渐变色背景
    • 添加北极光效果
    • 增加星座连线
  2. 交互功能

    • 鼠标点击生成流星
    • 添加背景音乐
    • 实现昼夜交替
    • 添加天气效果
  3. 性能优化

    • 使用精灵系统
    • 优化粒子效果
    • 实现帧率控制
    • 使用缓存表面减少绘制开销

注意事项

  1. 运行前确保安装必要的库:
pip install pygame
  1. 性能调优建议:
  • 可以根据电脑性能调整星星数量(当前为200颗)
  • 调整帧率(当前为30FPS)
  • 调整流星生成概率(当前为1%)
  1. 代码优化要点:
  • 星星的亮度值已经做了范围限制,避免了颜色值溢出
  • 流星的生成使用概率控制,避免了同时出现过多流星
  • 使用了pygame.SRCALPHA实现半透明效果

总结

这个项目展示了Python在图形编程方面的能力。通过这个项目,你可以学习到:

  • Pygame的基本使用
  • 面向对象编程的实践
  • 随机效果的生成
  • 动画效果的制作
  • 基本的游戏循环结构

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

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

相关文章

GEE计算 RSEI(遥感生态指数)

&#x1f6f0;️ 什么是 RSEI&#xff1f;为什么要用它评估生态环境&#xff1f; RSEI&#xff08;遥感生态指数&#xff0c;Remote Sensing Ecological Index&#xff09; 是一种通过遥感数据计算得到的、综合反映区域生态环境质量的指标体系。 它的设计初衷是用最少的变量&…

python的家教课程管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

实现书签-第一部分

实现书签-第一部分 本节我们将实现书签功能&#xff0c;为菜谱点击类似于收藏的功能&#xff0c;然后可以在上方的书签找到我们所有收藏的书签&#xff1b; 在此之前&#xff0c;让我们修复一下之前的功能BUG&#xff0c;当我们搜索的时候&#xff0c;下面分页始终保持在上一…

解决将其他盘可用空间,移植到C盘

第一步首先下载安装 用来扩内存盘的实用工具资源-CSDN文库 第二步打开diskgenius.exe 第三步选中想扩容的盘 右击-》选择扩容分区-》选择要缩小的分区-》然后确定 第四步拖拽对勾的地方 或者在箭头地方输入想阔的大小&#xff0c;然后开始&#xff0c;一直确定&#xff0c;就…

第二天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 清晰的明白自己想要的是什么&#xff0c;培养兴趣也好&#xff0c;一定要有自己的一技之长。我们不说多优秀&#xff0c;但是如果父母需要我们出力&#xff0c;不要只有眼泪。 二、练习题 对…

k8s灰度发布

基于 Traefik 的加权灰度发布-腾讯云开发者社区-腾讯云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 从上面连接下载后上传到harbor虚拟机 vagrant upload /C/Users/HP280/Downloads/traefik 下载配置文件 wget -c http://raw.githubusercontent.com/conta…

前端面经 9 JS中的继承

借用Class实现继承 实现继承 extends super extends 继承父类 super调用父类的构造函数 子类中存在方法采取就近原则 &#xff0c;子类构造函数需要使用super()调用父类的构造函数 JS 静态属性和私有属性 寄生组合式继承

memcached主主复制+keepalive

一、Memcached主主复制技术原理 Memcached原生不支持复制&#xff0c;需通过repcached分支实现双向同步。其关键机制包括&#xff1a; 双向同步架构 两节点互为主备&#xff08;Master-Master&#xff09;&#xff0c;任意节点写入的数据会同步至对端。同步基于TCP协议&#x…

idea运行

各种小kips Linuxidea上传 Linux 部署流程 1、先在idea打好jar包&#xff0c;clean之后install 2、在Linux目录下&#xff0c;找到对应项目目录&#xff0c;把原来的jar包放在bak文件夹里面 3、杀死上一次jar包的pid ps -ef|grep cliaidata.jar kill pid 4、再进行上传新的jar…

CVPR2025 | 首个多光谱无人机单目标跟踪大规模数据集与统一框架, 数据可直接下载

论文介绍 题目&#xff1a;MUST: The First Dataset and Unified Framework for Multispectral UAV Single Object Tracking 期刊&#xff1a;IEEE/CVF Computer Vision and Pattern Recognition Conference 论文&#xff1a;https://arxiv.org/abs/2503.17699 数据&#x…

Docker实现MySQL数据库主从复制

一、拉取数据库镜像 docker pull mysql:5.7二、创建两个数据库(一主一从模式) mysql01&#xff08;主&#xff09; 1.docker run -d -p 3310:3306 -v /root/mysql/node-1/init:/docker-entrypoinit-initdb.d -v /root/mysql/node-1/config:/etc/mysql/conf.d -v /root/mysq…

2025长三角杯数学建模B题教学思路分析:空气源热泵供暖的温度预测

2025长三角杯数学建模B题教学思路模型代码&#xff0c;详细内容见文末名片 一、问题背景 在当今“电供暖”日益普及的大背景下&#xff0c;空气源热泵凭借其独特优势&#xff0c;在楼宇供暖领域崭露头角&#xff0c;成为缓解电网调峰压力的得力助手。然而&#xff0c;供暖过程…

InternVL3: 利用AI处理文本、图像、视频、OCR和数据分析

InternVL3推动了视觉-语言理解、推理和感知的边界。 在其前身InternVL 2.5的基础上,这个新版本引入了工具使用、GUI代理操作、3D视觉和工业图像分析方面的突破性能力。 让我们来分析一下是什么让InternVL3成为游戏规则的改变者 — 以及今天你如何开始尝试使用它。 InternVL…

重构金融数智化产业版图:中电金信“链主”之道

近日&#xff0c;《商学院》杂志独家专访了中电金信常务副总经理&#xff08;主持经营工作&#xff09;冯明刚&#xff0c;围绕“金融科技”“数字底座”“架构转型”“AI驱动”等议题&#xff0c;展开了一场关于未来架构、技术变革与系统创新的深入对话。 当下&#xff0c;数字…

2025年PMP 学习十六 第11章 项目风险管理 (总章)

2025年PMP 学习十六 第11章 项目风险管理 &#xff08;总章&#xff09; 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 目标: 提高项目中积极事件的概率和…

bili.png

import pygame as pg import sys import time import randompg.init() screen pg.display.set_mode((800,500)) pg.display.set_caption(runcool) screen.fill((135, 206, 235)) bili pg.image.load(bili.png)#得分 coin 0 game_font pg.font.Font(None, 50)#人物大小…

【设计模式】- 行为型模式1

模板方法模式 定义了一个操作中的算法骨架&#xff0c;将算法的一些步骤推迟到子类&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的某些步骤 【主要角色】&#xff1a; 抽象类&#xff1a;给出一个算法的轮廓和骨架&#xff08;包括一个模板方法 和 若干基…

AI神经网络降噪算法在语音通话产品中的应用优势与前景分析

采用AI降噪的语言通话环境抑制模组性能效果测试 一、引言 随着人工智能技术的快速发展&#xff0c;AI神经网络降噪算法在语音通话产品中的应用正逐步取代传统降噪技术&#xff0c;成为提升语音质量的关键解决方案。相比传统DSP&#xff08;数字信号处理&#xff09;降噪&#…

springboot连接高斯数据库(GaussDB)踩坑指南

1. 用户密码加密类型与gsjdbc4版本不兼容问题 我的数据库&#xff0c;设置的加密类型(password_encryption_type)是2&#xff0c; 直接使用gsjdbc4.jar连接数据库报错。 org.postgresql.util.PSQLException: Invalid or unsupported by client SCRAM mechanisms 后使用gsjdb…

c++20引入的三路比较操作符<=>

目录 一、简介 二、三向比较的返回类型 2.1 std::strong_ordering 2.2 std::weak_ordering 2.3 std::partial_ordering 三、对基础类型的支持 四、自动生成的比较运算符函数 4.1 std::rel_ops的作用 4.2 使用<> 五、兼容他旧代码 一、简介 c20引入了三路比较操…