这里写自定义目录标题

  • 外星人入侵
    • 当子弹碰到外星人飞船时外星人被消灭
    • 响应外星人和飞船碰撞
    • 有外星人达到底部
    • 各文件完整代码
      • settings.py
      • ship.py
      • alien.py
      • bullet.py
      • game_functions.py
      • game_stats.py
      • alien_invasion.py

外星人入侵

本篇博客承接上一篇博客:

当子弹碰到外星人飞船时外星人被消灭

def update_bullets(ai_settings,screen,ship,aliens,bullets):# 更新子弹的位置, 并删除已消失的子弹 4303987588749bullets.update()# 清楚越界的子弹,防止占用内存# 遍历子弹编组的副本,在副本中检查每颗子弹,判断是否到顶端for bullet in bullets.copy():# 如果子弹到顶端则删除if bullet.rect.bottom<=0:bullets.remove(bullet)# print(len(bullets)) # 打印输出剩余的子弹数量check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets)def check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets):# groupcollide遍历编组bullets中的所有子弹和编组aliens中的所有外星人。# 当有子弹和外星人的rect重叠时,groupcollide返回一个键值对collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)if len(aliens) ==0 :# 删除现有的子弹并创建一群外星人bullets.empty()create_fleet(ai_settings,screen,ship,aliens)

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)

响应外星人和飞船碰撞

新建一个game_stats.py文件

# 跟踪游戏统计信息的类,记录飞船被撞了多少次
# 在游戏运行期间之创建一个GamStats类,但当玩
# 家开始游戏时,需要重置一些统计信息,所有用
# reset_stats来初始化大部分信息
class GamStats():# 跟踪游戏的统计信息def __init__(self,ai_settings):# 初始化统计信息self.ai_settings = ai_settingsself.reset_stats()self.game_active= Truedef reset_stats(self):# 初始化在游戏运行期间可能变化的统计信息self.ships_left = self.ai_settings.ship_limit

在alien_invasion.py文件中做如下修改

# 创建一个用于存储游戏统计信息的实例stats = GamStats(ai_settings)

game_functions.py 文件中修改:

def update_aliens(ai_settings,stats,screen,ship,aliens,bullets):# 检查外星人是否到达边缘check_fleet_edges(ai_settings,aliens)# 更新外星人群中所有外星人的位置aliens.update()# 检测外星人和飞船之间的碰撞# spritecollideany接受两个参数,一个精灵和一个编组。# 它检查编组是否有成员与精灵发生了碰撞,如果没有发生碰撞,返回Noneif pygame.sprite.spritecollideany(ship,aliens):print("Ship hit!!!")if pygame.sprite.spritecollideany(ship,aliens):ship_hit(ai_settings,stats,screen,ship,aliens,bullets)check_aliens_bottom(ai_settings,stats,screen,ship,aliens,bullets)def ship_hit(ai_settings,stats,screen,ship,aliens,bullets):# 响应被外星人撞到的飞船# 将ships_left减1if stats.ships_left > 0:stats.ships_left -= 1# 清空外星人列表和子弹列表aliens.empty()bullets.empty()# 创建一群新的外星人, 并将飞船放到屏幕底端中央create_fleet(ai_settings,screen,ship,aliens)ship.center_ship()# 暂停sleep(0.5)else:stats.geme_active = False

ship.py文件中新增函数:

def center_ship(self):# 让飞船在屏幕上居中self.center = self.screen_rect.centerx

有外星人达到底部

def check_aliens_bottom(ai_settings,stats,screen,ship,aliens,bullets):# 检查是否有外星人到达了屏幕底端screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# 像飞船被撞到一样进行处理ship_hit(ai_settings,stats,screen,ship,aliens,bullets)break

各文件完整代码

settings.py

