当前位置: 首页 > article >正文

Python金色流星雨

金色流星雨

系列目录

序号直达链接
爱心系列
1Python制作一个无法拒绝的表白界面
2Python满屏飘字表白代码
3Python无限弹窗满屏表白代码
4Python李峋同款可写字版跳动的爱心
5Python流星雨代码
6Python漂浮爱心代码
7Python爱心光波代码
8Python普通的玫瑰花代码
9Python炫酷的玫瑰花代码
10Python多彩的玫瑰花代码
节日系列
1Python动漫风烟花秀代码
2Python新年烟花秀代码
3Python圣诞礼物代码
4Python画圣诞树代码
5Python可爱版圣诞树丨绿色
6Python可爱版圣诞树丨粉色
7Python大雪纷飞代码
8Python生日蛋糕代码
9Python五彩气球代码
10Python国庆祝福代码
11Python万圣礼物代码
12Python愚人节礼物代码
13Python浪漫星空代码
14Python樱花树代码
动漫系列
1Python名侦探柯南
2Python喜羊羊
3Python懒羊羊
4Python沸羊羊
5Python小灰灰
6Python小香香
7Python灰太狼
8Python海绵宝宝
9Python哆啦A梦
10Python凯蒂猫
11Python猫和老鼠
12Python草莓熊
13Python迷你皮卡丘
14Python高级皮卡丘
15Python豪华皮卡丘
16Python史迪仔
17Python小熊猫
18Python蜘蛛侠
19Python可爱版蜡笔小新
20Python萌萌的蜡笔小新
21Python罗小黑
22Python猪猪侠
炫酷系列
1  Python张万森下雪了
2Python一闪一闪亮晶晶
3Python黑客帝国代码雨
4Python七彩花朵
5Python模拟3D星空
6Python金榜题名
7Python满天星

文章目录

  • 系列目录
  • 环境需求
  • 完整代码
  • 代码分析
      • 1. 导入库和窗口设置
      • 2. 创建画笔对象
      • 3. 流星的颜色
      • 4. 定义流星类`Meteor`
      • 5. `meteor`方法:绘制流星
      • 6. `move`方法:流星的运动
      • 7. 创建流星对象列表
      • 8. 动画循环
      • 总结
  • 写在后面

环境需求

  • python3.11.4
  • PyCharm Community Edition 2023.2.5
  • pyinstaller6.2.0可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)

【注】

  • python环境搭建请见:https://want595.blog.csdn.net/article/details/134586653
  • pyinstaller使用教程见:https://want595.blog.csdn.net/article/details/134106807

完整代码

import turtle  # 导入turtle库,用于图形绘制
import random  # 导入random库,生成随机数
import math  # 导入math库,进行数学计算

turtle.setup(1.0, 1.0)  # 设置窗口大小为屏幕大小
turtle.title("流星雨动画")   # 设置窗口标题
turtle.bgcolor('black')  # 设置背景颜色为黑色

t = turtle.Turtle()  # 创建一个画笔对象
t.hideturtle()  # 隐藏画笔,不显示画布的形状
t.pensize(1)    # 设置画笔的大小

# 定义流星的颜色列表
colors = ['gold', 'yellow', 'orange']  # 金色


class Meteor:  # 定义流星类
    def __init__(self):  # 初始化方法,创建每颗流星时调用
        self.r = random.randint(50, 100)    # 随机生成流星的半径
        self.k = random.uniform(2, 4)   # 随机生成角度参数
        self.x = random.randint(-1000, 1000)  # 随机生成流星的x坐标
        self.y = random.randint(-500, 500)  # 随机生成流星的y坐标
        self.speed = random.randint(5, 10)  # 随机生成流星的移动速度
        self.color = random.choice(colors)  # 随机选择流星的颜色

    def meteor(self):  # 绘制流星的方法
        # 移动画笔到指定的坐标位置处
        t.penup()
        t.goto(self.x, self.y)
        t.pendown()
        # 设置流星的颜色
        t.begin_fill()
        t.fillcolor(self.color)
        # 开始绘制流星
        t.setheading(-30)  # 设置流星的朝向
        t.right(self.k)  # 根据随机角度右转
        t.forward(self.r)  # 沿直线前进一定长度
        t.left(self.k)  # 左转回到垂直方向
        t.circle(self.r * math.sin(math.radians(self.k)), 180)  # 绘制半圆弧
        t.left(self.k)  # 再次左转恢复角度
        t.forward(self.r)  # 沿直线前进相同长度以闭合流星形状
        t.end_fill()  # 结束填充

    def move(self):  # 更新流星位置的方法
        if self.y >= -500:  # 当流星的y坐标大于等于-500时
            self.y -= self.speed  # 减小流星y坐标的大小,将画笔向下移动
            self.x += 2 * self.speed  # 增加流星x坐标的大小,将画笔向右移动
        else:  # 当流星的y坐标小于-500时
            self.r = random.randint(50, 100)  # 重新设置流星的半径
            self.k = random.uniform(2, 4)  # 重新设置角度参数
            self.x = random.randint(-2000, 1000)  # 重新设置流星的x坐标
            self.y = 500  # 重新设置流星的y坐标
            self.speed = random.randint(5, 10)  # 重新设置流星的速度
            self.color = random.choice(colors)  # 重新设置流星的颜色


