1. 程式人生 > >程序員式浪漫:Python 帶你看雪啦

程序員式浪漫:Python 帶你看雪啦

語句 滿足 範圍 動態 加載 的人 根據 http 技術分享

前段時間筆者寫了一篇題為《用 Python 來一場人工造雪》的文章,但大家似乎都不滿足僅僅是一個圖片的雪花,都想來一場動態的人工降雪。於是便有了下面的內容:

具體介紹

動態版的實現主要是依靠 pygame 這個模塊,從繪制到實現動態移動,最初的想法是按照飛機大戰的思路把飛機替換成上次繪制的科赫雪花,自己試了試效果很差就是一張張圖片在屏幕上亂飛,通過百度發現 pygame.draw 模塊,跟 turtle 差不多。當然還是少不了 random,自己做過的

Python 面試題【BAT版】(02)

中 random 算是常客,學習的時候覺得就是一個隨機數生成而已,最近慢慢接觸才發現 randmo 的強大,怪不得成為公司面試的必考題。

代碼實現

因為使用 pygame 第一步要做的就是初始化:

1import pygame
2import random
3#初始化
4pygame.init()

加載背景圖同時根據背景圖的大小設置屏幕長寬:

1SIZE = (1000, 500)
2screen = pygame.display.set_mode(SIZE)
3pygame.display.set_caption("下雪了")
4#加載位圖
5background = pygame.image.load(‘snow.jpg‘)

接下來我們要定義一個雪花列表,且初始化雪花,這裏需要使用 random 隨機數設置 xy 軸的坐標和速度。

random.randrange

random.randrange([start],stop[, step]):從指定範圍內,按指定基數遞增的集合中獲取一個隨機數。

random.randint(a,b):用於生成一個指定範圍內的整數。其中參數a是下限,參數b是上限,生成的隨機數n:a<=n<=b。

1# 定義一個雪花列表
2snow = []
3# 初始化雪花
4for i in range(300):
5 x = random.randrange(0, SIZE[0])
6 y = random.randrange(0, SIZE[1])
7 speedx = random.randint(-1, 2)
8 speedy = random.randint(3,8)
9 snow.append([x, y, speedx, speedy])

做過飛機大戰或者熟悉pygame的朋友應該知道接下來要做的就是設置遊戲循環,同時還將之前加載的背景圖進行了繪制。

Surface對象有一個名為blit()的方法,它可以繪制位圖

screen.blit(space, (0,0))

第一個參數是加載完成的位圖,第二個參數是繪制的起始坐標。

1done = False
2while not done:
3 # 消息事件循環,判斷退出
4 for event in pygame.event.get():
5 if event.type == pygame.QUIT:
6 done = True
7 #繪制位圖
8 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)。

雪花列表循環主要取決於雪花列表的長度,同樣設置了移動雪花的位置,程序中還做了一個判定雪花從頂端向下移動時如果落出屏幕,將會重設位置。

 1 # 雪花列表循環
2 for i in range(len(snow)):
3 # 繪制雪花,顏色、位置、大小
4 pygame.draw.circle(screen, (255, 255, 255), snow[i][:2], snow[i][3])
5
6 # 移動雪花位置(下一次循環起效)
7 snow[i][0] += snow[i][2]
8 snow[i][1] += snow[i][3]
9
10 # 如果雪花落出屏幕,重設位置
11 if snow[i][1] > SIZE[1]:
12 snow[i][1] = random.randrange(-50, -10)
13 snow[i][0] = random.randrange(0, SIZE[0])

到這程序基本就寫完了,只需要添加刷新屏幕的時間和遊戲退出語句就完事了。

1 pygame.display.flip()
2 clock.tick(20)
3
4pygame.quit()
技術分享圖片

程序員式浪漫:Python 帶你看雪啦