用Python繪制夢幻星空

用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.1def twinkle(self):self.brightness += self.speedif self.brightness > 1.0 or self.brightness < 0.0:self.speed = -self.speedself.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 = 0self.speed = random.randint(5, 15)self.length = random.randint(20, 50)self.active = Truedef move(self):if not self.active:if random.random() < 0.01:  # 1%的概率生成新流星self.reset()returnself.x += self.speedself.y += self.speedif self.x > WIDTH or self.y > HEIGHT:self.active = Falsereturn# 繪制流星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 // 4self.y = HEIGHT // 4self.radius = 40def 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 = Trueclock = 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.pswp.cn/pingmian/81415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81415.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch循環神經網絡(Pytotch)

文章目錄 循環神經網絡&#xff08;RNN&#xff09;簡單的循環神經網絡長短期記憶網絡&#xff08;LSTM&#xff09;門控循環單元&#xff08;GRU&#xff09; 循環神經網絡&#xff08;RNN&#xff09; 循環神經網絡&#xff08;RecurrentNeuralNetwork&#xff0c;RNN&#…

用算術右移實現邏輯右移及用邏輯右移實現算術右移

函數srl()用算術右移實現邏輯右移&#xff0c;函數sra()用邏輯右移實現算術右移。 程序代碼 int sra(int x,int k); unsigned int srl(unsigned int x, int k);void main() {int rx1,k,x1;unsigned int rx2,x2;k3;x10x8777;x20x8777;rx1sra(x1, k);rx2srl(x2, k);while(1); }…

pojo層、dao層、service層、controller層的作用

在Java Web開發中&#xff0c;常見的分層架構&#xff08;如Spring Boot項目&#xff09;通常包含POJO層、DAO層、Service層和Controller層&#xff0c;各層職責明確&#xff0c;協同工作。以下是各層的作用及相互關系&#xff1a; 1. POJO層&#xff08;Model/Entity層&#…

【Linux網絡】五種IO模型與阻塞IO

IO 在Linux網絡環境里&#xff0c;IO&#xff08;Input/Output&#xff09;指的是網絡數據在系統與外部網絡&#xff08;像其他設備、服務器或者客戶端&#xff09;之間進行傳輸的過程。 它是網絡編程和系統性能優化的核心內容。 IO &#xff1a;INPUT和OUTPUT&#xff08;站…

入門OpenTelemetry——應用自動埋點

埋點 什么是埋點 埋點&#xff0c;本質就是在你的應用程序里&#xff0c;在重要位置插入采集代碼&#xff0c;比如&#xff1a; 收集請求開始和結束的時間收集數據庫查詢時間收集函數調用鏈路信息收集異常信息 這些埋點數據&#xff08;Trace、Metrics、Logs&#xff09;被…

大數據場景下數據導出的架構演進與EasyExcel實戰方案

一、引言&#xff1a;數據導出的演進驅動力 在數字化時代&#xff0c;數據導出功能已成為企業數據服務的基礎能力。隨著數據規模從GB級向TB級甚至PB級發展&#xff0c;傳統導出方案面臨三大核心挑戰&#xff1a; ?數據規模爆炸?&#xff1a;單次導出數據量從萬級到億級的增長…

拓展運算符與數組解構賦值的區別

拓展運算符與數組解構賦值是ES6中用于處理數組的兩種不同的特性&#xff0c;它們有以下區別&#xff1a; 概念與作用 ? 拓展運算符&#xff1a;主要用于將數組展開成一系列獨立的元素&#xff0c;或者將多個數組合并為一個數組&#xff0c;以及在函數調用時將數組作為可變參…

2025年全國青少年信息素養大賽初賽真題(算法創意實踐挑戰賽C++初中組:文末附答案)

2025年全國青少年信息素養大賽初賽真題(算法創意實踐挑戰賽C++初中組:文末附答案) 一、單項選擇題(每題 5 分) C++ 程序流程控制的基本結構不包括以下哪項? A. 分支結構 B. 數據結構 C. 循環結構 D. 順序結構 以下哪段代碼能將數組 int a[4] = {2, 4, 6, 8}; 的所有元素變…

計算機視覺與深度學習 | Python實現EMD-CNN-LSTM時間序列預測(完整源碼、數據、公式)

EMD-CNN-LSTM 1. 環境準備2. 數據生成(示例數據)3. EMD分解4. 數據預處理5. CNN-LSTM模型定義6. 模型訓練7. 預測與重構8. 性能評估核心公式說明1. 經驗模態分解(EMD)2. CNN-LSTM混合模型參數調優建議擴展方向典型輸出示例以下是使用Python實現EMD-CNN-LSTM時間序列預測的完…

