个人博客页面链接:http://www.shihao.online/(django搭建的个人博客,还在完善中)

外星人入侵游戏 github源码:https://github.com/shihao1010/alien_invasion
alien_invasion.py:

#encoding:utf-8#创建pygame窗口以及响应用户输入
import sys
import pygame
from pygame.sprite import Group
#导入类Settings
from settings import Settings#导入类Ship
from ship import Ship#导入模块game_functions
import game_functions as gf#导入类Alien
from alien import Alienfrom game_stats import GameStats
from scoreboard import Scoreboard
from button import Buttondef 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")#创建游戏按钮play_button = Button(ai_settings, screen, "Play")#创建一个用于存储游戏统计信息的实例, 并创建记分牌stats = GameStats(ai_settings)sb = Scoreboard(ai_settings, screen, stats)#创建一艘飞船ship = Ship(ai_settings, screen)#创建一个用于存储子弹的编组bullets = Group()aliens = Group()#创建外星人群gf.create_fleet(ai_settings, screen, ship, aliens)#背景音乐pygame.mixer.music.load("sounds/111.mp3")pygame.mixer.music.play(loops=-1, start=0.0)music1 = pygame.mixer.Sound("sounds/222.wav")#开始游戏的主循环while True:#监视键盘和鼠标事件gf.check_events(ai_settings, screen, stats, play_button, ship, aliens, bullets, music1, sb)if stats.game_active:     #判断是否处于活动状态(是否有命)#根据移动标志调整飞船的位置ship.update()# 更新子弹位置并删除已消失的子弹  删除子弹击中的外星人gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets)#更新外星人位置gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)# 更新屏幕上的图像,并切换到新屏幕gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button)run_game()

game_functions.py

#encoding:utf-8import sys
import pygame
from bullet import Bullet
from alien import Alien
from time import sleepdef check_keydown_events(event, ai_settings, stats, screen, ship, bullets, music1):'''响应按键'''if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:#创建一颗子弹,并将其加入到编组bullets中fire_bullet(ai_settings, stats, screen, ship, bullets, music1)elif event.key == pygame.K_ESCAPE:      #按Esc退出sys.exit()def check_keyup_events(event, ship):'''响应松开'''if event.key == pygame.K_RIGHT:ship.moving_right = Falseif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(ai_settings, screen, stats, play_button, ship, aliens, bullets, music1, sb):# 监视键盘和鼠标事件for event in pygame.event.get():if event.type == pygame.QUIT:   #如果鼠标点击关闭,就退出窗口sys.exit()elif event.type == pygame.KEYDOWN:      #对KEYDOWN事件作出响应check_keydown_events(event, ai_settings, stats, screen, ship, bullets, music1)elif event.type == pygame.KEYUP:        #对KEYUP事件做出响应check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:      #对点击play按钮做出回应mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings, screen, stats, play_button, ship, aliens, bullets, mouse_x, mouse_y, sb)def check_play_button(ai_settings, screen, stats, play_button, ship, aliens, bullets, mouse_x, mouse_y, sb):'''在玩家单击Play按钮时开始新游戏'''button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not stats.game_active:#重置游戏设置ai_settings.initialize_dynamic_settings()#隐藏光标pygame.mouse.set_visible(False)#重置游戏信息stats.reset_stats()stats.game_active = True#把分数0显示出来sb.prep_score()sb.show_score()#清空外星人列表和子弹列表aliens.empty()bullets.empty()#创建一群新的外星人,并让飞船居中create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()#更新屏幕上的图像,并切换到新屏幕
def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button):# 每次循环时都重绘屏幕screen.fill(ai_settings.bg_color)#在飞船和外星人后面重绘所有子弹for bullet in bullets.sprites():       #方法bullets.sprites()返回一个列表bullet.draw_bullet()#更新飞船位置ship.blitme()#显示外星人aliens.draw(screen)#显示得分sb.show_score()#如果游戏处于非活动状态 ,就绘制Play按钮if not stats.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()#更新子弹位置并删除已消失的子弹
def update_bullets(ai_settings, screen, stats, sb, 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, stats, sb, ship, aliens, bullets)#检查是否有子弹击中了外星人如果击中了,就删除相应的子弹和外星人
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets):collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)if collisions:       #记分for aliens in collisions.values():stats.score += ai_settings.alien_points * len(aliens)sb.prep_score()check_high_score(stats, sb)#当外星人群被消灭后,删除现有的子弹并新建一群外星人, 同时加快游戏速度if len(aliens) == 0:bullets.empty()ai_settings.increase_speed()create_fleet(ai_settings, screen, ship, aliens)#如果还没有达到限制,就发射一颗子弹
def fire_bullet(ai_settings, stats, screen, ship, bullets, music1):if len(bullets) < ai_settings.bullet_allowed and stats.game_active:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)music1.play()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 / (3 * 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):'''响应被外星人撞到的飞船'''if stats.ships_left > 1:#将ships_left减1stats.ships_left -= 1#清空外星人列表和子弹列表aliens.empty()bullets.empty()#创建一群新的外星人, 并将飞船放到屏幕底端中央create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()#暂停sleep(0.5)else:stats.game_active = Falsepygame.mouse.set_visible(True)  #使光标可见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)breakdef 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)#检查是否有外星人到达屏幕底端check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets)def check_high_score(stats, sb):'''检查是否诞生了新的最高得分'''if stats.score > stats.high_score:stats.high_score = stats.scoresb.prep_high_score()

