20192415 2020-2021-2 《Python程式設計》實驗4報告
20192415 2020-2021-2 《Python程式設計》實驗4報告
- 課程:《Python程式設計》
- 班級: 1924
- 姓名: 邢質斌
- 學號: 20192415
- 實驗教師:王志強
- 實驗日期:2021年6月20日
- 選修: 公選課
一.實驗內容
Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。
二. 實驗過程及結果
(一) 實驗分析與設計
該遊戲來源於Flappy Bird——一款鳥類飛行遊戲,通過一根手指操控按下小鳥上飛。
遊戲中主要有兩個物件:小鳥、柱,建立Brid類和Pillar類分別表示兩個物件。小鳥需要上下移動來躲避柱,在Brid類中建立一個bridUpdate()方法,實現小鳥的上下移動。為了體現小鳥向前飛行的特徵,需要讓柱一直向左側(後側)移動,這樣在畫面中就好像小鳥在向前(左側)飛行。因此在Pillar類中需要updatePillar()方法實現柱的移動。
此外,使用createMap()函式繪製地圖(背景與必要的文字說明);使用checkDead()函式判斷小鳥的生命狀態,是否發生碰撞,若碰撞則遊戲結束;使用getResult()函式獲取得分,成功飛越一對上下柱得一分。
(二) 實現過程
-
安裝Pygame
Pygame是一組跨平臺的Python模組, 用於建立視訊遊戲,現已已被用於數百種商業和開源遊戲。
python -m pip install pygame
-
建立並保持遊戲視窗
匯入pygame模組,呼叫init()方法初始化pygame模組。設定視窗的寬和高,使用display模組顯示窗體。
import sys import pygame pygame.init() # 初始化pygame size = width, height = 400, 650 # 設定視窗大小,寬400,高650 screen = pygame.display.set_mode() # 顯示視窗
完成上述步驟後,得到一個“出現後一閃而過的黑色視窗”。這是因為程式執行完成後,會自動關閉。如果想要讓視窗一直顯示,需要使用while True讓程式一直執行。使用pygame.event.get()獲取事件佇列,使用for...in遍歷事件。還需要設定關閉按鈕。根據type屬性判斷事件型別,event.type等於pygame.QUIT表示檢測到關閉pygame視窗事件。
while True: # 死迴圈確保視窗一直顯示 for event in pygame.event.get(): # 遍歷所有事件 if event.type == pygame.QUIT: # 如果單擊關閉視窗,則退出 sys.exit() pygame.quit() # 退出pygame
-
遊戲圖片的載入與移動
使用pygame中iamge模組的load()方法載入圖片,其返回值是一個Surface物件。Surface是用來代表圖片的pygame物件,可以對其進行塗畫、變形、複製等操作。螢幕也是一個Surface,pygame.display.set_mode()返回了一個螢幕Surface物件。將小鳥、柱的Surface物件畫到螢幕的Surface物件上,需要使用blit()方法。而display模組的flip()方法可以將整個待顯示的Surface物件更新到螢幕上。
以柱的圖片載入和顯示為例:
#初始化定義柱中載入上、下兩根柱的圖片 self.pillUp = pygame.image.load("assets/top.png") self.pillDown = pygame.image.load("assets/bottom.png") # 顯示柱 screen.blit(Pillar.pillUp, (Pillar.wallx, -300)) # 上柱座標位置 screen.blit(Pillar.pillDown, (Pillar.wallx, 500)) # 下柱座標位置 Pillar.updatePillar() # 柱移動 # 更新整個待顯示的Surface物件到螢幕上 pygame.display.flip()
遊戲過程中,柱需要向後移動,小鳥需要上下飛翔,這就涉及到其對應Surface物件的移動。Pygame通過Rect物件儲存和操作矩形區域。首先利用Rect初始化上、下兩根柱的垂直位置。接著構造柱的移動方法,通過改變柱所在X軸座標進行水平移動。
以柱的移動為例:
# 上方柱的矩形位置 upRect = pygame.Rect(Pillar.wallx, -300, Pillar.pillUp.get_width() - 10, Pillar.pillUp.get_height()) # 下方柱的矩形位置 downRect = pygame.Rect(Pillar.wallx, 500, Pillar.pillDown.get_width() - 10, Pillar.pillDown.get_height()) def updatePillar(self): self.wallx -= 5 # 柱X軸座標遞減,即柱向左移動 # 當柱執行到一定位置,即小鳥飛越柱,分數加1同時重置柱 if self.wallx < -80: global score score += 1 self.wallx = 400
-
碰撞檢測
當小鳥撞到柱子上或飛得過高過低時形成碰撞,此後小鳥將改變原本的飛行狀態,直接墜落,遊戲結束。因此,需要有碰撞檢測功能。
# 檢測小鳥與上下方柱是否碰撞 if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect): Bird.dead = True # 檢測小鳥是否飛出上下邊界 if not 0 < Bird.birdRect[1] < height: Bird.dead = True return True else: return False
(三) 實驗結果
(四)將程式碼push至碼雲
三. 課程感想與意見建議
經過這一學期學習,我掌握了Python的語言基礎、流程控制語句、序列的應用、有關字串的操作、檔案操作、異常處理,學習瞭解了正則表示式、網路爬蟲、Socket程式設計、Python操作資料庫等等。這門課程令人受益匪淺。
同時,我還在原先的認知水平上又瞭解到了Git這樣一個平臺,對於未來的學習大有幫助。其中令我感觸最深的就是Python的第三方庫的數量之多、覆蓋面之廣,利用這些第三方庫可以輕鬆實現許多複雜的功能,對於深入學習和創新實踐大有裨益。
“師傅領進門,修行在個人。”雖然課程結束了,但對Python的學習仍要繼續、仍在路上。以後,我會繼續堅持以不息為體,以日新為道,注重知識積累,渴求能力提升,fighting!