用 Python 模拟下雨效果

用 Python 模拟下雨效果

雨天别有一番浪漫情怀:淅淅沥沥的雨滴、湿润的空气、朦胧的光影……在屏幕上也能感受下雨的美妙。本文将带你用一份简单的 Python 脚本,手把手实现「下雨效果」动画。文章深入浅出,零基础也能快速上手,完整代码仅需一个脚本文件即可运行。
在这里插入图片描述


目录

  1. 前言
  2. 环境准备
  3. 雨滴模拟原理
  4. 实现思路
  5. 完整脚本讲解
  6. 完整脚本代码
  7. 运行效果
  8. 拓展思考
  9. 结语

前言

在图形编程中,常见的视觉特效之一就是雨滴下落动画。无论是游戏背景、界面装饰,还是演示特效,模拟下雨都能增添生动氛围。本示例使用 Python 结合 Pygame 库,在窗口中绘制无数条雨线,并让它们以不同速度、位置、长度滑落,形成自然的雨幕效果。整个过程非常直观,适合刚接触 Python GUI 或图形编程的新手。


环境准备

  • Python 版本:建议 3.6 及以上
  • 依赖库:Pygame

在命令行中执行:

pip install pygame

若出现安装问题,可尝试升级 pip:

pip install --upgrade pip

雨滴模拟原理

要模拟下雨效果,核心思想是:

  1. 雨滴属性

    • 位置 (x, y):雨滴当前坐标。
    • 长度 length:模拟不同距离或速度导致的雨滴长短差异。
    • 速度 speed:决定雨滴下落的快慢,可与 length 相关。
  2. 下落逻辑

    • 每帧 (frame) 更新时,让 y += speed
    • y 超出窗口底部,高度加上 length 后重置到顶部(y = -length),并随机生成新的 xlengthspeed
  3. 绘制方法

    • 在 Pygame 窗口中,用 draw.line() 绘制一条短线来代表雨滴。
    • 背景每帧需重绘为深色,以清除上一帧的残影。

实现思路

  1. 初始化

    • 导入模块、初始化 Pygame,设置窗口宽高与帧率 (FPS)。
  2. 创建雨滴列表

    • 根据需求生成多个 Raindrop 实例,存放于列表中。
  3. 主循环

    • 处理退出事件。
    • 填充背景色。
    • 遍历雨滴列表,更新位置并绘制。
    • 刷新显示并控制帧率。
  4. 优雅退出

    • 当检测到窗口关闭事件,退出循环并调用 pygame.quit()

完整脚本讲解

下面逐段讲解脚本中关键部分。

import pygame, random, sys
  • pygame:图形窗口与绘图操作。
  • random:生成随机位置与属性。
  • sys:退出程序使用。
class Raindrop:def __init__(self, screen_width, screen_height):self.screen_width  = screen_widthself.screen_height = screen_heightself.reset()
  • Raindrop 类用于封装单个雨滴。传入屏幕尺寸以便重置时随机生成坐标。
    def reset(self):self.x      = random.randint(0, self.screen_width)self.y      = random.randint(-self.screen_height, 0)self.length = random.randint(5, 15)self.speed  = random.uniform(4, 10) * (self.length / 10)
  • reset() 随机分配 xylengthspeed
  • y[-screen_height, 0] 范围随机初始,保证雨幕一开始就满屏。
  • 速度与长度挂钩,长雨滴下落更快,增强透视感。
    def fall(self):self.y += self.speedif self.y > self.screen_height:self.reset()
  • fall() 更新 y 坐标,若超出底部则重置回顶部。
    def draw(self, surface):end_y = self.y + self.lengthpygame.draw.line(surface, (180, 180, 255), (self.x, self.y), (self.x, end_y), 1)
  • 用浅蓝色 (180,180,255) 绘制细线代表雨滴。

接着是主程序部分,负责窗口创建、循环与事件处理。


完整脚本代码

请将以下代码保存为 rain.py,然后在命令行执行 python rain.py 即可查看下雨效果。

