手把手讲解超详细python入门游戏项目‘打外星飞船’(五)

这是最后一个项目了,前面我们讲了整个游戏页面的控制、飞船、子弹、外星人的创建,这里我们讨论一下子弹射杀外星人和整个游戏的结束,我们这里的文件一共有六个:主函数、飞船、外星飞船、子弹、设置参数、跟踪游戏统计信息六个文件。在这里我们要实现的任务是:子弹碰到外形飞船是让飞船消失,同时飞船碰到外星人飞船或者外星人飞船碰到屏幕低端结束游戏。

主函数

import sys
from time import sleepimport pygamefrom settings import Settings
#我们需要创建一个文件去储存游戏统计信息,这里引入主函数
from game_stats import GameStats
from ship import Ship
from bullet import Bullet
from alien import Alienclass AlienInvasion:"""控制游戏所有类和函数的类"""def __init__(self):"""初始化游戏并且调用相关的函数资源"""pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().heightpygame.display.set_caption("Alien Invasion")#创建一个用于储存游戏并且统计信息的实例self.stats = GameStats(self)self.ship = Ship(self)self.bullets = pygame.sprite.Group()self.aliens = pygame.sprite.Group()self._create_fleet()def run_game(self):"""我们开始了游戏的主循环"""while True:self._check_events()if self.stats.game_active:self.ship.update()self._update_bullets()self._update_aliens()self._update_screen()def _check_events(self):"""这个是读取键盘和鼠标指令的函数"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)def _check_keydown_events(self, event):"""接收键盘上左右移动等指令"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self, event):"""释放键盘指令"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _fire_bullet(self):"""创键一个新的子弹并把他加入子弹组"""if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _update_bullets(self):"""变换子弹的位置并且删除旧的子弹"""#变换位置self.bullets.update()# 删除旧的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)self._check_bullet_alien_collisions()def _check_bullet_alien_collisions(self):"""响应子弹和外星人碰撞,删除碰撞的两者的函数"""# 检查是否有子弹击中外星人,有就删除子弹和外星人collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)if not self.aliens:# 删除现有的子弹并创建一群外星人self.bullets.empty()self._create_fleet()def _update_aliens(self):"""判断是否是已经到了边缘,同时更新飞船的位置"""self._check_fleet_edges()self.aliens.update()# 检查是否飞船和外星人飞船是否相碰if pygame.sprite.spritecollideany(self.ship, self.aliens):self._ship_hit()#检查外星人飞船是否到了底部self._check_aliens_bottom()def _check_aliens_bottom(self):"""Check if any aliens have reached the bottom of the screen."""screen_rect = self.screen.get_rect()for alien in self.aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# Treat this the same as if the ship got hit.self._ship_hit()breakdef _ship_hit(self):"""响应飞船被外星人撞到时候"""if self.stats.ships_left > 0:# Decrement ships_left.self.stats.ships_left -= 1# 清除所有的子弹和外星人self.aliens.empty()self.bullets.empty()# 创建新的飞船,把他放到屏幕中央开始游戏self._create_fleet()self.ship.center_ship()# 暂停一会,让玩家可以看到飞船碰撞sleep(0.5)else:self.stats.game_active = Falsedef _create_fleet(self):# 计算行列的外星人可以容纳多少个,并创建数行数列的外星人alien = Alien(self)alien_width, alien_height = alien.rect.sizeavailable_space_x = self.settings.screen_width - (2 * alien_width)number_aliens_x = available_space_x // (2 * alien_width)ship_height = self.ship.rect.heightavailable_space_y = (self.settings.screen_height -(3 * alien_height) - ship_height)number_rows = available_space_y // (2 * alien_height)# 创建外星人的移动for row_number in range(number_rows):for alien_number in range(number_aliens_x):self._create_alien(alien_number, row_number)def _create_alien(self, alien_number, row_number):"""创建一群外星人飞船"""alien = Alien(self)alien_width, alien_height = alien.rect.sizealien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberself.aliens.add(alien)def _check_fleet_edges(self):"""如果有任何飞船到达边缘要及时反应"""for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):"""让外星人飞船左右移动"""for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _update_screen(self):"""更新屏幕上的图片"""self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()self.aliens.draw(self.screen)pygame.display.flip()if __name__ == '__main__':# Make a game instance, and run the game.ai = AlienInvasion()ai.run_game()