settings.py

#encoding:utf-8class Settings():"""存储《《外星人入侵》》的所有设置的类"""def __init__(self):"""初始化游戏的静态设置"""#屏幕设置self.screen_width = 1500self.screen_height = 900self.bg_color = (230, 230, 230)#飞船的设置self.ship_limit = 1      #3条命#子弹设置self.bullet_width = 3self.bullet_height = 15self.bullet_color = 250, 60, 60self.bullet_allowed = 30     #限制子弹最大数量#外星人设置self.fleet_drop_speed = 10   #外星人竖直移动速度#以什么样的速度去加快游戏节奏self.speedup_scale = 1.2#外星人点数的提高速度self.score_scale = 1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):'''初始化随游戏进行而进行的设置'''self.ship_speed_factor = 2      # 飞船速度self.bullet_speed_factor = 3      # 子弹速度self.alien_speed_factor = 1       # 外星人水平移动速度# fleet_direction为1表示向右移, 为-1表示向左移self.fleet_direction = 1#记分self.alien_points = 50000def increase_speed(self):'''提高速度设置和外星人点数'''self.ship_speed_factor *=  self.speedup_scaleself.bullet_speed_factor *=  self.speedup_scaleself.alien_speed_factor *=  self.speedup_scaleself.alien_points = int(self.alien_points * self.score_scale)print(self.alien_points)

bullet.py

#encoding:utf-8import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):'''一个对飞船发射的子弹进行管理的类'''def __init__(self, ai_setting, screen, ship):'''在飞船所处的位置处创建一个子弹对象'''super(Bullet, self).__init__()self.screen = screen#在(0,0)处创建一个表示子弹的矩形, 再设置正确的位置self.rect = pygame.Rect(0, 0 ,ai_setting.bullet_width, ai_setting.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top#存储用小数表示的子弹位置self.y = float(self.rect.y)self.color = ai_setting.bullet_colorself.speed_factor = ai_setting.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)

button.py

#encoding:utf-8import pygame.fontclass Button():def __init__(self, ai_setting, screen, msg):'''初始化按钮的属性'''self.screen = screenself.screen_rect = screen.get_rect()#设置按钮的尺寸和其他属性self.width, self.height = 200, 50self.button_color = (150, 150, 150)       #黑色self.text_color = (150, 255, 255)   #白色self.font = pygame.font.SysFont(None, 48)#创建按钮的rect对象,并使其居中self.rect = pygame.Rect(0, 0, self.width, self.height)self.rect.center = self.screen_rect.center#按钮的标签只需创建一次self.prep_msg(msg)def prep_msg(self, msg):'''将msg渲染为图像, 并将其在按钮上居中'''self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.centerdef draw_button(self):#绘制一个用颜色填充的按钮,在绘制文本self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image, self.msg_image_rect)

game_stats.py

