python应用篇之外星人入侵项目 您所在的位置:网站首页 外星飞船简介 python应用篇之外星人入侵项目

python应用篇之外星人入侵项目

#python应用篇之外星人入侵项目| 来源: 网络整理| 查看: 265

前言

我们上篇文章给大家介绍了射杀外星人功能的实现,其中主要包括检测子弹与外星人碰撞,生成新的外星人群、提高子弹的速度以及最后将update_bullets()方法进行了重构。接下来,给大家介绍游戏结束功能的实现,首先介绍检测外星人与飞船的碰撞功能的实现。

一、结束游戏

这里需要我们考虑一个问题:如果玩家根本不会输,这游戏还有什么趣味和挑战性可言? 如果玩家没能在足够短的时间内将整群外星人都消灭干净,且有外星人撞到飞船,飞船将被摧毁。与此同时,我们还限制了可供玩家使用的飞船数,而外星人抵达屏幕低端时,飞船也将被摧毁。与此同时,我们还限制了可供玩家使用的飞船数,而有外星人抵达屏幕低端时,飞船也将被摧毁。玩家用光了飞船后,游戏便结束。

1、检测外星人和飞船碰撞

我们首先检测外星人和飞船之间的碰撞,以便外星人撞上飞船时我们能够作出合适的响应。我们在更新每个外星人和飞船之间的碰撞:

def update_aliens(ai_settings, ship, aliens): """检查是否有外星人位于屏幕边缘,并更新整群外星人的位置""" check_fleet_edges(ai_settings, aliens) aliens.update() # 检测外星人和飞船之间的碰撞 if pygame.sprite.spritecollideany(ship, aliens): print("Ship hit!!!")

方法spritecollideany()接受两个实参:一个精灵和一个编组。它检查编组是否有成员与精灵发生了碰撞。并在找到与精灵发生了碰撞的成员就停止遍历编组。在这里,它遍历编组aliens,并返回它找到的第一个与飞船发生了碰撞的外星人。

如果没有发生碰撞,spritecollideany()将返回None,因此,这就不会执行if语句代码块。如果找到了与飞船发生碰撞的外星人,它就返回这个外星人,因此if语句代码块执行,就会显示“Ship hit”字样。(有外星人撞到飞船时,需要执行的任务很多;需要删除余下的所有外星人和子弹,让飞船重新居中,以及创建一群新的外星人。编写完成这些任务代码前,需要确定检测外星人和飞船碰撞的方法是否可行。而为确定这一点,最简单的方式是编写一条print语句来在终端打印该消息)。

现在,我们需要将ship传递给update_aliens():

import sys import pygame from settings import Settings from ship import Ship import game_functions as gf from pygame.sprite import Group from alien import Alien def run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alian Invasion") # 创建一艘飞船、一个子弹编组和一个外星人编组 ship = Ship(ai_settings, screen) # 创建一组一个用于存储子弹的编组 bullets = Group() aliens = Group() # 创建外星人群 # alien = Alien(ai_settings, screen) gf.create_fleet(ai_settings, screen, ship, aliens) # 开始游戏的主循环 while True: # 监视键盘和鼠标事件 gf.check_events(ai_settings, screen, ship, bullets) ship.update() gf.update_bullets(ai_settings, screen, ship, aliens, bullets) gf.update_aliens(ai_settings, ship, aliens) gf.update_screen(ai_settings, screen, ship, aliens, bullets) run_game()

现在如果你运行这个游戏,则每当有外星人撞到飞船时,终端窗口都将显示ship hit!!!。具体效果如下:

由于每撞一次,就打印一条相应的信息。因此,这里打印了多条信息。我们在测试这项功能的时候,请将alien_drop_speed设置为较大的值,如50或100,这样外星人将更快地撞到飞船,我们能够更快看到这个效果。

2、响应外星人和飞船碰撞

现在需要确定外星人与飞船发生碰撞时,该做些什么呢。我们不销毁Ship实例并创建一个新的ship实例,而是通过跟踪游戏的统计信息来记录飞船被撞多少次(跟踪统计信息还有助于计分)。 下面来编写一个用于跟踪游戏统计信息的新类——GameStats,并将其保存为文件game_stats.py中,其Python文件目录机构如下:

具体实现该函数如下:

class GameStats(): """跟蹤遊戲的統計信息""" def __init__(self, ai_settings): """初始化統計信息""" self.ai_settings = ai_settings self.reset_stats() def reset_stats(self): """初始化在遊戲運行期間可能變化的統計信息""" self.ships_left = self.ai_settings.ship_limit

在这个游戏运行期间,我们只创建了一个GameStats实例,但每当玩家开始游戏时,需要重置一些统计信息。为此,我们在方法reset_stats()中初始化大部分统计信息,而不是在__init__()中直接出初始化它们。为此,我们在__init__()方法中调用这个方法,这样创建GameStats实例时将妥善地设置这些统计信息,同时在玩家开始新游戏时也能调用reset_stats()。

当前只有一项统计信息——ships_left,其值在游戏运行期间将不断变化。一开始玩家拥有的飞船数存储在settings.py的ship_limit中:

# 飞船的设置 self.ship_speed_factor = 1.5 self.ship_limit = 3

我们还需要对slien_invasion.py做修改,以创建一个GameStats实例:

