https://pan.baidu.com/s/1OoUksHYCAo1f5K2S0TZ4oA
提取码:kdvy

这是主程序,最后也是运行该程序

import pygame
import sys
from settings import Settings
from ship import Ship
import game_function as gf
from pygame.sprite import Group
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboarddef 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的按钮play_button=Button(ai_settings,screen,"Play")#创建一个用于存储游戏统计信息的实例,并创建记分牌stats=GameStats(ai_settings)sb=Scoreboard(ai_settings,screen,stats)#创建一艘飞船。一个子弹编组,一个外星人编组#调用ship类并创建一艘飞船ship=Ship(ai_settings,screen)#创建一个用于存储子弹的群组bullets=Group()#创建一个用于存储子弹的群组aliens=Group()#创建外星人群gf.create_fleet(ai_settings,screen,ship,aliens)#主循环:while True:#调用game_function类,gf.check_events(ai_settings, screen, stats, sb,play_button, ship, aliens,bullets)if stats.game_active:#如果游戏还处于活动状态#更新飞船ship.update()#更新子弹位置的函数gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)#更新外星人位置的函数gf.update_aliens(ai_settings,stats,sb,screen,ship,aliens,bullets)#更新屏幕函数gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)run_game()
'''
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 update(self):'''向左或者向右移动外星人'''self.x+=(self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction)self.rect.x=self.xdef check_edges(self):'''如果外星人位于屏幕边缘,就返回True'''screen_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 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)
'''
button.py  主要实现Play的button
'''
import pygame.font
class Button():def __init__(self, ai_settings, screen, msg):"""Initialize button attributes."""self.screen = screenself.screen_rect = screen.get_rect()# Set the dimensions and properties of the button.self.width, self.height = 200, 50self.button_color = (0, 255, 0)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 48)# Build the button's rect object, and center it.self.rect = pygame.Rect(0, 0, self.width, self.height)self.rect.center = self.screen_rect.center# The button message only needs to be prepped once.self.prep_msg(msg)def prep_msg(self, msg):"""Turn msg into a rendered image, and center text on the button."""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):# Draw blank button, then draw message.self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image, self.msg_image_rect)
'''
game_function 最主要的模块,定义了该游戏的所有功能
'''
import sys
import pygame
from bullet import Bullet
from alien import Alien
from time import sleepdef check_events(ai_settings, screen, stats, sb ,play_button, ship, aliens,bullets):"""Respond to keypresses and mouse events."""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings, screen, stats,sb,play_button,ship, aliens, bullets, mouse_x, mouse_y)def check_keydown_events(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_SPACE:#空格键fire_bullet(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:  # 按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 update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):'''更新屏幕的图像,并切换到新屏幕'''screen.fill(ai_settings.bg_color)#在飞船和外星人后面重绘所有的子弹for bullet in 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 fire_bullet(ai_settings,screen,ship,bullets):'''如果没达到限制,就发射一颗子弹'''# 创建一颗子弹,并将其加入到编组bullets中if len(bullets) < ai_settings.bullet_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def create_fleet(ai_settings,screen,ship,aliens):'''创建外星人群'''#外星人间距就是外星人宽度alien=Alien(ai_settings,screen)number_aliens_x=get_number_aliens(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 get_number_aliens(ai_settings,alien_width):'''计算每行可容纳多少外星人'''available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width) + 1)  # 加一是因为屏幕正好多一个外星人的空位return number_aliens_xdef 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 get_number_rows(ai_settings,ship_height,alien_height):'''计算屏幕可容纳多少行外星人'''avaiable_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)number_rows=int(avaiable_space_y/(2*alien_height))return number_rowsdef update_aliens(ai_settings,stats,sb,screen,ship,aliens,bullets):'''检查是否有外星人位于屏幕边缘,并更新整群外星人的位置'''check_fleet_edges(ai_settings, aliens)aliens.update()#检测外星人和飞船之间的碰撞if pygame.sprite.spritecollideany(ship,aliens):ship_hit(ai_settings, stats, sb, screen, ship, aliens, bullets)print('ship hited!')check_aliens_bottom(ai_settings,stats,sb,screen,ship,aliens,bullets)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 check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):'''响应子弹和外星人的碰撞'''#删除发生碰撞的子弹和外星人# 检查是否有子弹击中外星人# 如果是这样,就删除相应的子弹与外星人collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)if collisions:for alien in collisions.values():stats.score+=ai_settings.alien_points*len(aliens)sb.prep_score()check_high_score(stats,sb)stats.score+=ai_settings.alien_pointssb.prep_score()# 删除已消失的子弹if len(aliens) == 0:# 删除现有的子弹并新建一群外星人,加快游戏节奏bullets.empty()ai_settings.increase_speed()# 提高等级stats.level += 1sb.prep_level()create_fleet(ai_settings, screen, ship, aliens)def ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets):'''响应被外星人撞到的飞船'''if stats.ships_left>0:#将ships_left减1stats.ships_left -= 1#清空外星人列表和子弹列表aliens.empty()bullets.empty()#创建一群新的外星人,并将飞船放到屏幕的中央create_fleet(ai_settings,screen,ship,aliens)#把飞船居中ship.center_ship()# 暂停sleep(0.5)#更新记分牌sb.prep_ships()else:stats.game_active=Falsepygame.mouse.set_visible(True)def check_aliens_bottom(ai_settings,stats,sb ,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,sb,screen,ship,aliens,bullets)breakdef check_play_button(ai_settings, screen, stats, sb, play_button, ship,aliens, bullets, mouse_x, mouse_y):"""Start a new game when the player clicks Play."""button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not stats.game_active:# Reset the game settings.ai_settings.initialize_dynamic_settings()# Hide the mouse cursor.pygame.mouse.set_visible(False)# Reset the game statistics.stats.reset_stats()stats.game_active = True# 重置记分牌图像sb.prep_score()sb.prep_high_score()sb.prep_level()sb.prep_ships()# Empty the list of aliens and bullets.aliens.empty()bullets.empty()# Create a new fleet and center the ship.create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()def check_high_score(stats,sb):'''检查是否诞生了新的最高得分'''if stats.score>stats.high_score:stats.high_score=stats.scoresb.prep_high_score()
'''
game_stats.py  记录游戏的状态
'''
class GameStats():'''跟踪游戏统计消息'''def __init__(self,ai_settings):'''初始化统计消息'''self.ai_settings=ai_settingsself.reset_stats()#游戏刚启动时处于非活动状态self.game_active=False#在任何情况下都不应重置最高得分(因此只能在Init里初始化,而不应该在reset里初始化)self.high_score=0def reset_stats(self):'''初始化在游戏运行时间可能变化的统计信息'''self.ships_left=self.ai_settings.ship_limitself.score = 0self.level = 1
'''
scoreboard.py 定义游戏计分板
'''
import pygame.font
from pygame.sprite import Sprite, Group
from ship import Shipclass 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,48)#准备包含最高得分和当前得分的图像self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):'''将得分转换为一幅渲染的图像'''rounded_score=int(round(self.stats.score,-1))score_str='{:,}'.format(rounded_score)score_str=str(self.stats.score)self.score_image=self.font.render(score_str,True,self.text_color,self.ai_settings.bg_color)#将得分放在屏幕的右上角#创建一个rect,使rect始终离右边缘20像素,上边缘20像素self.score_rect=self.score_image.get_rect()self.score_rect.right=self.score_rect.right-20self.score_rect.top=20def show_score(self):'''在屏幕上显示得分'''self.screen.blit(self.score_image,self.score_rect)self.screen.blit(self.high_score_image, self.high_score_rect)self.screen.blit(self.level_image,self.level_rect)#绘制飞船self.ships.draw(self.screen)def 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.screen_rect.topdef prep_level(self):'''将等级转换为渲染的图像'''self.level_image=self.font.render(str(self.stats.level),True,self.text_color,self.ai_settings.bg_color)#将等级放在得分下方self.level_rect=self.level_image.get_rect()self.level_rect.right=self.score_rect.rightself.level_rect.top=self.score_rect.bottom+10def prep_ships(self):'''显示还余下多少艘飞船'''self.ships=Group()for ship_number in range(self.stats.ships_left):ship=Ship(self.ai_settings,self.screen)ship.rect.x=ship.rect.right+(ship_number+4)*ship.rect.widthship.rect.y=10self.ships.add(ship)
'''
定义游戏的一些设置
'''
class Settings():'''存储(外星人入侵)的所有设置的类''''''初始化游戏的静态设置'''def __init__(self):'''初始化游戏的设置'''#屏幕设置self.screen_width=900self.screen_height=600self.bg_color=(230,230,230)#飞船速度设置self.ship_speed_factor = 1.2self.ship_limit=3#飞船最大生命值为3#子弹设置self.bullet_speed_factor=1self.bullet_width=3self.bullet_height=15self.bullet_color=(60,60,60)self.bullet_allowed=5#外星人速度设置self.alien_speed_factor=0.5self.fleet_drop_speed=4#以什么样的速度加快游戏节奏self.speedup_scale=1.1self.score_scale=1.5self.initialize_dynamic_settings()#fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction=1def initialize_dynamic_settings(self):'''初始化随游戏进行而变化的设置'''self.ship_speed_factor=1.5self.bullet_speed_factor=3self.alien_speed_factor=1#fleet_direction为1表示向右;为-1表示向左self.fleet_direction=1#计分self.alien_points=50def 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)#这句print只是测试语句,正常运行会影响游戏性能与玩家注意力
'''
ship.py 定义飞船类的实现
'''import pygame
from pygame.sprite import Sprite
class Ship(Sprite):def __init__(self,ai_settings,screen):'''初始化飞船并设置其初始位置'''super(Ship,self).__init__()self.screen=screen#调用外部的设置self.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#在飞船的属性centerx中存储小数值self.center=float(self.rect.centerx)#控制飞船移动self.moving_right=Falseself.moving_left=False#控制飞船移动速度def update(self):'''根据移动标志调整飞船的位置'''#更新飞船的center值,而不是rect值#if条件更新,还要判断是否到屏幕边缘if 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_factorself.rect.centerx=self.centerdef blitme(self):'''在指定位置绘制飞船'''self.screen.blit(self.image,self.rect)def center_ship(self):'''让飞船在屏幕居中'''self.center=self.screen_rect.centerx

利用python实现外星人入侵大战小游戏(带源代码)相关推荐

  1. 【python】飞机大战小游戏练习

    飞机大战小游戏练习 一.前提准备 二.制作步骤 1.库的导入与初始化 2.窗口操作 3.键盘按键监听相关操作 4.添加游戏背景 5.加载玩家飞机 6.获取玩家飞机矩阵 三.完整代码编写 游戏背景类编写 ...

  2. python制作阴阳师脚本_利用python制作一个阴阳师小游戏

    利用python制作一个阴阳师小游戏 发布时间:2020-11-27 13:59:49 来源:亿速云 阅读:84 这期内容当中小编将会给大家带来有关利用python制作一个阴阳师小游戏,文章内容丰富且 ...

  3. Python实现飞机大战小游戏,详解每一行代码【不收藏都对不起我】

    一.模块 1. 利用 pip 安装 pygame 模块 Windows系统下的安装参考如下文章: https://blog.csdn.net/qq_38721302/article/details/8 ...

  4. Python实现飞机大战小游戏,详解每一行代码!

    一.模块 1. 利用 pip 安装 pygame 模块 Windows系统下的安装参考如下文章: https://blog.csdn.net/qq_38721302/article/details/8 ...

  5. python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!

    导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环 ...

  6. pygame为游戏添加背景_用 Python 制作飞机大战小游戏

    这这次用Python中的pygame模块来完成一个飞机大战的小游戏:基本思路是通过方向键来控制飞机的左右移动射击飞船.先来看下最后的效果为了新手也能完成,本文记录了编写的全部流程,也就是每次修改的代码 ...

  7. 福利来啦,送给大家利用Python做出的一个小游戏源码,不要错过哟

    从小到大玩过很多的游戏,在我小时候,能玩游戏的地方不多,那时玩游戏都是偷摸玩的,只要是个游戏就觉得非常有趣,比较经典的有魂斗罗,拳皇,超级玛丽,贪吃蛇,俄罗斯方块等游戏:发展到现在,玩游戏已经成为生活 ...

  8. 利用python制作自己的小游戏,超简教程

    懒得客套,直接步入主题 首先,利用python来做游戏需要用到python中的pygame模块,这个我们在终端cmd中安装 输入:pip install pygame 安装好后我们进入pycharm查 ...

  9. 利用python实现猜数字小游戏

    首先启动软件,因为mac环境所以用Command+N(windows:Ctrl+N)新建文本式交互窗口,再Command+S(windows:Ctrl+S)先保存好位置 接下来开始编辑代码 #猜数字游 ...

最新文章

  1. Winform中给DataGridView添加多选框列并获取选中行的内容
  2. 云起实验室有奖征文,精美好礼等你来领——《我的linux初体验》
  3. 机器学习基于skcilearn tensorflow电子书_Tensorflow机器学习模型的跨平台上线
  4. JS_高程3.基本概念(2)
  5. 一文了解授信审批策略及流程
  6. kuangbin专题-最短路练习
  7. 游戏音效常见格式以及优缺点
  8. photoshopcs6快捷键
  9. html简单登录页面代码
  10. Three.js加载OBJ模型或FBX模型
  11. 微信公众号如何分享课件PPT?
  12. 三分钟下载好mysql-8.0.16
  13. CMUSphinx免费离线语音识别开源库教程iOS开发
  14. windows server 2016磁盘安全与管理_磁盘管理工具哪一款好用?
  15. 云服务器 架设传奇_阿里云虚拟主机,ECS服务器,轻量应用服务器有什么区别,该如何选择?...
  16. 记一次EFCore类型转换错误及解决方案
  17. Python内置函数(知识总结篇)
  18. python使用继承开发动物和狗
  19. 趣谈 DHCP 协议,有点意思。
  20. 2008年北京奥运会:出现可能性极高的十句话

热门文章

  1. DELL 1420 加装SSD
  2. 【Android】虚拟环绕声
  3. Python之计算π值
  4. Termux搭建图形化环境及tk开发
  5. 2021-05-11 MongoDB面试题 MongoDB是什么
  6. 传小米要在A股港股同时上市;车好多完成8亿美元融资;三星市值蒸发近600亿美元丨价值早报
  7. 你如何理解目前市面上流行的贷款软件?
  8. 不怕加班狗有情绪,就怕加班狗有“武器”
  9. Android-smart-image-view加载网络图片
  10. Android Killer中apktool插件更新