简介:一共分为2个py文件,分别是主类、和精灵类

飞机大战图片地址:链接: https://pan.baidu.com/s/18T6n9JFIDxBqYX9CnHi7ZQ  密码: tqbr

注释:项目启动后如果报libpng warning: iCCP: known incorrect sRGB profile无须处理,不会影响项目和代码,视觉洁癖可以直接百度搜索这个错误提示,网上有解决办法

ps:因为图片是png格式,而libpng-1.6以上版本增强了ICC profiles检查,所以才会警告

plane_main.py(启动主类)

import pygameimport plane_spritesclass PlanGame(object):"""飞机大战-主体类"""def __init__(self):"""初始化"""pygame.init()# 创建窗口self.screen = pygame.display.set_mode(plane_sprites.SCREEN_RECT.size)# 创建游戏时钟对象self.clock = pygame.time.Clock()# 创建精灵组self.__create_sprites()# 定时器 - 创建敌机 1s (USEREVENT是一个常量,可以通过+1来改变此常量)pygame.time.set_timer(pygame.USEREVENT, 1000)# 定时器 - 主机子弹 0.5spygame.time.set_timer(pygame.USEREVENT + 1, 500)def start_game(self):"""启动游戏:return:"""while True:# 执行循环中游戏时钟的频率self.clock.tick(plane_sprites.FRAME_PER_SEC)# 事件监听self.__event__handler()# 碰撞检测self.__check_collide()# 更新/绘制精灵族self.__update_sprites()# 更新显示pygame.display.update()def __create_sprites(self):"""创建/绘制精灵族:return:"""# 创建背景精灵和精灵组bg_one = plane_sprites.BackGround(False)bg_two = plane_sprites.BackGround(True)self.back_group = pygame.sprite.Group(bg_one, bg_two)# 创建敌机精灵组self.enemy_group = pygame.sprite.Group()# 创建主机精灵组self.me = plane_sprites.Me()self.me_group = pygame.sprite.Group(self.me)# 创建敌机子弹摧毁精灵组self.destroy_group = pygame.sprite.Group()def __event__handler(self):"""事件监听:return:"""for e in pygame.event.get():# 点击关闭游戏窗口if e.type == pygame.QUIT:# 退出pygamepygame.quit()# 终止程序exit()elif e.type == pygame.USEREVENT:# 添加敌机精灵到精灵组中self.enemy = plane_sprites.Enemy()self.enemy_group.add(self.enemy)elif e.type == pygame.USEREVENT + 1:self.me.me_bullet()# 获取所有按键的元组keys_pressed = pygame.key.get_pressed()# 主机左右移动if keys_pressed[pygame.K_RIGHT]:self.me_group.update(True, False)elif keys_pressed[pygame.K_LEFT]:self.me_group.update(True, True)def __check_collide(self):"""碰撞检测:return:"""# 主机被毁if self.me.state == 4:# 游戏结束self.__game_over()# 检测子弹与敌机碰撞(敌机先不销毁,注意!顺序必须是敌机在前,否则下面for循环拿不到explode_index)d_group = pygame.sprite.groupcollide(self.enemy_group, self.me.bullet_group, False, True)# 将碰撞敌机精灵添加到敌机子弹摧毁精灵组self.destroy_group.add(d_group)for enemy in self.destroy_group:# 爆炸状态为0 代表未摧毁,此处改为1待摧毁if enemy.enemy_explode_index == 0:enemy.enemy_explode_index = 1# 摧毁完毕后删除精灵elif enemy.enemy_explode_index == 5:self.destroy_group.remove_internal(enemy)self.enemy_group.remove_internal(enemy)# 检测主机与敌机碰撞d_me = pygame.sprite.spritecollide(self.me, self.enemy_group, True)if len(d_me) > 0:# 主机爆炸self.me.state = 3def __update_sprites(self):"""更新/绘制精灵组:return:"""# 背景精灵组更新self.back_group.update()self.back_group.draw(self.screen)# 敌机精灵组更新self.enemy_group.update()self.enemy_group.draw(self.screen)# 主机精灵组更新self.me_group.update()self.me_group.draw(self.screen)# 子弹精灵组更新self.me.bullet_group.update()self.me.bullet_group.draw(self.screen)@staticmethoddef __game_over():"""游戏结束:return:"""pygame.quit()exit()if __name__ == '__main__':# 创建游戏对象game = PlanGame()# 启动游戏game.start_game()