#encoding:utf-8class GameStats():'''跟踪游戏的状态信息'''def __init__(self, ai_settings):'''初始化统计信息'''self.ai_settings = ai_settingsself.reset_stats()#让游戏一开始处于非活动状态self.game_active = False#在任何情况下都不应该重置最高得分self.high_score = 0def reset_stats(self):'''初始化在游戏运行期间可能发生的统计信息'''self.ships_left = self.ai_settings.ship_limitself.score = 0

scoreboard.py

#encoding:utf-8import pygame.fontclass Scoreboard():'''显示得分信息的类'''def __init__(self, ai_settings, screen, stats):'''初始化显示得分涉及的属性'''self.screen = screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.stats = stats#显示得分信息时使用的字体设置self.text_color = (30, 30, 30)self.font = pygame.font.SysFont(None, 38)#准备初始得分图像和包含最高得分self.prep_score()self.prep_high_score()def prep_score(self):'''将得分转换为一幅渲染的图像'''rounded_score = int(round(self.stats.score, -1))score_str = "{:,}".format(rounded_score)self.score_image = self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color)#将得分放在屏幕右上角self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def prep_high_score(self):'''将最高得分转换为渲染的图像'''high_score = int(round(self.stats.high_score, -1))high_score_str = "{:,}".format(high_score)self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color)#将最高得分放在屏幕顶部中央self.high_score_rect = self.high_score_image.get_rect()self.high_score_rect.centerx = self.screen_rect.centerxself.high_score_rect.top = self.score_rect.topdef show_score(self):'''在屏幕上显示得分'''self.screen.blit(self.score_image, self.score_rect)'''显示最高得分'''self.screen.blit(self.high_score_image, self.high_score_rect)#在屏幕上显示score:self.font2 = pygame.font.SysFont(None, 38)self.score_image2 = self.font2.render("Score:", True, self.text_color, self.ai_settings.bg_color)self.score_rect2 = self.score_image2.get_rect()self.score_rect2.right = self.score_rect.left - 10self.score_rect2.top = 20self.screen.blit(self.score_image2, self.score_rect2)

ship.py

