这个阶段就要结束了,现在我们要结束游戏了,按常规操作来说,当外星人撞到飞船或是屏幕底端时便结束游戏,更进一步,我们会给玩家三次机会,对,就像小时候玩的游戏一样我们有三条命,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来保证当飞船用完后就不更新飞船外星人以及子弹,也就是进入静止状态,效果是这样的:




pygame如何按ESC退出 pygame结束游戏_初始化


对,当外星人撞到飞船时就静止了~~~暂时就是这些,下一步就要开始完善其功能了……