alien_invasion.py

import sysimport pygamefrom pygame.sprite import Group
from settings import Settings
from game_stats import GameStats
from ship import Ship
from alien import Alien
import game_functions as gfdef run_game():#初始化游戏并创建一个屏幕对象pygame.init()ai_settings = Settings()screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))pygame.display.set_caption("Alien Invasion")#创建一个用于存储游戏统计信息的实例stats = GameStats(ai_settings)#创建一艘飞船ship = Ship(ai_settings, screen)#创建一个存储子弹的编组bullets = Group()#创建一个外星人编组aliens = Group()#创建外星人群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()

game_functions.py

import sys
from time import sleepimport pygamefrom bullet import Bullet
from alien import Aliendef check_keydown_event(event, ai_settings, screen, ship, bullets):#相应按键if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_UP:ship.moving_up = Trueelif event.key == pygame.K_DOWN:ship.moving_down = Trueelif event.key == pygame.K_SPACE:#创建一颗子弹,并将其加入到编组bullets中fire_bullet(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:sys.exit()def check_keyup_event(event, ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falseif event.key == pygame.K_UP:ship.moving_up = Falseelif event.key == pygame.K_DOWN:ship.moving_down = Falsedef check_events(ai_settings, screen, ship, bullets):#监视键盘和鼠标事件for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_event(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_event(event, ship)def update_bullets(ai_settings, screen, ship, aliens, bullets):#更新子弹的位置,并删除已消失的子弹bullets.update()#删除已消失的子弹for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets)def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):#相应子弹和外星人的碰撞#删除发生碰撞的子弹和外星人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 update_screen(ai_settings, screen, ship, aliens, bullets):#更新屏幕上的图像,并切换到新屏幕#每次循环时都重绘屏幕screen.fill(ai_settings.bg_color)#在飞船和外星人后面重绘所有子弹for bullet in bullets:bullet.draw_bullet()#子弹绘制ship.blitme()aliens.draw(screen)#让最近绘制的屏幕可见pygame.display.flip()def get_number_aliens_x(ai_settings, alien_width):#计算可容纳多少个外星人available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_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_rowsdef 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.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 *= -1def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):#响应被外星人撞到的飞船#将ships_left减1stats.ships_left -= 1#清空外星人列表和子弹列表aliens.empty()bullets.empty()#暂停sleep(0.5)#创建一群新的外星人,并将飞船放在屏幕底端中央create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()def update_aliens(ai_settings, stats, screen, ship, aliens,bullets):#检查是否有外星人位于屏幕边缘,然后更新所有外星人群的位置check_fleet_edges(ai_settings, aliens)aliens.update()#检测外星人和飞船之间的碰撞if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, stats, screen, ship, aliens, bullets)

settings.py

class Settings():#《外星人入侵》的所有设置的类""def __init__(self):#初始化游戏的设置""#屏幕设置self.screen_width = 1200self.screen_height = 700self.bg_color = (255, 192, 203)#飞船的设置self.ship_speed_factor = 1.5self.ship_limit = 3#外星人设置self.alien_speed_factor = 1self.fleet_drop_speed = 10#fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction = 1#子弹设置self.bullet_speed_factor = 3self.bullet_width = 300self.bullet_height = 15self.bullet_color = 60, 60, 60self.bullets_allowed = 3

ship.py

import pygameclass 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.centery = self.screen_rect.centeryself.rect.bottom = self.screen_rect.bottom#在飞船的属性center中存储小数值self.centerx = float(self.rect.centerx)self.centery = float(self.rect.centery)#移动标志self.moving_right = Falseself.moving_left = Falseself.moving_up = Falseself.moving_down = Falsedef update(self):#根据移动标志调整飞船的位置#更新飞船的center值而不是rectif self.moving_right and self.rect.right < self.screen_rect.right:self.centerx += self.ai_settings.ship_speed_factorif self.moving_left and self.rect.left > 0:self.centerx -= self.ai_settings.ship_speed_factorif self.moving_up and self.rect.top > self.screen_rect.top:self.centery -= self.ai_settings.ship_speed_factorif self.moving_down and self.rect.bottom < self.screen_rect.bottom:self.centery += self.ai_settings.ship_speed_factor#根据self.center更新rect对象self.rect.centerx = self.centerxself.rect.centery = self.centerydef blitme(self):#在指定位置绘制飞船self.screen.blit(self.image, self.rect)def center_ship(self):self.centerx = float(600)self.centery = float(675)

alien.py

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