class Settings():""" 存储 游戏 的所有设置的类,存放一些基本参数"""def __init__(self):""" 初始化游戏的设置"""#屏幕设置self.screen_width = 900self.screen_height  = 600self.bg_color =  (230,230,230)# 飞船设置# 设置属性ship_speed_factor来控制飞船的速度# 移动飞船时移动1.5 个像素self.ship_speed_factor = 1.0self.ship_limit = 3# 子弹设置self.bullet_speed_factor = 1 # 子弹速度self.bullet_width = 3 self.bullet_height = 15self.bullet_color = 60, 60, 60self.bullets_allowed = 10 # 限制子弹数量# 外星人参数设置self.alien_speed_factor = 1# 外星人撞到屏幕边缘时,外星人群向下移动self.fleet_drop_speed = 10# fleet_direction 为1表示向右移动,-1表示向左移self.fleet_direction = 1

ship.py

import pygame
class Ship():def __init__(self,ai_settings, screen):""" 初始化飞船设置其初始化位置"""self.screen = screenself.ai_settings = ai_settings# 加载飞船图像并获取其外接矩形self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect() self.screen_rect = screen.get_rect()#将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 在飞船的属性center中存储小数值self.center = float(self.rect.centerx)# 添加一个向右移动的属性 初始化为False# 在向右键按下时,为真,松开为False,实现按住持续移动self.moving_right = Falseself.moving_left = False# 更新飞船的位置坐标,窗口宽1200,飞船默认居中。# 右加左减def update(self):#控制飞船活动范围的方法,一种是限制位置变量的取值范围,这样是固定的范围#一种是动态限制范围,以下是动态限制# self.rect.right返回飞船外接矩形的右边缘的x坐标,# 如果这个值小于self.screen_rect.right的值,就说明飞船未触及屏幕右边缘if self.moving_right and self.rect.right<self.screen_rect.right:# self.rect.centerx +=1# ai_settings是settings模块中的函数,函数里面有ship_speed_factor速度变量self.center += self.ai_settings.ship_speed_factorif self.moving_left and self.rect.left>0:self.center -= self.ai_settings.ship_speed_factor# center是自己创建的一个变量,用来记录飞船的位置# self.rect.centerx是系统的变量,用来控制飞船的位置self.rect.centerx = self.centerdef blitme(self):""" 在指定位置绘制飞船"""self.screen.blit(self.image,self.rect)def center_ship(self):# 让飞船在屏幕上居中self.center = self.screen_rect.centerx

alien.py

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):# 表示单个外星人的类def __init__(self,ai_settings,screen):# 初始化外星人并设置其起始位置super(Alien,self).__init__()self.screen = screenself.ai_settings = ai_settings# 加载外星人图像,并设置其screen属性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 blitme(self):# 在指定位置绘制外星人self.screen.blit(self.image,self.rect)def update(self):# 向左或向右移动外星人self.x += (self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction)self.rect.x = self.xdef check_edges(self):# 如果外星人位于屏幕边缘,就返回Truescreen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <=0:return True

bullet.py

import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):# 对飞船发射的子弹进行管理def __init__(self, ai_settings,screen,ship):# 在飞船所处的位置创建一个子弹对象super(Bullet,self).__init__()self.screen = screen# 在(0,0)处创建一个表示子弹的矩形, 再设置正确的位置# 使用pygame.Rect创建一个空白的矩形,创建时必须提供(x,y)坐标# 子弹的宽度和高度从ai_settings中获取self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)# 设置子弹的位置,位于飞船的正上方。self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top#存储用小数表示的子弹位置,以便后期微调,存储子弹颜色和速度self.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):# 设置子弹发出的效果,向上移动# 更新表示子弹位置的小数值self.y -= self.speed_factor# 更新表示子弹的rect的位置self.rect.y = self.ydef draw_bullet(self):pygame.draw.rect(self.screen,self.color,self.rect)