# 创建一个流星列表,用来存储流星实例
Meteors = []
for i in range(100):
    Meteors.append(Meteor())

# 进行无限循环,模拟流星雨动画
while True:
    turtle.tracer(0)  # 关闭tracer,提高性能
    t.clear()  # 清除画布内容
    for i in range(100):
        Meteors[i].move()  # 更新每颗流星的位置
        Meteors[i].meteor()  # 重新绘制每颗流星
    turtle.update()  # 更新屏幕显示内容

代码分析

这段代码实现了一个流星雨动画效果,利用Python的turtle库绘制流星,结合random库生成流星的随机参数,实现动态的流星雨效果。下面对代码进行详细分析。

1. 导入库和窗口设置

import turtle  # 导入turtle库,用于图形绘制
import random  # 导入random库,生成随机数
import math  # 导入math库,进行数学计算

代码首先导入了turtle库用于绘制图形、random库用于生成随机数和参数,math库用于数学计算。接下来进行窗口的设置:

turtle.setup(1.0, 1.0)  # 设置窗口大小为屏幕大小
turtle.title("流星雨动画")   # 设置窗口标题
turtle.bgcolor('black')  # 设置背景颜色为黑色

这里设置了窗口大小为全屏,背景颜色为黑色,且窗口标题为“流星雨动画”,营造夜空效果。

2. 创建画笔对象

t = turtle.Turtle()  # 创建一个画笔对象
t.hideturtle()  # 隐藏画笔,不显示画布的形状
t.pensize(1)    # 设置画笔的大小

Turtle类的实例t用于绘制流星。通过t.hideturtle()隐藏画笔,使绘制过程更流畅不受画笔形状影响。pensize(1)设置了画笔的粗细为1。

3. 流星的颜色

colors = ['gold', 'yellow', 'orange']  # 金色

定义了流星的颜色列表colors,包含了金色、黄色和橙色,以便后续随机选择,模拟流星燃烧时的颜色。

4. 定义流星类Meteor

class Meteor:
    def __init__(self):
        self.r = random.randint(50, 100)    # 随机生成流星的半径
        self.k = random.uniform(2, 4)   # 随机生成角度参数
        self.x = random.randint(-1000, 1000)  # 随机生成流星的x坐标
        self.y = random.randint(-500, 500)  # 随机生成流星的y坐标
        self.speed = random.randint(5, 10)  # 随机生成流星的移动速度
        self.color = random.choice(colors)  # 随机选择流星的颜色

Meteor类用于定义每个流星的属性和行为。初始化方法__init__()随机生成每颗流星的初始参数:

  • r:流星的半径,控制其大小,范围为50到100。
  • k:角度参数,随机选取的角度用于流星轨迹的倾斜。
  • xy:流星的起始位置坐标,范围为屏幕的水平和垂直方向上适合的区间。
  • speed:流星的速度控制其下落和横向运动的速度,值为5到10之间。
  • color:随机选取流星颜色,使流星颜色丰富多样。

5. meteor方法:绘制流星

def meteor(self):
    t.penup()
    t.goto(self.x, self.y)
    t.pendown()
    t.begin_fill()
    t.fillcolor(self.color)
    t.setheading(-30)  # 设置流星的朝向
    t.right(self.k)
    t.forward(self.r)
    t.left(self.k)
    t.circle(self.r * math.sin(math.radians(self.k)), 180)
    t.left(self.k)
    t.forward(self.r)
    t.end_fill()