bullet.py

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):#一个对飞船发射的子弹进行管理的类def __init__(self, ai_settings, screen, ship):#在飞船所处位置创建一个子弹对象super(Bullet, self).__init__()self.screen = screen#在(0,0)处创建一个表示子弹的矩形,再设置正确的位置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_stats.py

class GameStats():#跟踪游戏的统计信息def __init__(self, ai_settings):#初始化统计信息self.ai_settings = ai_settingsself.reset_stats()def reset_stats(self):#初始化在游戏运行期间可能变化的统计信息self.ships_left = self.ai_settings.ship_limit

飞船撞击到外星人后,返回不了底部中央,只能手动设置参数,明天好好研究一下相关推荐

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

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

  2. group by 分组后 返回的是一个同属性的集合

    group by 分组后 返回的是一个同属性的集合  我们可以遍历该集合 转载于:https://www.cnblogs.com/classmethond/p/10164326.html

  3. ACMNO.14一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数 输入 M N 输出 它在第N次落地时反弹多高?共经过多少米

    题目描述 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下.它在第N次落地时反弹多高?共经过多少米? 保留两位小数 输入 M N 输出 它在第N次落地时反弹多高?共经过多少米? 保留两位小数 ...

  4. android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序   在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...

  5. 网格搜索后返回的就是最佳的模型

    网格搜索后返回的就是最佳的模型 https://www.cnblogs.com/tszr/p/10802661.html  clf=RandomizedSearchCV(LogisticRegress ...

  6. Spring MVC全局异常后返回JSON异常数据

    Spring MVC全局异常后返回JSON异常数据 参考文章: (1)Spring MVC全局异常后返回JSON异常数据 (2)https://www.cnblogs.com/exmyth/p/560 ...

  7. Spring Security 实战:登录成功后返回 JWT Token

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 170元买400元书的机会又来啦! 1. 前言 欢迎阅读 Spring Security 实 ...

  8. form + iframe 获取表单提交后返回的数据

    原理: submit 提交表单没有回调函数,但是可以用iframe来接收返回结果,最后进行格式转换就ok了: 原文地址: http://blog.csdn.net/simeng_1016/articl ...

  9. Python:cv2.imread读入图片后返回NoneType的解决方案

    cv2.imread读入图片后返回NoneType的解决方案 这里用的是Spyder 重点 如果文件和图片不在一个文件夹下,工作目录也不一致,按照上面代码也会输出NoneType,这时需要把路径写好: ...

最新文章

  1. SQL SERVER 2008不能修改表的解决方法(增加字段、修改字段名)(未解决)
  2. 孙连伟 java_java(jsp)简单实现数据库学生信息的增删改查案例
  3. 第十一届蓝桥杯java B组第二场-试题A: 门牌制作
  4. npm install 报错 :stack Error: Can't find Python executable python
  5. 工作239:内容过长省略号失败 直接改的样式表
  6. ssh-copy-id命令不存在_Redis(三)- 常见命令
  7. 快速排序 (随机选择pivot)
  8. IDEA中Git合并冲突
  9. 基于asp.net mvc的近乎产品开发培训课程(第四讲)
  10. Mustache.js语法
  11. Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用
  12. mess组网 中继_Mesh路由和无线中继的差距在哪里?谁才是更好的选择?
  13. JAVA基础知识点大全之一
  14. Gantt(甘特图)与PERT(项目计划评审技术)图各自的缺陷
  15. 微信公众号网页授权--前端获取code及用户信息(vue)【简单详细版】
  16. Redis(十一) -- Redis数据结构(八) -- Geo
  17. 编程基础 - 线索二叉树 (Threaded Binary Tree)
  18. mysql主从skip1677_mysql主从复制部署
  19. 10分钟用Python制作恋爱日志!
  20. ISO 32000-2 国际标准7.7

热门文章

  1. 免费工具iFRPFILE All in One 2.7.1免费工具
  2. 8月图书畅销榜:经典书霸屏,AI持续火爆《深度学习》拔头筹
  3. 入选“清华书单”和“中华优秀科普图书榜”​:《追问人工智能:从剑桥到北京...
  4. linux模仿mac os,创新or抄袭?仿苹果OS开源Pear Linux体验
  5. 阿里沈询直播 分布式事务一
  6. 解决error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8U
  7. c语言实例 魔术师的猜牌术(1),C语言实例:魔术师的猜牌术(2)
  8. hipaa_构建符合HIPAA的服务。
  9. 聚合支付行业术语,你get到了吗?
  10. 【技术分享】TestFlight测试的流程文档