一、游戏介绍
1.游戏规则:左右键移动,空格键射击
2.游戏代码主要由一个主运行程序(alien_invasion.py)和八个模块组成:
1>主函数alinen_invasion.py
2>飞船函数ship.py
3>外星人模块alien.py
4>设置模块Setting.py
5>系统功能的模块game_function.py
6>子弹模块biu.py
7>系统信息的模块game_state.py
8>按钮模块button.py
9>计分板模块scoreboard.py

二、游戏环境搭建

  1. 本练习使用了python3.5版本
  2. pygame 模块安装,打开命令窗口,输入命令安装:
    python -m pip install pygame
  3. 游戏图片下载:
    URl:https://download.csdn.net/download/qq_35871505/18992871

三、游戏代码如下:
1.主函数alinen_invasion.py

# __author__ = 'lzc'
# -*- coding: UTF-8 -*-import sys
import pygame
from setting import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from alien import Alien
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboard
import timedef run_game():#初始化游戏并创建一个屏幕对象pygame.init()#引用settings类ai_settings=Settings()#屏幕的大小screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption("飞机大战")#创建按钮play_button = Button(ai_settings,screen,'PLAY')#创建飞船ship = Ship(ai_settings,screen)#创建存储子弹的编组bullets=Group()#创建外星人群aliens=Group()gf.create_fleet(ai_settings,screen,ship,aliens)#创建一个存储游戏统计信息的实例stats=GameStats(ai_settings)#创建记分牌sb =Scoreboard(ai_settings,screen,stats)#开始游戏的主循环while True:#监控键盘和鼠标事件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,screen,stats,sb,ship,aliens,bullets)#更新屏幕gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)#time.sleep(0.001)run_game()

2.飞船函数ship.py

# __author__ = 'lzc'
# -*- coding: UTF-8 -*-import pygame
from pygame.sprite import Sprite#需要 ship 继承Sprite,以便能够创造出飞船编组
class Ship(Sprite):def __init__(self,ai_settings,screen):super(Ship,self).__init__()   #ship继承Spriteself.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()  # 得到screen的矩形区域#将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerx  # 水平居中self.rect.bottom = self.screen_rect.bottom  # 底部#self.rect.centery=self.screen_rect.centery #置于中心#在飞船属性center中存储小数值self.center= 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值而不是rect值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_factorif self.moving_down and self.rect.bottom<self.screen_rect.bottom:self.centery+=self.ai_settings.ship_speed_factorif self.moving_up and self.rect.top>0:self.centery-=self.ai_settings.ship_speed_factor#根据self.center,更新rect对象self.rect.centerx=self.centerself.rect.centery=self.centery#飞船置于底部def botton_ship(self):self.center =self.screen_rect.centerxself.centery = self.screen_rect.bottom - 30  # 底部def blitme(self):self.screen.blit(self.image,self.rect) # 在指定位置绘制小飞机

3.外星人模块alien.py

# __author__ = 'lzc'
# -*- coding: UTF-8 -*-
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_settingsself.image = pygame.image.load('images/alien.bmp')#设置其rect属性self.rect = self.image.get_rect()  # 得到矩形区域#将其放置屏幕的左上角self.rect.x = self.rect.widthself.rect.y = self.rect.heightself.x= float(self.rect.x)def update(self):#向右移动外星人self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)self.rect.x = self.xdef blitme(self):self.screen.blit(self.image,self.rect) # 在指定位置绘制def check_edges(self):screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <=0:return True

4.设置模块Setting.py

# __author__ = 'lzc'
# -*- coding: UTF-8 -*-"""存储所有设置的类的睡醒"""class Settings():def __init__(self):#屏幕设置self.screen_width=1000self.screen_height=700self.bg_color=(230,230,230)#飞船设置self.ship_limit = 3 #飞船的数量#子弹设置self.bullet_width =8self.bullet_height=10self.bullet_color=60,60,60self.bullets_allowed=5#外星人设置#self.fleet_drop_speed = 5 #下落速度self.speedup_scale=1.1  #加快游戏的进度self.initialize_dynamic_settings()#初始化游戏def initialize_dynamic_settings(self):self.ship_speed_factor=1   # 船的速度self.bullet_speed_factor=1 #子弹的速度self.alien_speed_factor =1 #外星人的速度self.fleet_drop_speed = 5 #下落速度self.fleet_direction = 0.5 #外星人向右异动的速度self.alien_points=50   #打落外星人得分数#提升速度def increase_speed(self):self.ship_speed_factor *=self.speedup_scaleself.bullet_speed_factor *=self.speedup_scaleself.alien_speed_factor *=self.speedup_scaleself.fleet_drop_speed *=self.speedup_scale

5.系统功能的模块game_function.py