外星人文件

import pygame
from pygame.sprite import Spriteclass Alien(Sprite):"""外星人移动管里类"""def __init__(self, ai_game):"""初始化外星人并把放置他们的位置"""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settings#下载图片self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# 每次在左上角开始飞船self.rect.x = self.rect.widthself.rect.y = self.rect.height# 储存飞船的位置.self.x = float(self.rect.x)def check_edges(self):"""返回flag如果飞船到达边缘"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left <= 0:return Truedef update(self):"""向左或者向右移动飞船"""self.x += (self.settings.alien_speed *self.settings.fleet_direction)self.rect.x = self.x

子弹文件

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):"""管理子弹的类"""def __init__(self, ai_game):"""在飞船的位置创建一个子弹"""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color = self.settings.bullet_color# 现在原点创建一个矩形然后移动到飞船头部self.rect = pygame.Rect(0, 0, self.settings.bullet_width,self.settings.bullet_height)self.rect.midtop = ai_game.ship.rect.midtop# 储存子弹self.y = float(self.rect.y)def update(self):"""子弹超过屏幕后移除子弹"""# Update the decimal position of the bullet.self.y -= self.settings.bullet_speed# Update the rect position.self.rect.y = self.ydef draw_bullet(self):"""在屏幕上画出子弹"""pygame.draw.rect(self.screen, self.color, self.rect)

参数设置类文件

class Settings:"""设置一系列参数"""def __init__(self):"""初始化游戏的参数"""# 屏幕的大小self.screen_width = 1200self.screen_height = 800self.bg_color = (230, 230, 230)# 飞船的速度等参数self.ship_speed = 1.5self.ship_limit = 3# 子弹的设置self.bullet_speed = 1.5self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)self.bullets_allowed = 3# 外星人飞船的设置self.alien_speed = 1.0self.fleet_drop_speed = 10# fleet_direction of 1 represents right; -1 represents left.self.fleet_direction = 1

飞船文件

import pygameclass Ship:"""管理飞船的类"""def __init__(self, ai_game):"""初始化飞船并且调动他的位置."""self.screen = ai_game.screenself.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()# 调用飞船图片并且储存他的位置self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()# 每个飞船都在屏幕的中央出现self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)# 移动flagself.moving_right = Falseself.moving_left = Falsedef update(self):"""移动飞船根据flag"""# Update the ship's x value, not the rect.if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speed# 储存飞船目前的位置self.rect.x = self.xdef blitme(self):"""在目前位置画出飞船"""self.screen.blit(self.image, self.rect)def center_ship(self):"""把飞船放在屏幕中央"""self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)

跟踪游戏统计文件

class GameStats:"""跟踪游戏统计信息"""def __init__(self, ai_game):"""初始化游戏信息"""self.settings = ai_game.settingsself.reset_stats()#游戏启动处于活动状态self.game_active = Truedef reset_stats(self):"""初始化在游戏运行期间可能变化的统计信息"""self.ships_left = self.settings.ship_limit

这个是最后的配置的外星人和飞船图片