#encoding:utf-8import pygame
import pygame.fontclass 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)#移动标志self.moving_right = Falseself.moving_left = Falsedef update(self):'''根据移动标志调整飞船的位置'''#更改飞船的center值,而不是rectif self.moving_right and self.rect.right < self.screen_rect.right:      #确保飞船不会移出屏幕self.center += self.ai_settings.ship_speed_factorif self.moving_left and self.rect.left > 0:self.center -= self.ai_settings.ship_speed_factor#根据self更新rect对象self.rect.centerx = self.centerdef blitme(self):"""在指定位置绘制飞船"""self.screen.blit(self.image, self.rect)def center_ship(self):#让飞船居中self.center = self.screen_rect.centerx'''def show_end(self):# 在屏幕上显示game over:self.text_color3 = (30, 30, 30)self.font3 = pygame.font.SysFont(None, 48)self.image3 = self.font3.render("Game over", True, self.text_color3, self.ai_settings.bg_color)self.rect3 = self.image3.get_rect()self.rect3.top = 20self.rect3.left = 100self.screen.blit(self.image3, self.rect3)print("1")
'''

alien.py

#encoding:utf-8import 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):'''如果外星人位于屏幕边缘,就返回True'''screen_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

外星人入侵游戏(Python3)相关推荐

  1. Python 外星人入侵游戏(一):武装飞船(上)

    从这周开始Python的实践学习,首先来开发一个外星人入侵游戏,这样可以对之前的概念有更深入的理解,对交互式项目有更深入的认识 来源:<Python编程:从入门到实践> 注意:游戏< ...

  2. 外星人入侵游戏源码及讲解(一)

    一.该源码的出处 以下所有的内容都来自于Python编程:从入门到实践(此书有电子版,若需要电子版,可在我的下载中查看到相关信息),该编码的源码也可以在我的下载中查看 二.为什么写? 因为书上的很多内 ...

  3. Python 外星人入侵游戏(一):武装飞船(下)

    接着做接着做接着做 来源:<Python编程:从入门到实践> 文章目录 5 重构:模块game_functions 5.1 函数check_events() 5.2 函数update_sc ...

  4. python外星人入侵游戏图片_跪求一个问题@关于外星人入侵游戏(《python编程基础从入门到实...

    我在学着编写<python编程基础从入门到实践>的"外星人入侵游戏"的时候,报错如下: Traceback (most recent call last): File ...

  5. Python外星人入侵游戏——添加飞船和外星人图片

    Python外星人入侵游戏是自己在<Python编程从入门到实践>在本书里学到的.本篇主要介绍该游戏中所需要的两个图片.分别为飞船和外星人图片. 1.首先去到 http://www.itu ...

  6. python随机出现外星人飞船_python外星人入侵游戏如何改变飞船的大小

    Python从入门到实践里的<外星人入侵> Python外星人入侵问题分享助世界上从来不缺少风景,缺少的只是欣赏的心情. Python项目外星人入侵添加爆照效果有没有原码<Pytho ...

  7. pythonturtle画飞机_浅谈pygame编写外星人入侵游戏第一步(屏幕上绘制飞机)......

    本人小白 刚开始学习python半月,到目前将python基础语法跑了一遍,不算透彻,只是有一些映像...... 于是学着做外星人入侵游戏,想从项目中深度学习,直接上目前的效果图: --------- ...

  8. python项目练习——外星人入侵游戏(一)——武装飞船

    此项目是自学<python编程从入门到实践>这本书时,对着其中的项目进行练习,代码均按照书中代码来敲写,可以运行成功. 首先先建立alien_invasion.py所有代码的调用在此执行 ...

  9. python编程入门到实践学习笔记——外星人入侵游戏pygame(一 武装飞船)

    python编程--外星人入侵游戏pygame(一) 外星人入侵游戏一:武装飞船 安装Pygame 创建窗口及响应用户输入 更改屏幕背景色 创建设置类 创建ship飞船类 重构game_functio ...

  10. python外星人入侵游戏代码大全-Python外星人入侵游戏开发—重构键盘鼠标响应代码...

    用法分析 在大型项目中,经常需要在添加新代码前重构既有代码.重构旨在简化既有代码的结构,使其更容易扩展.在本节中,我们将创建一个名为game_functions 的新模块,它将存储大量让游戏<外 ...

最新文章

  1. SQLSERVER自动定时(手动)备份工具
  2. Codeforces Round #524 Div. 2 翻车记
  3. C++字符输入getchar()和字符输出putchar()
  4. Idea 封装Java代码片段 快速提示
  5. 1612D. X-Magic Pair
  6. oracle oci.dll的作用,ASP.NET bin目录中的Oracle oci.dll无法删除/不起作用
  7. 用navicat连接数据库报错:1130-host ... is not allowed to connect to this MySql server如何处理
  8. 查询没有走索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!...
  9. 21. Kotlin学习笔记 (一) 基本语法
  10. 事件对象以及事件委托(pink老师笔记)
  11. BZOJ 3689: 异或之
  12. 小猫钓鱼纸牌游戏java_C语言实现纸牌游戏(小猫钓鱼)
  13. oracle interval加一秒,oracle 用interval时间计算_20170216
  14. ElasticSearch Aggs的一些使用方法
  15. BIOS没有开启虚拟化问题disabled by bios
  16. Spring属性注入的三种方式(超详细)
  17. 去掉图片水印方法 小技巧
  18. uniapp 微信小程序实现路线规划导航
  19. java格式化时间字符串 毫秒_SimpleDateFormat是否有格式字符串来获取毫秒日期时间值,而不是人类可读的格式?...
  20. 树莓派 SPI,I2C,UART串行总线介绍

热门文章

  1. 帝国cms 未审核 showinfo.php,帝国CMS评论列表标签showplinfo调用会员头像userpic的方法...
  2. Java IDE漫谈(一)
  3. 赵小楼《天道》《遥远的救世主》深度解析(35)你觉得叶晓明、冯世杰、刘冰是底层吗?
  4. Practical Test Reminders, Character Arrays, C-Strings
  5. python爬虫实践(三)——爬取煎蛋网图片
  6. 愿岁月流成花海,你我结伴而行
  7. 程序员谨防加班猝死的十大建议
  8. MATLAB强化学习入门——五、倒立摆的DQN神经网络控制
  9. MySQL的引擎初识
  10. canoe模拟发有checksum报文_CANoe 入门 Step by step系列(三)简单例子的剖析