import sys import pygame from settings import Settings from ship import Ship import game_functions as gf from pygame.sprite import Group from alien import Alien from game_stats import GameStats def run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alian Invasion") # 創建一個用于存儲遊戲統計信息的實例 stats = GameStats(ai_settings) # 创建一艘飞船、一个子弹编组和一个外星人编组 ship = Ship(ai_settings, screen) # 创建一组一个用于存储子弹的编组 bullets = Group() aliens = Group() # 创建外星人群 # alien = Alien(ai_settings, screen) gf.create_fleet(ai_settings, screen, ship, aliens) # 开始游戏的主循环 while True: # 监视键盘和鼠标事件 gf.check_events(ai_settings, screen, ship, bullets) ship.update() gf.update_bullets (ai_settings, screen, ship, aliens, bullets) gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets) gf.update_screen(ai_settings, screen, ship, aliens, bullets) run_game()

我们导入了新类GameStats,创建了一个名为stats的实例,再调用update_aliens()并添加了实参stats、screen和ship。在有外星人撞到飞船时,我们将使用这些实参来跟踪玩家还有多少搜飞船,以及创建一群新的外星人。

有外星人撞到飞船时,我们将余下的飞船数减1,创建一群新的外星人,并将飞船重新放置到屏幕低端中央(我们还将游戏暂停一会时间,让玩家在新外星人群出现前注意发生了碰撞,并将重新创建外星人群)。

下面将实现这些功能的大部分代码放到函数ship_hit()中:

import sys import pygame from bullet import Bullet from alien import Alien from time import sleep def check_keydown_events(event, ai_settings, screen, ship, bullets): """响应按键""" if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True elif event.key == pygame.K_SPACE: # 创建一颗子弹,并将其加入到编组bullets中 fire_bullet(ai_settings, screen, ship, bullets) elif event.key == pygame.K_q: sys.exit() def fire_bullet(ai_settings, screen, ship, bullets): """如果还没有到达限制,就发射一颗子弹""" if len(bullets) 0: # 將飛船ships_left減1 stats.ships_left -= 1 # 清空外星人列表和子彈列表 aliens.empty() bullets.empty() # 創建一群新的外星人,並將飛船放到屏幕低端中央 create_fleet(ai_settings, screen, ship, aliens) ship.center_ship() # 暫停 sleep(0.5) else: stats.game_active = False

ship_hit()的大部分代码都没变。我们将原来的所有代码都移到了一个if语句块中,这条if语句检查玩家是否至少还有一艘飞船。如果是这样,就创建一群新的外星人,暂停一会儿,再接着往下继续执行。如果玩家没有了飞船,就将game_active设置为False。

二、确定应运行游戏的哪些部分

在alien_invasion.py中,我们需要确定游戏的哪些部分在任何情况下都应运行,哪些部分仅在游戏处于活动状态时运行:

# 开始游戏的主循环 while True: # 监视键盘和鼠标事件 gf.check_events(ai_settings, screen, ship, bullets) if stats.game_active: ship.update() gf.update_bullets (ai_settings, screen, ship, aliens, bullets) gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets) gf.update_screen(ai_settings, screen, ship, aliens, bullets) run_game()

在主循环中,在任何情况下都需要调用check_events(),即便游戏处于非活动状态时亦是如此。例如,我们需要知道玩家是否按了Q键以脱出游戏,或单击关闭窗口的按钮。我们还需要不断更新屏幕,以便在等待玩家是否选择开始新游戏时能够改变屏幕。其它函数仅在游戏处于活动状态时才需要调用,因为游戏处于非活动状态,我们不用更新游戏元素的位置。

现在我们运行这个游戏时,它将在飞船用完后停止不动。具体效果如下:

总结

我们上篇文章给大家介绍了射杀外星人功能的实现,其中主要包括检测子弹与外星人碰撞,生成新的外星人群、提高子弹的速度以及最后将update_bullets()方法进行了重构。接下来,给大家介绍了游戏结束功能的实现,主要包括检测外星人与飞船的碰撞、响应外星人和飞船碰撞以及外星人到达屏幕底端功能的实现。最后又将游戏结束和确定游戏应运行的部分做了实现。不过本文在部分代码中只写了部分代码,因为随着项目的不断扩大,代码行数太多,为了尽可能减少每篇文章的篇幅,大家阅读的方便以及尽可能将文章阅读时间控制在20分钟左右。不过,代码的准确度一定是正确的,可以跑起来的!为了让大家更好的吸收项目所用到的知识点,我们每一篇文章只给大家实现《外星人入侵》的一个功能,所以,希望大家能够仔细阅读,认真跟着写代码,理解其中的深入含义,吧这个项目的价值发挥到最大。其实这个项目已经很典型,代码到处都是,但是,如果你只是简单的粘贴复制,对你知识的学习没有任何的价值,你还是得跟着过一遍,然后要知道每行代码的含义或者是用到了前面我们介绍的哪一块知识点,只有这样,这个项目才会发挥不一样的价值,希望大家认真学习,把基础知识打扎实一点。Python是一门注重实际操作的语言,它是众多编程语言中最简单,也是最好入门的。当你把这门语言学会了,再去学习java、go以及C语言就比较简单了。当然,Python也是一门热门语言,对于人工智能的实现有着很大的帮助,因此,值得大家花时间去学习。生命不息,奋斗不止,我们每天努力,好好学习,不断提高自己的能力,相信自己一定会学有所获。加油!!!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有