手把手讲解超详细python入门游戏项目‘打外星飞船’(五)相关推荐

  1. 手把手讲解超详细python入门游戏项目‘打外星飞船’(二)

    手把手讲解超详细python入门游戏项目'打外星飞船'(二) 上次我们在(一)中创建了游戏的背景,现在我们这里将要实现用键盘控制飞船的移动.射击子弹,但是在此之前我们还有一个非常重要的部分–重构. 重 ...

  2. 手把手讲解超详细python入门游戏项目‘打外星飞船’(四)

    手把手讲解超详细python入门游戏项目'打外星飞船'(四) 在经过创立屏幕.飞船移动和设置子弹,我们这里开始设置外形人的创建和移动.我们这里主要的任务是:创建一众外星人让它们充满屏幕,让他们向下和两 ...

  3. 手把手讲解超详细python入门游戏项目‘打外星飞船’(三)

    手把手讲解超详细python入门游戏项目'打外星飞船'(三) 第三部分我们讲解一下飞船需要射出子弹,那么子弹的部分是怎么操作呢?接下来我直接把项目的四个文件展示出来,以注释的形式在旁边讲解.因为有很多 ...

  4. 手把手讲解超详细python入门游戏项目‘打外星飞船’(一)

    手讲解超详细python入门游戏项目'打外星飞船'手把(一) 由于内容比较多,这里会分为五篇文章来讲解,从页面的创建.飞船控制.射击.外星人创建.射杀外星人五片来展开. 做一个窗口和设置响应用户 im ...

  5. 超强、超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...

  6. 【转】超强、超详细Redis入门教程 ,建议收藏

    转载自: 这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3. ...

  7. python详细安装教程-超详细Python与PyCharm安装教程,看这一篇就够了

    原标题:超详细Python与PyCharm安装教程,看这一篇就够了 学习了三天的python, 之前测试一直用课程自带的网页版玩玩, 为了学习 然后就下载了一个python和pycharm 现在分享下 ...

  8. 超详细Redis入门教程——Redis命令(下)

    前言 本文小新为大家带来 超详细Redis入门教程--Redis命令 相关知识,具体内容包括简单动态字符串 SDS,集合的底层实现原理,BitMap 操作命令,HyperLogLog 操作命令,Geo ...

  9. 超详细Redis入门教程——Redis命令(上)

    前言 本文小新为大家带来 超详细Redis入门教程--Redis命令(上) 相关知识,具体内容包括Redis 基本命令,Key 操作命令,String 型 Value 操作命令,Hash 型 Valu ...

最新文章

  1. 【Python】keras使用LSTM拟合曲线
  2. 多项式的链式存储方案
  3. js ul 清缓存_JavaScript使用ul中li标签实现删除效果
  4. 控制器发生异常 eofexception_关于气动薄膜调节阀常发生的故障你可能还不知道...
  5. linux 网卡序列号,linux查看网卡地址和硬盘序列号
  6. Python库全家福,基本都齐了
  7. dbutil 1.1.6
  8. 《电子信息系统机房设计规范》中涉及到的节能问题
  9. 机器学习处理信号分离_【火炉炼AI】机器学习054-用ICA做盲源分离
  10. TrueCrypt安装及其使用教程
  11. 测试学习-123-Linux性能测试监控CPU内存脚本(极简清爽)
  12. MySQL闪回工具之my2sql
  13. 表示颜色的英语单词(图)
  14. 一个dht网络的“磁力链接”搜索python代码
  15. [NLP]高级词向量表达之ELMo详解
  16. chromebook刷机_如何自定义Chromebook的键盘和触摸板
  17. 那些一个字使劲儿堆的汉字你都认识吗 - 收集
  18. 基于云存储技术的仓储管理系统
  19. 译-Dart虚拟机入门(Introduction to DartVM)
  20. “新角度”学习微积分:阿基米德是如何称出球的体积的?

热门文章

  1. b2b2c系统jwt权限源码分享part2
  2. 数字图像处理(matlab版)课本源码和图片
  3. 无线网桥有服务器吗,网桥和无线网桥的概念及架设方案
  4. php长字符加密成短字符,大神们 怎么把一串长的字符串加密为短的能还原
  5. 英语演讲稿关于计算机小知识,求一篇英语演讲稿《If I were a teacher》
  6. delphi 打开指定网址
  7. 武汉星淘惠:武汉跨境产业稳步发展,线上选品大会已圆满落幕
  8. 2019年人力资源电子合同呈现五大趋势
  9. WebP图片制作GUI工具
  10. Android手机截屏生成gif图片