程式設計師式浪漫:Python 帶你看雪啦!
暖爐溫酒配羊湯——今年冬至,你看雪了嗎?
作者 | Ahab
責編 | 仲培藝
前段時間筆者寫了一篇題為《用 Python 來一場人工造雪》的文章,但大家似乎都不滿足僅僅是一個圖片的雪花,都想來一場動態的人工降雪。於是便有了下面的內容:
動態視訊連結:https://v.qq.com/x/page/q1354od8qni.html?start=12
一、具體介紹
動態版的實現主要是依靠 pygame 這個模組,從繪製到實現動態移動,最初的想法是按照飛機大戰的思路把飛機替換成上次繪製的科赫雪花,自己試了試效果很差就是一張張圖片在螢幕上亂飛,通過百度發現 pygame.draw 模組,跟 turtle 差不多。當然還是少不了 random,自己做過的
二、程式碼實現
因為使用 pygame 第一步要做的就是初始化:
import pygame
import random
#初始化
pygame.init()
載入背景圖同時根據背景圖的大小設定螢幕長寬:
SIZE = (1000, 500) screen = pygame.display.set_mode(SIZE) pygame.display.set_caption("下雪了") #載入點陣圖 background = pygame.image.load('snow.jpg')
接下來我們要定義一個雪花列表,且初始化雪花,這裡需要使用 random 隨機數設定 xy 軸的座標和速度。
random.randrange
random.randrange([start],stop[, step]):從指定範圍內,按指定基數遞增的集合中獲取一個隨機數。
random.randint(a,b):用於生成一個指定範圍內的整數。其中引數a是下限,引數b是上限,生成的隨機數n:a<=n<=b。
# 定義一個雪花列表 snow = [] # 初始化雪花 for i in range(300): x = random.randrange(0, SIZE[0]) y = random.randrange(0, SIZE[1]) speedx = random.randint(-1, 2) speedy = random.randint(3,8) snow.append([x, y, speedx, speedy])
做過飛機大戰或者熟悉pygame的朋友應該知道接下來要做的就是設定遊戲迴圈,同時還將之前載入的背景圖進行了繪製。
Surface物件有一個名為blit()的方法,它可以繪製點陣圖
screen.blit(space, (0,0))
第一個引數是載入完成的點陣圖,第二個引數是繪製的起始座標。
done = False
while not done:
# 訊息事件迴圈,判斷退出
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
#繪製點陣圖
screen.blit(background, (0,0))
這一步是最重要的繪製雪花和設定雪花列表的迴圈。
繪製雪花使用的是pygame.draw 模組,此模組用於在Surface上繪製一些簡單的圖形,比如點、直線、矩形、圓、弧等。我們繪製雪花用到的是:
pygame.draw.circle
原型:pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect
用途:用於繪製圓形。第三個引數pos是圓心的位置座標,radius指定了圓的半徑。
width引數表示線條(畫筆)的寬度,如果該值設定為0,則表示填充整個圖形,我們的繪製的雪花就是使用填充白色。顏色引數通常是一個RGB三元組(R, G, B)。
雪花列表迴圈主要取決於雪花列表的長度,同樣設定了移動雪花的位置,程式中還做了一個判定雪花從頂端向下移動時如果落出螢幕,將會重設位置。
# 雪花列表迴圈
for i in range(len(snow)):
# 繪製雪花,顏色、位置、大小
pygame.draw.circle(screen, (255, 255, 255), snow[i][:2], snow[i][3])
# 移動雪花位置(下一次迴圈起效)
snow[i][0] += snow[i][2]
snow[i][1] += snow[i][3]
# 如果雪花落出螢幕,重設位置
if snow[i][1] > SIZE[1]:
snow[i][1] = random.randrange(-50, -10)
snow[i][0] = random.randrange(0, SIZE[0])
到這程式基本就寫完了,只需要新增重新整理螢幕的時間和遊戲退出語句就完事了。
pygame.display.flip()
clock.tick(20)
pygame.quit()
最後感謝【唐僧不愛八戒】提供 pygame.draw 這個思路
熱 文 推 薦
☞ 求求你,下次面試別再問我什麼是 Spring AOP 和代理了!
☞ 劉強東無罪!