这个阶段就要结束了,现在我们要结束游戏了,按常规操作来说,当外星人撞到飞船或是屏幕底端时便结束游戏,更进一步,我们会给玩家三次机会,对,就像小时候玩的游戏一样我们有三条命,ok,开始操作:
首先我们要创建一个新类,他负责跟踪游戏统计信息,先看一下:
class GameSta():
def __init__(self,ai_settings):
self.ai_settings=ai_settings
self.reset_sta()
self.game_active=True
def reset_sta(self):
self.ship_counts=self.ai_settings.ship_limit #将初始化时的飞船数量设置为自定义的最大限制
该类位于新文件game_sta.py中,用于初始化统计信息,ship_limit的值可以在settings.py中设置:
self.ship_limit=3 #玩家最初拥有的飞船数量
在主程序中创建GameSta实例,不要忘了导入他:
from game_sta import GameSta
sta=GameSta(ai_settings)
gf.update_aliens(ai_settings,aliens,screen,ship,bullets,sta)
很明显第三条代码是在主循环中的,我们在后边还要进行设置。
在game_functions.py中我们要新建两个函数来处理外星人撞击到飞船和屏幕底端的措施:
def ship_col(ai_settings,aliens,screen,ship,bullets,sta):
if sta.ship_counts>0:
sta.ship_counts-=1 #每次检测到撞击飞船数量减少1
aliens.empty()
bullets.empty() #清空外星人和当前的子弹
creat_aliens(ai_settings,screen,aliens,ship) #创建一批新的外星人
ship.ship_center() #将飞船重新放到屏幕中央
sleep(1) #睡眠1秒钟
else:
sta.game_active=False
def check_aliens_bottom(ai_settings,aliens,screen,ship,bullets,sta):#检测飞船是否撞到屏幕底部
for alien in aliens.sprites():
if alien.rect.bottom>=screen.get_rect().bottom:#检测外星人和屏幕的bottom属性
ship_col(ai_settings,aliens,screen,ship,bullets,sta)
break #有一个外星人撞到底部便结束本轮游戏
def update_aliens(ai_settings,aliens,screen,ship,bullets,sta): #更新编组中所有外星人的位置,将自动对每个外星人调用方法update()
check_aliens_edge(ai_settings,aliens)
aliens.update()
if pygame.sprite.spritecollideany(ship,aliens): #如果飞船和外星人发生碰撞
ship_col(ai_settings,aliens,screen,ship,bullets,sta)
check_aliens_bottom(ai_settings,aliens,screen,ship,bullets,sta) #检测外星人是否撞击到了屏幕底部
ok,为了方便我们把最终的操作也加上了,第一个函数是处理外星人撞击到飞船的,如果飞船的数量大于零就执行一系列合理操作,否则将属性game_active置为False,(在类GameSta中我们初始化时将game_active设置为True)该属性后边马上讲到……这里有个ship.ship_center(),这是我们自定义的,在ship.py中我们创建此方法:
def ship_center(self):
self.center=self.screen_rect.centerx #将飞船的center设置为屏幕中心的x坐标
我们还用到了sleep(),这个需要导入:from time import sleep
第二个函数是处理外星人撞击到屏幕底端操作的,用到了bottom属性,然后执行内容和飞船一样~~
第三个函数的第四行用到了spritecollideany(),他检测两个参数是否发生碰撞,若发生则返回True,然后执行ship_col操作。
最后更新一下主程序:
while True:
gf.check_events(ship,ai_settings,screen,bullets) #更改事件监听函数
if sta.game_active:
ship.update() #每次循环都访问该函数,保证飞船的位置将在检测到键盘事件后(但在更新屏幕前)更新
gf.update_bullets(ai_settings,screen,ship,bullets,aliens)
gf.update_aliens(ai_settings,aliens,screen,ship,bullets,sta)
gf.update_screen(ai_settings,screen,ship,bullets,aliens)
这是主循环,我们通过属性game_active来保证当飞船用完后就不更新飞船外星人以及子弹,也就是进入静止状态,效果是这样的:
对,当外星人撞到飞船时就静止了~~~暂时就是这些,下一步就要开始完善其功能了……