黑客帝国中代码雨如何实现?用 Python 就可以!
生活随笔
收集整理的這篇文章主要介紹了
黑客帝国中代码雨如何实现?用 Python 就可以!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說起電影《黑客帝國》,相信大部分人都看過或聽說過,影片中有一個場景數字雨,如果你看過電影的話,應該對這個經典場景印象深刻,本文我們利用 Python 以數字、字母、圖片三種形式來實現這一效果。
1. 數字
首先,我們來實現數字雨,我們需要創建一個窗口來顯示內容,窗口的創建使用 pygame 庫,代碼實現如下:
FONT_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()實現效果如下:
2. 字母
接著,我們再來實現字母雨,實現方式基本就是將上面實現數字雨的數字換成字母,代碼實現如下:
PANEL_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()實現效果如下:
3. 圖片
最后,我們使用圖片來實現這一效果,圖片我們就使用雨滴吧,這里我們使用 tkinter 創建窗口,代碼實現如下:
# 初始雨滴縱坐標 INIT_HEIGHT = 10 # 雨滴創建 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()實現效果如下:
源碼在公眾號 Python小二 后臺回復 200513 獲取。
本文非首發于個人號
總結
以上是生活随笔為你收集整理的黑客帝国中代码雨如何实现?用 Python 就可以!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 出生就遇浏览器大战,亲爹还不爱,命运坎坷
- 下一篇: 计算机网络高校校园网设计思路,网络工程设