game_functions.py

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):# 响应按键 右方向键# 通过读取event.key,检查按下的是否是右箭头键if event.key == pygame.K_RIGHT:# 向右移动飞船# ship.rect.centerx += 1  飞船向右移动ship.moving_right = Trueelif event.key == pygame.K_LEFT:# 向左移动飞船# ship.rect.centerx -= 1ship.moving_left = Trueelif event.key == pygame.K_SPACE: # 设置开火指令fire_bullet(ai_settings, screen, ship, bullets)# 按下Q时退出游戏elif event.key == pygame.K_q:sys.exit()def check_keyup_events(event ,ship):# 响应松开if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(ai_settings,screen,ship,bullets):""" 响应按键和鼠标事件,在这个方法中指定需要检查的事件 """# 事件都是通过pygame.event.get()方法获取for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 每次按键都会注册一个KEYDOWN# 检测到KEYDOWN事件时,我们需要检查按下的是否是特定的键elif event.type == pygame.KEYDOWN:check_keydown_events(event,ai_settings,screen,ship,bullets)# 松开方向键时触发的事件,将moving_right or moving_left设为falseelif event.type == pygame.KEYUP:check_keyup_events(event,ship)def update_screen(ai_settings, screen, ship,aliens,bullets):# 更新屏幕上的图像, 并切换新屏幕#每次循环都会重绘制屏幕screen.fill(ai_settings.bg_color)    #只能有一个参数for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)# 让最近绘制的屏幕可见pygame.display.flip()def update_bullets(ai_settings,screen,ship,aliens,bullets):# 更新子弹的位置, 并删除已消失的子弹 4303987588749bullets.update()# 清楚越界的子弹,防止占用内存# 遍历子弹编组的副本,在副本中检查每颗子弹,判断是否到顶端for bullet in bullets.copy():# 如果子弹到顶端则删除if bullet.rect.bottom<=0:bullets.remove(bullet)# print(len(bullets)) # 打印输出剩余的子弹数量check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets)def check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets):# groupcollide遍历编组bullets中的所有子弹和编组aliens中的所有外星人。# 当有子弹和外星人的rect重叠时,groupcollide返回一个键值对collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)if len(aliens) ==0 :# 删除现有的子弹并创建一群外星人bullets.empty()create_fleet(ai_settings,screen,ship,aliens)
def fire_bullet(ai_settings, screen, ship, bullets):# 如果还没有到达限制,就发射一颗子弹# 创建一颗子弹,并将其加入到编组bullets中# 按下空格时,发射子弹,并且限制子弹数量if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)
# 获取外星人数量
def get_number_aliens_x(ai_settings,alien_width):# 计算每行可容纳多少个外星人# 计算外星人可创建的区域,与屏幕边缘有边距available_space_x = ai_settings.screen_width - 2*alien_width# 计算一行可用放的外星人数量number_aliens_x = int(available_space_x / (2*alien_width))return number_aliens_xdef get_number_rows(ai_settings,ship_height,alien_height):# 计算屏幕可容纳多少行外星人available_space_y = (ai_settings.screen_height - (3*alien_height)-ship_height)number_rows = int(available_space_y / (2*alien_height))return number_rows# 创建外星人
def create_alien(ai_settings,screen,aliens,alien_number,row_number):# 创建一个外星人并将其放在当前行alien = Alien(ai_settings,screen)alien_width = alien.rect.widthalien.x = alien_width +2*alien_width * alien_numberalien.rect.x = alien.xalien.x = alien_width +2*alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2*alien.rect.height*row_numberaliens.add(alien)def create_fleet(ai_settings,screen,ship,aliens):# 创建外星人群# 创建一个外星人,并计算一行可以容纳多少个外星人# 外星人间距为外星人的宽度alien = Alien(ai_settings,screen) # 创建一个外星人number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)number_rows = get_number_rows(ai_settings,ship.rect.height,alien.rect.height)# 创建第一行外星人for row_number in range(number_rows):for alien_number in range(number_aliens_x):# 创建一个外星人并将其加入当前行create_alien(ai_settings,screen,aliens,alien_number,row_number)def check_fleet_edges(ai_settings,aliens):# 有外星人到达边缘时采取相应的措施for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)breakdef change_fleet_direction(ai_settings,aliens):# 将整群外星人下移, 并改变它们的方向for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *=-1
def update_aliens(ai_settings,stats,screen,ship,aliens,bullets):# 检查外星人是否到达边缘check_fleet_edges(ai_settings,aliens)# 更新外星人群中所有外星人的位置aliens.update()# 检测外星人和飞船之间的碰撞# spritecollideany接受两个参数,一个精灵和一个编组。# 它检查编组是否有成员与精灵发生了碰撞,如果没有发生碰撞,返回Noneif pygame.sprite.spritecollideany(ship,aliens):print("Ship hit!!!")if pygame.sprite.spritecollideany(ship,aliens):ship_hit(ai_settings,stats,screen,ship,aliens,bullets)check_aliens_bottom(ai_settings,stats,screen,ship,aliens,bullets)def ship_hit(ai_settings,stats,screen,ship,aliens,bullets):# 响应被外星人撞到的飞船# 将ships_left减1if stats.ships_left > 0:stats.ships_left -= 1# 清空外星人列表和子弹列表aliens.empty()bullets.empty()# 创建一群新的外星人, 并将飞船放到屏幕底端中央create_fleet(ai_settings,screen,ship,aliens)ship.center_ship()# 暂停sleep(0.5)else:stats.geme_active = Falsedef check_aliens_bottom(ai_settings,stats,screen,ship,aliens,bullets):# 检查是否有外星人到达了屏幕底端screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# 像飞船被撞到一样进行处理ship_hit(ai_settings,stats,screen,ship,aliens,bullets)break

