用Python实现黑客帝国代码雨效果
生活随笔
收集整理的這篇文章主要介紹了
用Python实现黑客帝国代码雨效果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文 |?野客
來源:Python 技術「ID: pythonall」
說起黑客帝國,相信大家即使沒看過系列影片也應該會聽過這個名字,該系列最新一部是 2003 年上映的,距現在已經有 10 幾年了,如果大家看過影片的話,應該會對里面的數字雨有印象。
如果你沒看過影片不了解數字雨是什么樣的也沒關系,我放一張圖你就知道了。
就是上圖那個樣子,本文我們就使用 Python 來實現這個效果,當然這個不局限于數字,也可以是字母、圖形等。
數字雨
代碼的實現還是比較簡單,基本就是使用 pygame 庫創建窗口,再定義數字的生成并讓其不斷的在窗口上面顯示,代碼實現如下所示:
import random, pygameFONT_PX = 15 pygame.init() winSur = pygame.display.set_mode((500, 600)) font = pygame.font.SysFont('fangsong', 20) bg_suface = pygame.Surface((500, 600), flags=pygame.SRCALPHA) pygame.Surface.convert(bg_suface) bg_suface.fill(pygame.Color(0, 0, 0, 13)) winSur.fill((0, 0, 0)) # 數字 texts = [font.render(str(i), True, (0, 255, 0)) for i in range(10)] colums = int(500 / FONT_PX) drops = [0 for i in range(colums)] while True:for event in pygame.event.get():if event.type == pygame.QUIT:exit()pygame.time.delay(33)winSur.blit(bg_suface, (0, 0))for i in range(len(drops)):text = random.choice(texts)winSur.blit(text, (i * FONT_PX, drops[i] * FONT_PX))drops[i] += 1if drops[i] * 10 > 600 or random.random() > 0.95:drops[i] = 0pygame.display.flip()我們來看一下實現效果:
是不是有內味了。
字母雨
我們要實現的字母雨和數字雨的實現基本差不多,主要就是把數字換成了字母,代碼實現如下所示:
import random, pygamePANEL_width = 400 PANEL_highly = 500 FONT_PX = 15 pygame.init() # 創建一個窗口 winSur = pygame.display.set_mode((PANEL_width, PANEL_highly)) font = pygame.font.SysFont('123.ttf', 22) bg_suface = pygame.Surface((PANEL_width, PANEL_highly), flags=pygame.SRCALPHA) pygame.Surface.convert(bg_suface) bg_suface.fill(pygame.Color(0, 0, 0, 28)) winSur.fill((0, 0, 0)) letter = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c','v', 'b', 'n', 'm'] texts = [font.render(str(letter[i]), True, (0, 255, 0)) for i in range(26) ] # 按窗口的寬度來計算可以在畫板上放幾列坐標并生成一個列表 column = int(PANEL_width / FONT_PX) drops = [0 for i in range(column)] while True:# 從隊列中獲取事件for event in pygame.event.get():if event.type == pygame.QUIT:exit()elif event.type == pygame.KEYDOWN:chang = pygame.key.get_pressed()if (chang[32]):exit()# 暫停給定的毫秒數pygame.time.delay(30)# 重新編輯圖像winSur.blit(bg_suface, (0, 0))for i in range(len(drops)):text = random.choice(texts)# 重新編輯每個坐標點的圖像winSur.blit(text, (i * FONT_PX, drops[i] * FONT_PX))drops[i] += 1if drops[i] * 10 > PANEL_highly or random.random() > 0.95:drops[i] = 0pygame.display.flip()我們來看一下實現效果:
圖形雨
除了數字和字母,我們還可以使用圖片,圖片我們就用福字吧,上面我們是利用 pygame 庫來創建窗口的,這次我們使用 tkinter 庫,來看一下具體實現代碼:
from tkinter import * import random, threading, time, os# 初始雨滴縱坐標 INIT_HEIGHT = 1 # 雨滴創建 def rainmake(canvas, imagefile):rainlist = []for i in range(5):# 根據圖片,創建一排福字rainlist.append(canvas.create_image(100 + 80 * i, INIT_HEIGHT, anchor=NE, image=imagefile))return rainlist# 雨滴下落 def raindown(tk, canvas, imagefile, sec):# 線程間等待time.sleep(sec)rainlist = rainmake(canvas, imagefile)# 每個福字的縱坐標值height = [INIT_HEIGHT] * 10while True:# 每次移動前稍等一會time.sleep(0.2)# 5 個福字一起移動for i in range(5):# 如果福字到底了,則不繼續移動if not height[i] == 0:# 設置下落步調rnd = random.randint(5, 50)canvas.move(rainlist[i], 0, rnd)height[i] = height[i] + rndtk.update()for i,h in enumerate(height):if h > 400:# 當福字走到最下方,則刪除canvas.delete(rainlist[i])tk.update()# 清空該福的 heightheight[i] = 0print(i,h,height)# 全到底,則跳出循環if height == [0] * 5:print('break:',threading.current_thread().name)breakdef lookloop(tk, canvas, thread):aliveflg = Falsewhile True:# 5s 檢測一次time.sleep(5)for th in thread:if th.is_alive():aliveflg = Trueelse:aliveflg = Falseif aliveflg == False:breakcanvas.create_text(100 , 200, text='雨停了...', fill='red')canvas.pack()time.sleep(5)tk.destroy()def main():# 創建窗口對象tk = Tk()tk.title('送福雨')canvas_style = {'bg':'white','height':'500','width':'410','cursor':'circle'}# 創建畫布canvas = Canvas(tk,canvas_style)canvas.pack()# 圖片素材if not os.path.exists('pic.gif'):raise Exception('pic.gif file does not exists.')imagefile = PhotoImage(file = 'pic.gif')thread = []for i in range(100):thread.append(threading.Thread(target=raindown, args=(tk, canvas, imagefile, i)))for t in thread:t.start()# 新開一個線程監控運行中的線程threading.Thread(target=lookloop, args=(tk, canvas, thread)).start()# 進入消息循環tk.mainloop()我們來看一下實現效果:
總結
以上是生活随笔為你收集整理的用Python实现黑客帝国代码雨效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB简介与基础知识
- 下一篇: fataexception matlab