该方法绘制每个流星的形状和轨迹:

  • penup()goto(self.x, self.y):移动到流星的位置。
  • pendown():开始绘制。
  • begin_fill()fillcolor(self.color):设置填充颜色和开启填充模式。
  • setheading(-30):设置流星朝向的角度,模拟流星在天空中的倾斜。
  • right(self.k)left(self.k):根据随机角度参数k进行左右旋转,增加轨迹的多样性。
  • forward(self.r):沿直线前进,使流星呈现一个尾巴效果。
  • circle():绘制半圆弧形。
  • end_fill():结束填充,形成完整流星形状。

6. move方法:流星的运动

def move(self):
    if self.y >= -500:
        self.y -= self.speed  # 将画笔向下移动
        self.x += 2 * self.speed  # 向右移动
    else:
        self.r = random.randint(50, 100)
        self.k = random.uniform(2, 4)
        self.x = random.randint(-2000, 1000)
        self.y = 500
        self.speed = random.randint(5, 10)
        self.color = random.choice(colors)

该方法更新流星的位置,形成连续下落的动态效果。条件判断if self.y >= -500控制流星的位置更新,避免流星超出屏幕范围。

  • self.y -= self.speedself.x += 2 * self.speed:分别使流星向下和向右移动,模拟流星运动。
  • 否则,表示流星已出界,将其属性随机重置,使其从屏幕顶部重新出现。

7. 创建流星对象列表

Meteors = []
for i in range(100):
    Meteors.append(Meteor())

通过循环创建100个流星对象并存储在列表Meteors中,以便在后续的动画循环中调用,形成流星雨效果。

8. 动画循环

while True:
    turtle.tracer(0)  # 关闭tracer,提高性能
    t.clear()  # 清除画布内容
    for i in range(100):
        Meteors[i].move()  # 更新每颗流星的位置
        Meteors[i].meteor()  # 重新绘制每颗流星
    turtle.update()  # 更新屏幕显示内容

动画的主要逻辑在while True循环中实现:

  • turtle.tracer(0):关闭追踪,减少动画刷新,提高效率。
  • t.clear():每次循环清空画布,避免重影。
  • 循环遍历Meteors列表,调用movemeteor方法分别更新和绘制每颗流星的位置。
  • turtle.update():刷新屏幕,显示最新的流星位置和形状。

总结

该代码通过Meteor类定义了流星的随机属性、绘制方式和运动逻辑,利用turtle的动画特性生成了流星雨效果。每颗流星都有独立的颜色、尺寸和轨迹,使流星雨动画生动,营造出动态的夜空氛围。

写在后面

我是一只有趣的兔子,感谢你的喜欢!


http://www.kler.cn/a/369129.html

相关文章:

  • CSS 常见选择器
  • 【含开题报告+文档+PPT+源码】基于SpringBoot的健康知识学习分享平台的设计与实现
  • 编程小白如何成为大神
  • Python | Leetcode Python题解之第516题最长回文子序列
  • Java全栈经典面试题剖析8】JavaSE高级 -- 线程同步、 线程通信、死锁、线程池
  • LLM | 论文精读 | NeurIPS 2023 | SWIFTSAGE: 结合快思考与慢思考的生成智能体
  • 部署RocketMQ, 其实很简单 (带图, 附启动命令)
  • 视频智能分析平台LiteAIServer摄像机视频分析软件下载检测裸土
  • 易基因:Nat Commun:ATAC-seq等揭示恒河猴大脑高分辨率解剖区域的转录组和开放染色质图谱
  • 装饰器模式的适用场景示例
  • Django+Vue全栈开发项目入门(一)
  • 可以为服务器配置动态IP吗?
  • Redis 单机、主从、哨兵和集群架构详解和搭建
  • 口碑最好的开放式耳机有哪些?开放式蓝牙耳机排行榜盘点!
  • 【MySQL】视图与用户管理——MySQL
  • 华为交换机堆叠
  • 情感咨询小程序的市场需求大吗?
  • 公域电商云分账系统:资金流转的智慧
  • Linux: Shell编程中的应用之基于sh脚本生成网页
  • windows查端口是哪个进程开的
  • 关于SpringMVC项目
  • vue 解决:npm ERR! code ERESOLVE 及 npm ERR! ERESOLVE could not resolve 的方案
  • 谷歌仓库管理工具repo
  • 基于Matlab 疲劳检测系统
  • 一个临床数据收集/调查问卷APP模板(streamlit+MongoDB)
  • django celery 定时任务 Crontab 计划格式