Pygame写飞机大战游戏中异常处理记录

下半年学习写了飞机大战游戏程序,参考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)

当子弹同时打中多个敌人时的报错截图:
Pygame写飞机大战游戏中异常处理记录
报错原因是:当子弹识别到与某一敌人相距距离在击中范围内,则将该子弹移除,但在与下一个敌人判断时,发现也在击中范围内,则又对该子弹进行移除,这是该子弹已经在前面被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 处理完成,则程序可以继续执行。

上一篇:014 java一维数组求最大值与最小值


下一篇:异常