game_stats.py

# 跟踪游戏统计信息的类,记录飞船被撞了多少次
# 在游戏运行期间之创建一个GamStats类,但当玩
# 家开始游戏时,需要重置一些统计信息,所有用
# reset_stats来初始化大部分信息
class GamStats():# 跟踪游戏的统计信息def __init__(self,ai_settings):# 初始化统计信息self.ai_settings = ai_settingsself.reset_stats()self.game_active= Truedef reset_stats(self):# 初始化在游戏运行期间可能变化的统计信息self.ships_left = self.ai_settings.ship_limit

alien_invasion.py

import sys
import pygame
from setting import Settings
from pygame.sprite import Group
from ship import Ship
import game_functions as gf
from alien import Alien
from game_stats import GamStats
def run_game():# 初始化游戏并创建一个屏幕对象pygame.init()  #初始化背景设置ai_settings = Settings()screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))#创建一个sceen窗口pygame.display.set_caption("Alien Invasion")# 创建一个用于存储游戏统计信息的实例stats = GamStats(ai_settings)#创建一艘飞船ship = Ship(ai_settings,screen)# 创建一个外星人alien = Alien(ai_settings,screen)#设置背景颜色bg_color = (230, 230, 230)# 创建一个用于存储子弹的编组,存储所有有效的子弹,# 管理发射出去的子弹bullets = Group()# 创建一个空编组,用于存储全部外星人aliens=Group()# 创建外星人群gf.create_fleet(ai_settings,screen,ship,aliens)#开始游戏的主循环#循环控制管理屏幕更新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()

