结束游戏如果玩家根本不会输,那么游戏还有什么趣味性可言呢?如果玩家没能在足够断的时间内将整群外星人都消灭干净,并且有外星人撞到了飞船底部,飞船将被摧毁。与此同时,我们还限制了可供玩家使用的飞船数,而有外星人抵达屏幕底端时,飞船也将被摧毁。玩家用光了飞船后,游戏便结束。检测外星人和飞船碰撞我们首先检查外星人和飞船之间的碰撞,以便外星人撞上飞船时我们能够作出合适的响应。我们在更新每个外星人的位置后立即检测外星人和飞船之间的碰撞。game_functions.py方法spritecollodeany()接受两个实参:一个精灵和一个编组。它检查编组是否有成员与精灵发生碰撞,并在找到与精灵发生了碰撞的成员后就停止遍历编组。在这里,它遍历编组aliens,并返回它找到的第一个与飞船发生了碰撞的外星人。如果没有发生碰撞,spritecollideany()将返回None,因此if代码块将不会执行。如果找到与飞船发生碰撞的外星人,它就返回这个外星人,因此if代码块将执行:打印Shiphit!!!。(有外星人撞到飞船时,需要执行的任务很多;需要删除余下的所有外星人和子弹,让飞船重新剧中,以及创建一群新的外星人。编写完成这些任务的代码前,需要确定检测外星人和飞船碰撞的方法是否可行。而为确定这一点,最简单的方式是编写一条print语句。)现在,我们需要将ship传递给update_aliens():alien_invasion.py现在如果你运行这个游戏,则每当有外星人撞到飞船时,终端窗口都将显示Shiphit!!!。测试这项功能时,可以将alien_drop_speed设置为较大的值,如50和,这样外星人将更快地撞到飞船。响应外星人和飞船碰撞现在需要确定外星人与飞船发生碰撞时,该做些什么。我们不销毁ship实例并创建一个新的ship实例,而是通过跟踪游戏的统计信息来记录飞船被撞了多少次(跟踪统计信息还有助于记分)。下面来编写一个用于跟踪游戏统计的新类——GameStats,并将其保存为文件game_stats.py:新建的文件game_stats.py在这个游戏运行期间,我们只创建了一个GameStats实例,但每当玩家开始新游戏时,需要重置一些统计信息。为此,我们在方法reset_stats()中初始化大部分统计信息,而不是在__init__()中直接初始化它们。我们在__init__()中调用这个方法,这样创建GameStats实例时将妥善地设置这些统计信息,同时在玩家开始新游戏时也能调用rest_stats()。当前只有一项统计信息——ships_left,其值在游戏运行期间将不断变化。一开始玩家拥有的飞船数存储在settings.py的ship_limit中:settings.py我们还需对alien_invasion.py做一些修改,以创建一个GameStats实例:alien_invasion.py我们导入了新类GameStats,创建了一个名为stats的实例,再调用update_aliens()并添加了实参stats、screen和ship。在有外星人撞到飞船时,我们将使用这些实参来跟踪玩家还有多少艘飞船,以及创建一群新的外星人。有外星人撞到飞船时,我们将余下的飞船数减去1,创建一群新的外星人,并将飞船重新放置到屏幕底端中央(我们还将让游戏暂停一段时间,让玩家在新外星人群出现前注意到发生了碰撞并将重新创建外星人群)。下面将实现这些功能的大部分代码放在函数ship_hit()中:game_functions.py我们首先从模块time中导入了函数sleep(),以便使用它来让游戏暂停。新函数ship_hit()在飞船被外星人撞到时作出响应。在这个函数内部,将余下的飞船数减1,然后清空编组aliens和bullets。接下来,我们创建一群新的外星人。并将飞船居中,稍后将在Ship类中添加方法center_ship()。最后,我们更新所有元素后暂停,让玩家直到其飞船被撞到了。屏幕将暂时停止变化,让玩家能过看到外星人撞到了飞船。函数sleep()执行完毕后,将接着执行函数update_screen(),将新的外星人群绘制到屏幕上。我们还更新了update_aliens()的定义,使其包含形参stats、screen和bullets,让它能够在调用ship_hit()时传递这些值。下面是新方法center_ship(),请将其添加到ship.py的末尾:ship.py为让飞船居中,我们将飞船的属性center设置为屏幕中心的x坐标,而该坐标是通过属性screen_rect获得的。请运行这个游戏,让外星人撞到飞船。游戏暂停后,将出现一群新的外星人,而飞船在屏幕底部居中。
转载请注明:http://www.aierlanlan.com/grrz/7334.html