React 19中useContext不需要Provider了。

文章目錄 前言一、React 19中useContext移除了Provider&#xff1f;二、使用步驟總結 前言 在 React 19 中&#xff0c;useContext 的使用方式有所更新。開發者現在可以直接使用 作為提供者&#xff0c;而不再需要使用 <Context.Provider>。這一變化簡化了代碼結構&…

單片機-STM32部分:14、SPI

飛書文檔https://x509p6c8to.feishu.cn/wiki/VYYnwOc9Zi6ibFk36lYcPQdRnlf 什么是SPI SPI 是英語Serial Peripheral interface的縮寫&#xff0c;顧名思義就是串行外圍設備接口。是Motorola(摩托羅拉)首先在其MC68HCXX系列處理器上定義的。 SPI&#xff0c;是一種高速的&…

Vue 3 動態 ref 的使用方式(表格)

一、問題描述 先給大家簡單介紹一下問題背景。我正在開發的項目中&#xff0c;有一個表格組件&#xff0c;其中一列是分鏡描述&#xff0c;需要支持視頻上傳功能。用戶可以為每一行的分鏡描述上傳對應的視頻示例。然而&#xff0c;在實現過程中&#xff0c;出現了一個嚴重的問…

構建 TypoView:一個富文本樣式預覽工具的全流程記錄

我正在參加CodeBuddy「首席試玩官」內容創作大賽&#xff0c;本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 在一次和 CodeBuddy 的日常交流中&#xff0c;我提出了一個構想&#xff1a;能不能幫我從零構建一個富文本樣式…

AI:OpenAI論壇分享—《AI重塑未來:技術、經濟與戰略》

AI&#xff1a;OpenAI論壇分享—《AI重塑未來&#xff1a;技術、經濟與戰略》 導讀&#xff1a;2025年4月24日&#xff0c;OpenAI論壇全面探討了 AI 的發展趨勢、技術范式、地緣政治影響以及對經濟和社會的廣泛影響。強調了 AI 的通用性、可擴展性和高級推理能力&#xff0c;以…

Bash fork 炸彈 —— :(){ :|: };:

&#x1f9e0; 什么是 Fork 炸彈&#xff1f; Fork 炸彈是一種拒絕服務&#xff08;DoS&#xff09;攻擊技術&#xff0c;利用操作系統的 fork() 系統調用不斷創建新進程&#xff0c;直到系統資源&#xff08;如進程表、CPU、內存&#xff09;被耗盡&#xff0c;從而使系統無法…

<前端小白> 前端網頁知識點總結

HTML 標簽 1. 標題標簽 h1到h6 2. 段落標簽 p 3. 換行 br 水平線 hr 4. 加粗 strong 傾斜 em 下劃線 ins 刪除 del 5. 圖像標簽 img src-圖像的位置 alt- 圖片加載失敗顯示的文字 替換文本 title--- 鼠標放到圖片上顯示的文字 提示…

tomcat查看狀態頁及調優信息

準備工作 先準備一臺已經安裝好tomcat的虛擬機&#xff0c;tomcat默認是狀態頁是默認被禁用的 1.添加授權用戶 vim /usr/local/tomcat/conf/tomcat-users.xml22 <role rolename"manager-gui"/>23 <user username"admin" password"tomcat&q…

.NET NativeAOT 指南

目錄 1. 引言 2. 什么是 .NET NativeAOT&#xff1f; 2.1 NativeAOT 的定義 2.2 NativeAOT 與傳統 JIT 的對比 2.3 NativeAOT 的適用場景 3. NativeAOT 的核心優勢 3.1 性能提升 3.2 簡化部署 3.3 更小的應用體積 3.4 知識產權保護 4. NativeAOT 的基本用法 4.1 環境…

產品周圍的幾面墻

不能把排序&#xff0c;當單選題做。 2025年的杭州咖啡館&#xff0c;味道最濃的不是咖啡&#xff0c;是聊各種項目和創業的卷味。 在過去幾年&#xff0c;聊項目的也不少&#xff0c;那時候帶著更加濃烈的自信和松弛感&#xff0c;不過今年略帶幾分忐忑和試探的口吻。 看到網…

例舉3種強制類型轉換和2種隱式

1. 強制類型轉換 強制類型轉換是指程序員顯式地將一個數據類型的值轉換為另一種數據類型。這種轉換通常是通過使用特定的函數或運算符來完成的。 常用的強制類型轉換方法&#xff1a; 使用Number()函數 let value "123"; let num Number(value); // 強制轉換為數字…