import pygame, random, sysclass Raindrop:def __init__(self, screen_width, screen_height):self.screen_width  = screen_widthself.screen_height = screen_heightself.reset()def reset(self):self.x      = random.randint(0, self.screen_width)self.y      = random.randint(-self.screen_height, 0)self.length = random.randint(5, 15)self.speed  = random.uniform(4, 10) * (self.length / 10)def fall(self):self.y += self.speedif self.y > self.screen_height:self.reset()def draw(self, surface):end_y = self.y + self.lengthpygame.draw.line(surface, (180, 180, 255), (self.x, self.y), (self.x, end_y), 1)def main():pygame.init()screen_width, screen_height = 800, 600screen = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption("Python 雨滴模拟")clock = pygame.time.Clock()# 初始化雨滴raindrops = [Raindrop(screen_width, screen_height) for _ in range(300)]# 主循环running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 填充背景screen.fill((10, 10, 30))# 更新并绘制每个雨滴for drop in raindrops:drop.fall()drop.draw(screen)# 刷新显示pygame.display.flip()clock.tick(60)pygame.quit()sys.exit()if __name__ == "__main__":main()

运行效果

运行后,你将看到一个 800×600 的深色窗口,无数细细的浅蓝色雨滴以不同速度从顶部滑落,形成层次分明的雨幕。若想更贴近真实,可以:

  • 调整颜色:将 (180,180,255) 改为其他色值。
  • 改变雨滴数量:修改 raindrops 列表长度(300 可增可减)。
  • 添加风向:在 fall() 中改变 x 坐标,模拟风吹雨打效果。

拓展思考

  1. 视差效果
    将雨滴分为「前景」「中景」「远景」三组,分别使用不同速度、颜色与透明度,营造深度感。
  2. 撞击水面
    当雨滴落到预设的“地面”高度,可在底部绘制一圈淡淡的水花动画。
  3. 粒子系统
    为水花使用粒子系统,让每个水花粒子具有衰减、弹跳特性,更真实。

结语

本文以最简单的 Pygame 用例,向你展示如何在 Python 中模拟下雨特效。核心思路就是不断重置和重绘雨滴坐标,通过随机属性让画面更具丰富性。动手运行一下,相信你会对图形编程更加感兴趣。后续可以在此基础上加入更多效果,打造属于自己的雨天场景。祝学习愉快!

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

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

相关文章

纯数据挖掘也能发Microbiome?