Python项目实战学习 外星人入侵实现子弹射杀外星人,并且在外星人全部消灭后生成新的外星人相关推荐

  1. Python项目实战学习 外星人入侵 创建外星人飞船并实现外星人动态移动效果

    外星人入侵 本篇博客紧接上一篇博客:设置飞船发出子弹https://blog.csdn.net/Ace_bb/article/details/104845723 本篇博客实现在游戏窗口中添加动态的外星 ...

  2. Python项目实战学习 外星人入侵游戏开发总结

    外星人入侵开发总结 设置屏幕大小.游戏名称.背景颜色 pygame.init() #初始化背景设置ai_settings = Settings()screen = pygame.display.set ...

  3. Python项目实战学习案例--股票模拟交易系统

    Python学习案例–股票模拟交易系统 源代码地址:https://gitee.com/wujize188_admin/mini_stock.git 主要技术 后台:Flask框架,sqlalchem ...

  4. Python项目:《外星人入侵》代码及笔记 via:《Python变成入门到实战》

    Python项目:<外星人入侵>代码及笔记 (via:<Python变成入门到实战>) [项目代码] alien_invasion.py import pygame from ...

  5. Python项目实战:数据可视化与股票数据分析-关东升-专题视频课程

    Python项目实战:数据可视化与股票数据分析-333人已学习 课程介绍         本视频内容包括使用Matplotlib绘制图表.MySQL数据库.Python访问数据库和Lambda表达式. ...

  6. Python项目实战:使用PySpark对大数据进行分析

    Python项目实战:使用PySpark对大数据进行分析 大数据,顾名思义就是大量的数据,一般这些数据都是PB级以上.PB是数据存储容量的单位,它等于2的50次方个字节,或者在数值上大约等于1000个 ...

  7. Python项目实战:开发PetStore宠物商店项目-关东升-专题视频课程

    Python项目实战:开发PetStore宠物商店项目-487人已学习 课程介绍         课程内容包括项目分析与设计过程.数据库设计过程.项目敏捷开发.MySQL数据库.Python访问数据库 ...

  8. Python数据分析实战学习

    Python数据分析实战学习\displaystyle\boxed{Python数据分析实战学习}Python数据分析实战学习​ AprilJulyOctober2015AprilJulyOctobe ...

  9. Python项目实战 —— 01. 疾病预测结构化数据

    Python项目实战 Python项目实战--目录 Python项目实战 -- 01. 疾病预测结构化数据 一.背景 二.解题思路 三.数据分析 3.1 数据清洗 3.2 数据分析 3.2.1 相关系 ...

最新文章

  1. java对象序列化克隆_JAVA 对象克隆和序列化
  2. [crypto]-05.1-PKCS PKCS#1 PKCS#7 PKCS#11的介绍
  3. 虚拟局域网Vlan划分
  4. mysql 超长记录_谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)...
  5. MachineLearning(7)-决策树基础+sklearn.DecisionTreeClassifier简单实践
  6. python pandas库 画图_python绘图:matplotlib和pandas的应用
  7. layui select 修改_layui怎么修改select的值?
  8. MapXtreme 2005 学习心得 第八节Session问题澄清-两种配置方式致开发方式不同(九)...
  9. 六石管理学:夸大成绩,当事人自己是否知道
  10. 2017.4.16 java 获取当前时间及年月日时分秒
  11. sqlserver卸载不完全导致安装失败
  12. 计算机无法安装VC2015,解决win10安装vc ++2015提示“一个或多个问题导致了安装失败”的方法...
  13. 计算机上的按键名有哪些,电脑键盘上各个按键名称与功能作用
  14. python大数据之缺省值处理
  15. js:ajax的get方法实现简单的搜索框提示
  16. 大数据时代,你应该具备的大数据思维
  17. 韩顺平Linux教程学习笔记
  18. MATLAB学习笔记:常用统计量1
  19. 【Maya】移动、缩放、旋转、万向节旋转、冻结(未完成)
  20. 计算方法(1~3章)

热门文章

  1. HTML5学习资料推荐
  2. 华为8545m5补全shell_新版华为HS8145C5补全shell以及改华为界面
  3. 【MM32F5270开发板试用】快速移植STM32应用到MM32F5270(以OLED为例)
  4. 【Ex.】打印出菱形图案的简易方法
  5. PCI总线和PCIe总线
  6. nti是c语言合法标识符,c语言程序设计的练习.doc
  7. 验证巴德哥赫猜想(c++)
  8. 基于FPGA的VGA视频弹球游戏
  9. Solaris 使用ndd指令设置网卡速率
  10. QML VLC视频播放器