plane_sprites.py(精灵类)

import randomimport pygame.sprite# 窗口大小 480像素 * 700像素
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新的帧频
FRAME_PER_SEC = 60class GameSprite(pygame.sprite.Sprite):"""飞机大战-精灵类"""def __init__(self, image_url, speed=1):"""初始化:param image_url: 图片路径:param speed: 移动频率(默认1)"""# 使用super调用父类初始化(继续类不是Object,则需要调用)super().__init__()# 绘制图片self.image = pygame.image.load(image_url)# 获取坐标、宽高self.rect = self.image.get_rect()# 移动频率self.speed = speeddef update(self):"""更新精灵位置"""self.rect.y += self.speedclass BackGround(GameSprite):"""飞机大战-背景类"""def __init__(self, is_alt):"""背景图片初始化"""super().__init__("./images/background.png")# 定义图片y值if is_alt:self.rect.y = self.rect.heightdef update(self):"""更新图片位置"""super().update()# 背景图片大于屏幕高度则赋值当前窗口高度的负数值if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.heightclass Enemy(GameSprite):"""飞机大战-敌机类"""def __init__(self):"""敌机初始化"""super().__init__("./images/enemy1.png")# 指定敌机的随机速度self.speed = random.randint(1, 3)# 指定敌机的随机位置(窗口宽度-敌机宽度)self.rect.bottom = 0self.rect.x = random.randint(0, SCREEN_RECT.width - self.rect.width)# 敌机爆炸状态 0:未摧毁 1:待摧毁 1-4:摧毁中 5:已摧毁self.enemy_explode_index = 0def update(self):"""更新敌机位置"""super().update()# 敌机大于当前窗口高度时从精灵组里删除敌机if self.rect.y > SCREEN_RECT.height:self.kill()# 已销毁敌机if self.enemy_explode_index == 5:return# 敌机爆炸if self.enemy_explode_index != 0:new_rect = self.rectsuper().__init__("./images/enemy1_down%d.png" % self.enemy_explode_index)self.enemy_explode_index += 1self.rect = new_rectclass Me(GameSprite):"""飞机大战-主机类"""def __init__(self):"""主机初始化"""super().__init__("./images/me1.png", 0)# 指定主机的x轴中心位置self.rect.centerx = SCREEN_RECT.centerx# 指定主机的位置y轴位置(窗口宽度-敌机宽度-50)self.rect.y = SCREEN_RECT.height - self.rect.height - 50# 创建子弹精灵组self.bullet_group = pygame.sprite.Group()# 主机爆炸状态 1:喷气 2:不喷气 3:摧毁 4:已摧毁self.state = 1# 主机爆炸进度 1-4self.progress = 1def update(self, is_move=False, is_left=False):"""更新主机位置:param is_move: 是否移动:param is_left: 是否左移动:return:"""# 获取上个精灵的位置new_rect = self.rect# 喷气和不喷气相互切换if self.state == 1:super().__init__("./images/me2.png")self.state = 2elif self.state == 2:super().__init__("./images/me1.png")self.state = 1# 主机被摧毁else:super().__init__("./images/me_destroy_%d.png" % self.progress)self.rect = new_rect# 主机已被摧毁if self.progress != 4:self.progress += 1else:self.state = 4return# 将上个精灵的位置赋值到新的精灵上self.rect = new_rectif not is_move:return# 左右移动if is_left and self.rect.x > 0:self.rect.x -= 2elif not is_left and self.rect.right < SCREEN_RECT.width:self.rect.x += 2def me_bullet(self):"""主机添加子弹:return:"""for i in range(0, 3):# 添加子弹精灵到精灵组中bullet = Bullet()# 子弹x+y轴位置bullet.rect.y = self.rect.y - i * 20bullet.rect.x = self.rect.centerx# 将子弹精灵添加到精灵组中self.bullet_group.add(bullet)class Bullet(GameSprite):"""飞机大战-子弹类"""def __init__(self):"""子弹初始化"""super().__init__("./images/bullet2.png", -2)def update(self):"""发射子弹:return:"""super().update()# 子弹y轴高度小于等于0时从精灵组里删除if self.rect.y <= 0:self.kill()