抗生素滥用导致多重耐药微生物在全球蔓延,但新型抗生素的研发进展缓慢,亟需找到替代抗生素的新型防御策略。抗菌肽(AMPs)作为天然防御分子,具有低耐药潜力和广谱活性。德国小蠊(Blattella germanica&#x…

动态内容加载时,爬虫应如何处理?

处理动态内容加载是爬虫开发中的一个常见挑战。许多现代网站使用 JavaScript 动态加载内容,这意味着页面的某些部分可能在初始加载时并不存在,而是通过后续的 AJAX 请求或 JavaScript 执行动态生成的。为了处理这种情况,爬虫需要能够模拟浏览…

uni-app 安卓消失的字符去哪里了?maxLength失效了!

前情提要 皮一下~这个标题我还蛮喜欢的嘿嘿嘿【附上一个自行思考的猥琐的笑容】 前段时间不是在开发uni-app的一个小应用嘛,然后今天测试发现,有一个地方在苹果是没有问题的,但是在安卓上出现了问题,附上安卓的截图 在这里我是有限制maxLength=50的,而且,赋值字符串到字…

2025年5月蓝桥杯stema省赛真题——象棋移动

上方题目可点下方去处,支持在线编程~ 象棋移动_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点下方,支持源码和素材获取~ 象棋移动-scratch作品-少儿编程题库学习中心-嗨信奥 题库收集了历届各白名单赛事真题和权威机构考级…

Cesium 实战 26 - 自定义纹理材质 - 实际应用之飞线(抛物线)

Cesium 实战 26 - 自定义纹理材质 - 实际应用之飞线(抛物线) 前言核心代码完整代码在线示例前言 之前总结了项目实战用常用的自定义纹理材质,包括扩散、预警、动态线等,后续还会不定期增加一些效果。 除了单个的自定义纹理材质介绍,文章系列后期会增加一些实际项目应用、…

Apache Airflow

目录 Apache Airflow是什么 CVE-2020-11978(Airflow 示例dag中的命令注入) CVE-2020-11981(Airflow Celery消息中间件命令执行) CVE-2020-17526(Airflow 默认密钥导致的权限绕过) Apache Airflow是什么 Airflow是一个以编程方式编写,安排和监视工作流的平台。 …

【Python Cookbook】迭代器与生成器(四)

目录 案例 目录 案例 迭代器与生成器(一)1.手动遍历迭代器2.代理迭代3.使用生成器创建新的迭代模式4.实现迭代器协议迭代器与生成器(三)9.排列组合的迭代10.序列上索引值迭代11.同时迭代多个序列12.不同集合上元素的迭代迭代器与生…

React 播客专栏 Vol.16|useRef 和 useMemo 是干嘛的?

👋 欢迎回到《前端达人 React 播客书单》第 16 期(正文内容为学习笔记摘要,音频内容是详细的解读,方便你理解),请点击下方收听 视频版 🎙 欢迎来到《前端达人 播客书单》第 16 期。 今天我们来…

漫谈英伟达GPU架构进化史:从Celsius到Blackwell

在英伟达官网,我们可以清晰地看到其从1999年Celsius到2024年Blackwell的20+代架构演进。这一历程犹如一部波澜壮阔的科技史诗,见证了英伟达在GPU领域的卓越创新与持续引领。 NVIDIA GPU架构变迁路线: 年份 NV GPU架构变迁 2025 Blackwell 2.0 2024 Blackwell 2023-2024 Hopp…

车载通信网络 --- CAN FD与CAN XL

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

DM达梦数据库开启SQL日志记录功能

DM达梦数据库开启SQL日志记录功能 配置SQL日志(非必须的配置步骤,与主备集群配置无关,如果没有需求可以跳过配置SQL日志) sqllog.ini 配置文件用于SQL日志的配置,当且仅当 INI(dm.ini) 参数 SV…

【HW系列】—C2远控服务器(webshell链接工具, metasploit、cobaltstrike)的漏洞特征流量特征

文章目录 蚁剑、冰蝎、哥斯拉一、蚁剑(AntSword)流量特征二、冰蝎(Behinder)流量特征三、哥斯拉(Godzilla)流量特征 metasploit、cobaltstrike一、Metasploit流量特征二、CobaltStrike流量特征三、检测与防…

手机平板等设备租赁行业MDM方案解析

目录 引言:MDM 在租赁行业的重要性日益凸显 用户场景:租赁公司面临的主要挑战 1. 设备丢失、逾期未还 2. 手动配置和恢复效率低 3. 非授权使用频繁 4. 时区设置混乱影响运维 5. 缺乏实时监管能力 EasyControl MDM:租赁设备的远程管控…

前端面试核心考点全解析

前端面试常见问题及解析大纲 核心技术篇 HTML相关问题 1. HTML5新特性解析 语义化标签&#xff08;<header>、<section>等&#xff09;的作用与示例本地存储&#xff08;localStorage与sessionStorage&#xff09;的差异 localStorage.setItem(key, value); c…

Selenium 测试框架 - Kotlin

🚀Selenium Kotlin 实践指南:以百度搜索为例的完整测试示例 随着测试自动化的普及,Selenium 已成为 Web 自动化测试的事实标准,而 Kotlin 凭借其简洁语法和高安全性,越来越受到开发者欢迎。本指南将通过一个完整的实战案例——在百度中执行搜索操作,来展示如何使用 Sele…

vscode调试stm32,Cortex Debug的配置文件lanuch.json如何写,日志

https://blog.csdn.net/jiladahe1997/article/details/122046665 https://discuss.em-ide.com/blog/67-cortex-debug 第一版 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?li…

反范式设计应用场景解析

反范式设计应用场景解析 1. 反范式设计核心概念 反范式设计是指为了特定性能优化目标,在数据库设计中故意违反关系数据库的范式规则(通常是第三范式或BC范式),通过引入冗余数据或合并表结构来提升查询效率的设计方法。 关键结论:反范式不是对范式理论的否定,而是在特定…

算法-js-子集

题&#xff1a;给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 方法一&#xff1a;迭代法 核心逻辑&#xff1a;动态扩展子集&#xff0c; 小规…

python里的NumPy算法

NumPy&#xff08;Numerical Python&#xff09;是 Python 中用于科学计算的基础库&#xff0c;提供了高性能的多维数组对象、矩阵运算以及大量数学函数库。其核心优势在于通过向量化操作替代传统循环&#xff0c;大幅提升计算效率&#xff0c;尤其适合处理大规模数据的算法实现…

HarmonyOS优化应用文件上传下载慢问题性能优化

一、概述 在开发应用时&#xff0c;客户端与服务器之间数据交换的效率取决于文件传输的性能。一个数据交换性能较低的应用会导致其在加载过程中耗费较长时间&#xff0c;在很多的场景造成页面卡顿&#xff0c;极大的影响了用户体验。相反&#xff0c;一个数据交换高效的应用&a…