# __author__ = 'lzc'
# -*- coding: UTF-8 -*-import sys
import pygame
from bullet import Bullet
from alien import Alien
from random import randint
import time#按下按键
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_UP:ship.moving_up=Trueelif event.key==pygame.K_DOWN:ship.moving_down=True#发射子弹elif event.key == pygame.K_SPACE:fir_bullet(ai_settings,screen,ship,bullets)#松开按键
def check_keyup_events(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falseelif event.key==pygame.K_UP:ship.moving_up=Falseelif event.key==pygame.K_DOWN:ship.moving_down=Falseelif event.key==pygame.K_q:sys.exit()def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets):#监控键盘和鼠标事件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 fir_bullet(ai_settings,screen,ship,bullets):#如果没达到极限就发射一颗子弹if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings,screen,ship) #创建新子弹,并加入编组:bullets中bullets.add(new_bullet)def 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()#如果属于非活动状态,就绘制playif 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 get_number_aliens_x(ai_settings,alien_width):'''获取每行的外星人数'''avilable_space_x = ai_settings.screen_width - 2* alien_widthmuber_aliens_x= int(avilable_space_x / (2*alien_width))return muber_aliens_xdef get_number_rows(ai_settings,ship_height,alien_height):#计算可以容纳多少行外星人available_space_y=(ai_settings.screen_width - (3*alien_height)-ship_height)number_rows=int(available_space_y / (4*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)random_row=randint(1,3)#创建外星人群for row_number in range(random_row):               #行数number_aliens_x=randint(4,8)for alien_number in range(number_aliens_x):     #列数create_alien(ai_settings, screen, aliens, alien_number,row_number)def update_aliens(ai_settings,screen,stats,sb,ship,aliens,bullets):check_fleet_eages(ai_settings,aliens)aliens.update()#检测飞船和外星人碰撞if pygame.sprite.spritecollideany(ship,aliens):ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets)#检测船是否到底端check_aliens_buttom(ai_settings,screen,stats,sb,ship,aliens,bullets)def check_fleet_eages(ai_setings,aliens):#碰到边沿,采取措施for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_setings,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 ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets):if stats.ships_left > 1:stats.ships_left -= 1 #船数量减1#更新记牌分sb.prep_ship()#清空aliens.empty()bullets.empty()#新建一批外星人create_fleet(ai_settings,screen,ship,aliens)ship.botton_ship() #飞船置于底部time.sleep(1)else:stats.game_active = False#外星人到底端
def check_aliens_buttom(ai_settings,screen,stats,sb,ship,aliens,bullets):screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets) #跟撞船一样处理break#开始游戏
def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y):button_clicked= play_button.rect.collidepoint(mouse_x,mouse_y)    #检测鼠标单击是否在play的rect内if button_clicked and not stats.game_active:stats.game_active = Truepygame.mouse.set_visible(False)  #隐藏光标#重置游戏统计stats.reset_stats()#重新设置游戏的进度ai_settings.initialize_dynamic_settings()sb.prep_level()                        #显示等级sb.prep_score()                        #显示分数sb.prep_ship()                         #剩余飞船数,图片#清空外星人和子弹列表aliens.empty()bullets.empty()#'''创建一群外星人create_fleet(ai_settings,screen,ship,aliens)ship.botton_ship() #飞船置于底部else:#stats.game_active = Falsepygame.mouse.set_visible(True)#子弹和外星人碰撞的函数,杀完外星人出现新的页面
def check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):#检测子弹是否击中,第一个布尔型为True,子弹中后会消失,若为False,则不消失collisions=pygame.sprite.groupcollide(bullets,aliens,False,True)#外星人击落得分if collisions:for aliens in collisions.values():   #一个子弹撞击多个外星人的情况stats.score += ai_settings.alien_points #分数叠加sb.prep_score()                        #显示分数#新建外星人if len(aliens) == 0:bullets.empty()    #删除所有子弹#加快游戏的进度ai_settings.increase_speed()#创建一群外星人create_fleet(ai_settings,screen,ship,aliens)#等级增加stats.level += 1sb.prep_level()                        #显示等级

6.子弹模块biu.py

# __author__ = 'Administrator'
# -*- coding: UTF-8 -*-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_factorself.rect.y=self.ydef draw_bullet(self):pygame.draw.rect(self.screen,self.color,self.rect) #在屏幕上描绘子弹

7.系统信息的模块game_state.py

# __author__ = 'lzc'
# -*- coding: UTF-8 -*-class GameStats():#跟踪游戏的统计信息def __init__(self,ai_settings):self.ai_settings =ai_settingsself.reset_stats()self.game_active =False #游戏激活状态def reset_stats(self):self.ships_left = self.ai_settings.ship_limitself.score = 0 #分数self.level=1 #等级

8.按钮模块button.py

# __author__ = 'lzc'
# -*- coding: UTF-8 -*-import pygame.ftfontclass Button():def __init__(self,ai_settings,screen,msg):self.screen=screenself.screen_rect = screen.get_rect()#设置按钮self.width,self.height= 200,50self.buttom_color=(0,255,0)self.text_color=(255,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.buttom_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.buttom_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)

9.计分板模块scoreboard.py

