用 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
繁體地址,請注明出處:http://hk.pswp.cn/news/907458.shtml
英文地址,請注明出處:http://en.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…