Python飞机大战(完整版)相关推荐

  1. Python坦克大战完整版

    图片和音效自己自行在网上下载即可. import pygame,time,random from pygame.sprite import Sprite #定义常量 SCREEN_WIDTH = 75 ...

  2. python入门教程完整版(懂中文就能学会)-Python入门教程完整版(懂中文就能学会)...

    不过小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习, ...

  3. Python入门教程完整版

    今天本宝宝给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 言归正传,我来给大家介绍一下这套教程,希望每个小伙伴都沉迷学习,无法自拔! 本套教程学习时间15天 1-3天内容:为Linu ...

  4. Python入门教程完整版(懂中文就能学会)

    今天本宝宝给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 言归正传,我来给大家介绍一下这套教程,希望每个小伙伴都沉迷学习,无法自拔! 本套教程学习时间15天 1-3天内容:为Linu ...

  5. python设计游戏的背景_04_游戏背景 — 黑马程序员《Python入门教程完整版》笔记...

    游戏背景 黑马程序员<Python入门教程完整版>笔记 - 黑马程序员<Python入门教程完整版>笔记 目标背景交替滚动的思路确定 显示游戏背景 01. 背景交替滚动的思路确 ...

  6. Python“飞机大战”上下左右移动空格发射子弹

    下载点此去 最后面有运行视频 一.项目背景 作为一名学习计算机的学生,在以往,我认为学习计算机要么就是无所不能的黑客,要么就是能制作出各种软件程序的大神.我选择pygame板块,制作一款能随意更改游戏 ...

  7. python3入门与进阶笔记_16_变量进阶 — 黑马程序员《Python入门教程完整版》笔记...

    变量进阶(理解) - 黑马程序员<Python入门教程完整版>笔记 目标变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用变量 和 数据 都是保存在 内存 中的 在 Py ...

  8. python教程视频完整版-Python教程视频完整版

    原标题:Python教程视频完整版 Python是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的.随着人工智能的发展,Python这门语言也 ...

  9. python飞机大战设计思路_python飞机大战pygame游戏背景设计详解

    本文实例讲述了python飞机大战pygame游戏背景设计.分享给大家供大家参考,具体如下: 目标 背景交替滚动的思路确定 显示游戏背景 01. 背景交替滚动的思路确定 运行 备课代码,观察 背景图像 ...

  10. python飞机大战联网版_Python 飞机大战搞怪版本

    python 飞机大战搞怪版本 (飞机为迷你亚索,外星人为迷你小诺手,由于时间关系和图片素材较难寻找,仅仅做了简易版,没有贴上背景图片.由于篇幅原因,对于函数讲解较为简略,可以自行搜索相应函数的用法) ...

最新文章

  1. 禁止Win7系统自动安装驱动程序
  2. jquery ajax异步和同步从后天取值
  3. dynamic_caast操作符
  4. 【Paper】41_[24]novel type of phase transition in a system of self-driven particles
  5. Weblogic部署web项目获取项目根目录为null
  6. Arch Linux 没有声音:Intel sound card snd_hda_intel not working 解决方法
  7. 遇到npm install的错误,多比较比较npm的版本
  8. 前端学习(2734):重读vue电商网站44之使用 echarts
  9. bat中的“多线程”处理代码
  10. 【Docker】docker bash: sudo: command not found
  11. python读取文件并存入mysql_1.python读取txt文件并插入到mysql数据库以及将py脚本文件打包成独立的exe程序...
  12. 在LoadRunner里何时该用 .NET Vuser协议?
  13. 游戏开发--开源18---Volity|PhiloGL|impactJs|createjs|C...
  14. IDEA 格式化XML命令
  15. npm install 报警告npm WARN
  16. win10计算机全名恢复,详细教您win10强制进入恢复模式方法
  17. DbContext 查询(三)
  18. 数据库是什么?数据库的概念
  19. 移动端基于Vant组件封装底部弹出搜索多选列表
  20. Zhong__Go随机密码生成器

热门文章

  1. 系统分析师电子版_3个月,我从待业青年变成数据分析师,月薪15000!
  2. python一切皆对象 对象都有类_Python小世界:彻底搞懂Python一切皆对象!!!
  3. 华为服务器2285怎么做系统,华为服务器2285进bios
  4. 计算机房灭火房间用的系数,消防安全知识试题(三)(2)
  5. DBA生活篇之休闲:不做宅男!
  6. Win10-更改c盘下的用户文件夹名[转]
  7. 不规格图片等比例展示---上下/左右留白
  8. datadog的数据流转
  9. plc学习入门有什么技巧
  10. 一米OA任意文件读取漏洞