环境需求
- python3.11.4
- PyCharm Community Edition 2023.2.5
源码如下:
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(20, 80) # 随机生成流星的半径
self.k = random.uniform(4, 6) # 随机生成角度参数
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(2, 7) # 重新设置流星的速度
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
库来模拟流星雨动画的小程序。通过创建一个名为Meteor
的类,该程序能够生成具有随机属性(如大小、颜色、位置和速度)的流星,并让它们在屏幕上移动,从而营造出流星雨的效果。下面是对代码主要部分的分析:
- 环境设置:首先设置了绘图窗口的背景为黑色,并调整了窗口大小以适应屏幕尺寸。此外还定义了画笔的基本属性,比如隐藏画笔形状、设定画笔宽度等。
- 流星类的设计
__init__()
方法初始化每个流星实例时,会随机分配给它不同的属性值,包括半径、角度参数、坐标位置、速度以及颜色。meteor()
方法负责绘制单个流星。它先将画笔移动到指定位置,然后根据计算好的路径绘制出带有尾迹效果的流星形状。move()
方法更新流星的位置。如果一颗流星完全移出了屏幕底部,则会重置其所有属性,使其从屏幕顶部重新开始下落。
- 动画循环:在无限循环中,不断清除旧的图像并调用每颗流星的
move()
和meteor()
方法来更新它们的位置及外观。通过关闭跟踪功能并批量处理后一次性更新显示内容,可以有效地提高渲染效率。
欢迎大家体验、试用阿里云百炼大模型和阿里云服务产品,链接如下:
阿里云百炼大模型
https://bailian.console.aliyun.com/
通义灵码_智能编码助手面向用户上线个人和企业版产品
https://tongyi.aliyun.com/lingma/pricing?userCode=jl9als0w
云工开物_阿里云高校计划助力高校科研与教育加速。
https://university.aliyun.com/mobile?userCode=jl9als0w
无影云电脑个人版简单易用、安全高效的云上桌面服务
https://www.aliyun.com/product/wuying/gws/personal_edition?userCode=jl9als0w
云服务器ECS省钱攻略五种权益,限时发放,不容错过
https://www.aliyun.com/daily-act/ecs/ecs_trial_benefits?userCode=jl9als0w