1. 程式人生 > 其它 >20192415 2020-2021-2 《Python程式設計》實驗4報告

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()函式獲取得分,成功飛越一對上下柱得一分。

(二) 實現過程

  1. 安裝Pygame

    Pygame是一組跨平臺的Python模組, 用於建立視訊遊戲,現已已被用於數百種商業和開源遊戲。

     python -m pip install pygame
    
  1. 建立並保持遊戲視窗

    匯入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
    
  2. 遊戲圖片的載入與移動

    使用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
    
  3. 碰撞檢測

    當小鳥撞到柱子上或飛得過高過低時形成碰撞,此後小鳥將改變原本的飛行狀態,直接墜落,遊戲結束。因此,需要有碰撞檢測功能。

     # 檢測小鳥與上下方柱是否碰撞
     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!

四. 參考資料