1. 程式人生 > 其它 >Pygame寫飛機大戰遊戲中異常處理記錄

Pygame寫飛機大戰遊戲中異常處理記錄

技術標籤:Python遊戲開發飛機大戰pygamepython遊戲開發異常

下半年學習寫了飛機大戰遊戲程式,參考B站UP主:麥叔程式設計的《一小時開發飛機大戰遊戲Pygame版本》系列課程,沒有堅持寫博文記錄我的學習,待我有空整理後上傳吧。
  本文只記錄一個問題點:子彈在同時打到一顆以上的子彈時,程式會報錯:ValueError: list.remove(x): x not in list。然後遊戲就結束了。對於這種問題,我們希望當同一顆子彈打到多個敵人的時候能準確計數並遊戲繼續。
下面先貼出沒改前的子彈打中敵人的程式碼塊:

def hit(self):
		global score
		for
e in enemies: if distance(self.x,self.y,e.x,e.y) < 20: score = score + 1 #計分 bullets.remove(self) #該子彈移除 baoSound.play() #播放爆炸音效 e.x = random.randint(100,700) #將被打中的敵人重置至視窗上端 e.y = random.randint(50,200)

當子彈同時打中多個敵人時的報錯截圖:
在這裡插入圖片描述
報錯原因是:當子彈識別到與某一敵人相距距離在擊中範圍內,則將該子彈移除,但在與下一個敵人判斷時,發現也在擊中範圍內,則又對該子彈進行移除,這是該子彈已經在前面被bullets這個用來存放子彈的列表remove掉了,即子彈中已經沒有該被移除的子彈了,那麼就會出現這個ValueError異常。另外為了能處理這個連擊的事件,我們不採取remove後便結束與剩下敵人的迴圈判斷過程,而是讓它繼續找是否有。

那麼我們可以用高階語言都會有的try except語句,將異常捕獲,並做相應處理,然後程式得以繼續。
下面是修改後的程式程式碼:

def hit(self):
		global score
		for e in enemies:
			if distance(self.x,self.y,e.x,e.y) < 20:
				score = score + 1	
				try:
					bullets.remove(self)
				except ValueError:
					print("發生了連擊")					
				finally:
					baoSound.
play() e.x = random.randint(100,700) e.y = random.randint(50,200)

其中try except語法是:

try:
  被檢測程式碼段  
except Exception[as reason]:  #Exception 是需要特定捕獲的異常名稱,reason可選,接收異常產生的原因。
  異常處理相關資訊

finally語句,一般是在try except語句下面補充,用於程式檢測到異常後仍能執行的語句。
try except 語句的執行流程如下
  首先執行 try 中的程式碼塊,如果執行過程中出現異常,系統會自動生成一個異常型別,並將該異常提交給 Python 直譯器,此過程稱為捕獲異常。
當 Python 直譯器收到異常物件時,會尋找能處理該異常物件的 except 塊,如果找到合適的 except 塊,則把該異常物件交給該 except 塊處理,這個過程被稱為處理異常。如果 Python 直譯器找不到處理異常的 except 塊,則程式執行終止,Python 直譯器也將退出。
  事實上,不管程式程式碼塊是否處於 try 塊中,甚至包括 except 塊中的程式碼,只要執行該程式碼塊時出現了異常,系統都會自動生成對應型別的異常。但是,如果此段程式沒有用 try 包裹,又或者沒有為該異常配置處理它的 except 塊,則 Python 直譯器將無法處理,程式就會停止執行;反之,如果程式發生的異常經 try 捕獲並由 except 處理完成,則程式可以繼續執行。