# __author__ = 'lzc'
# -*- coding: UTF-8 -*-
import pygame
from pygame.sprite import 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 = (0,255,127)self.font = pygame.font.SysFont(None, 32)self.level_color=(255,69,0)#准备初始化得分self.prep_score()#等级self.prep_level()#剩余飞船数,图片self.prep_ship()#显示飞出数self.prep_ship()#记分函数def prep_score(self):#逗号隔开rounded_score=int(round(self.stats.score,-1))score_str = 'Score:'+"{:,}".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 = 20#等级函数def prep_level(self):level_str="Level:"+str(self.stats.level)#渲染成图形self.level_image = self.font.render(level_str, True, self.level_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+10#剩余飞船数,图片def prep_ship(self):self.ships =Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.ai_settings, self.screen)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship)#显示在屏幕上def show_score(self):self.screen.blit(self.score_image, self.score_rect) #分数显示self.screen.blit(self.level_image, self.level_rect) #等级显示self.ships.draw(self.screen)                        #显示飞船

PyhontPygame 飞船大战外星人 完整代码及资源下载相关推荐

  1. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一) 本文目录: 一.[旋转的精灵女孩]案例运行效果 二.Three.js简介 三.Three.js代码正常运行显示条件 (1)不载入 ...

  2. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三) 本篇目录: 六.完整构建整个[旋转的精灵女孩]实例 (1).新建.启动webGL工程空间 (2).构建项目的目录层次结构 (2. ...

  3. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(二)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(二) 本篇目录: 五.实例中所使用的代码语法详细解释 (1).构建一个三维空间场景 (2).选择一个透视投影相机作为观察点 (a).创 ...

  4. Jquery中使用table2excel插件实现将Html的table导出为Excel(附示例代码和资源下载)

    场景 jquery-table2excel是一款可以将HTML表格的内容导出到微软Excel电子表格中的jQuery插件. 效果 在Html中有一个表格 点击导出按钮 将其导出后 注: 博客: htt ...

  5. 2023春节祝福系列第一弹(下)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载)

    2023春节祝福系列第一弹(下) (放飞祈福孔明灯,祝福大家身体健康) (附完整源代码及资源免费下载) 目录 四.画一朵真实的祥云 (1).画一个渐变的白色径向渐变背景 (2).应用一个SVG feT ...

  6. 2023春节祝福系列第一弹(上)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载)

    2023春节祝福系列第一弹(上) (放飞祈福孔明灯,祝福大家身体健康) (附完整源代码及资源免费下载) 目录 一.前言 二.一片星光闪烁的旋转星空 (1).效果展示: (2).相关源代码 (3).语法 ...

  7. 如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

    大家好,我是Lex 喜欢欺负超人那个Lex 上次,我们用Python读取照片的GPS信息,可以获取拍摄时间.手机型号等信息,还可以对 拍摄地点进行精确定位.Java表示不服~~~ 今日重点:用Java ...

  8. Java实现智能语音朗读(完整代码+EXE程序制作)

    注意 本文主要介绍整个实现过程,一步一步跟着做,相信大家都可以完成的比我好.想要完整代码的可以跳过文章直接去文末获取,如果想要在本机上运行,请首先搭建好环境,如何搭建环境在项目的第二阶段里面. 概述 ...

  9. 【LSTM+embeddingbag】进行文本分类完整代码~

    LSTM+embeddingbag进行文本分类完整代码 需要提前下载好AG_NEWS.data数据哦(随便在网上找就行啦) 使用本地文件方法 import pandas as pd from torc ...

最新文章

  1. 第十六届智能车竞赛华南赛区纪实
  2. SQL脚本:监控当前重做日志文件使用情况
  3. (五十六)iOS多线程之NSOperation
  4. linux 新建用户、用户组 以及为新用户分配权限
  5. 视频人脸检测——OpenCV版(三)
  6. 关系数据模型和关系数据库系统
  7. Service Mesh服务网格:8种方式简化微服务部署
  8. Homebrew:无法符号链接,/ usr / local / bin不可写[关闭]
  9. 【机器学习-公开数据集免费下载】
  10. ps界面为啥突然变大了_【新手必看】使用PS绘画需要学会哪些基本操作?
  11. html中怎样做成相册的效果,CSS相册简单实现方法(功能分析及代码)
  12. SVAC1.0逆扫描反变换反量化分析
  13. 苏宁易购财报看点:加码线上业务布局,注册会员增至6.23亿人
  14. 七、基础教程-坐标轴(Axis)
  15. 基于PHP+MySQL托管中心管理系统的设计与实现
  16. 环宇成功签约世界级海外文旅夜游项目,探索夜游新模式!
  17. 使用ffmpeg剪辑视频【删除视频头部,尾部,中间,视频拼接,获取视频指定时间截图】
  18. 从Java 9 到 Java 17之Java 11
  19. Htm 转换 安卓java_Android开发 Html工具类详解
  20. 入职避坑指南(杭州)

热门文章

  1. 结合泛函极值_(二) 泛函的极值
  2. 我为什么选择博客园!
  3. SYD8811 使用外部32.768Khz晶振作为时钟源
  4. 【我的OpenGL学习进阶之旅】解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it
  5. 不坑盒子:强大的word插件,让工作更高效
  6. Android中SQLite应用详解
  7. Solr查询参数fq
  8. 专题-句向量(Sentence Embedding)
  9. 微软认证70-541,70-542等考试试题(80%以上的题目是一样的)
  10. layui中select及submit提交