python版飞机大战

用python几百行代码搞定飞机大站游戏。

我们利用pygame包进行飞机大战的游戏开发,所以大家首先得安装好pygame包,本游戏一共封装了8个类,大家可以在GitHub上下载https://github.com/Young157/aircraft-battle

  1. 定义玩家飞机精灵类 继承精灵类
import gc  #垃圾回收机制
import pygame  # pygame游戏模块
import random  # 随机数模块
import Constants  # 自定义事件模块
class HeroPlane(pygame.sprite.Sprite):"""玩家飞机精灵类 继承精灵类"""def __init__(self, screen):# 调用父类初始化方法super().__init__()  # 方法二 pygame.sprite.Sprite.__init__(self)# 接收游戏窗口self.screen = screen# 创建一架玩家的飞机图片 属性名必须为 imageself.image = pygame.image.load('./feiji/feiji.png')# 获取飞机的矩形区域对象 属性名必须为 rectself.rect = self.image.get_rect()# 定义飞机左上角坐标self.rect.topleft = [512 / 2 - 116 / 2, 600]# 飞机的速度self.speed = 7# 子弹精灵组 存放所有的子弹精灵self.bullets = pygame.sprite.Group()# 血量 初始值100self.blood_value = 100# 标记玩家飞机是否overself.is_remove = False# 显示爆炸图片的 索引 从0开始self.mIndex = 0# 存放爆炸图片的列表self.bomb_mImages = []for v in range(1, 15):# 把所有图片 存放到列表里 每个图片 存2次self.bomb_mImages.append(pygame.image.load('./feiji/image ' + str(v) + '.png'))self.bomb_mImages.append(pygame.image.load('./feiji/image ' + str(v) + '.png'))def kill_blood(self, kill_value=10):"""血量减少"""self.blood_value -= kill_valueprint('被撞到了,血量还剩%s' % self.blood_value)if self.blood_value <= 0:# 血量 <=0 设置is_remove 为Trueself.is_remove = Truedef key_control(self):"""案件监听 操作飞机上下左右移动和空格发射子弹"""# 监听键盘的事件key_pressed = pygame.key.get_pressed()  # 注意这种方式是能检测到一直按下不松开的键盘if key_pressed[pygame.K_w] or key_pressed[pygame.K_UP]:# top值如果小于0 就到了最顶部 控制不能再移动了if self.rect.top > 3:self.rect.top -= self.speedif key_pressed[pygame.K_s] or key_pressed[pygame.K_DOWN]:if self.rect.bottom <= 768:self.rect.bottom += self.speedif key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:if self.rect.left > 0:self.rect.left -= self.speedif key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:if self.rect.right < 520:self.rect.right += self.speedif key_pressed[pygame.K_SPACE]:# 创建3个子弹bullet1 = Bullet(self.screen, self.rect.left, self.rect.top, 1)bullet2 = Bullet(self.screen, self.rect.left, self.rect.top, 2)bullet3 = Bullet(self.screen, self.rect.left, self.rect.top, 3)# 添加到精灵组里self.bullets.add(bullet1, bullet2, bullet3)def bomb(self):"""显示爆炸图片"""self.screen.blit(self.bomb_mImages[self.mIndex], self.rect)self.mIndex += 1if self.mIndex >= len(self.bomb_mImages):return Truedef update(self):  # 更新if self.is_remove:# 如果玩家飞机挂掉if self.bomb():# 爆炸结束self.rect.topleft = [-200, -200]# 开启倒计时pygame.time.set_timer(Constants.game_over_id, 1000)# 把玩家飞机指向None 停止updatemanager.hero = Noneelse:# 更新键盘事件self.key_control()# 更新飞机和子弹self.display()def display(self):# 把飞机显示到窗口上 飞机116*100self.screen.blit(self.image, self.rect)# 更新精灵组里的子弹位置self.bullets.update()# 精灵组所有子弹显示到窗口self.bullets.draw(self.screen)
  1. 飞机子弹精灵类 继承精灵类
class Bullet(pygame.sprite.Sprite):"""子弹精灵类 继承精灵类"""# 参1 游戏窗口,参2子弹x轴,参3子弹y轴,参4子弹序号def __init__(self, screen, planex, planey, path_num):# 调用父类初始化方法super().__init__()  # 方法二 pygame.sprite.Sprite.__init__(self)# 接收游戏窗口self.screen = screen# 创建一个子弹图片self.image = pygame.image.load('./feiji/666.png')# 获取子弹矩形区域对象self.rect = self.image.get_rect()# 定义子弹左上角坐标self.rect.topleft = [planex - 9, planey - 10]# 子弹的速度self.speed = 45# 子弹序号self.path_num = path_numdef update(self):"""修改子弹坐标"""self.rect.top -= self.speedif self.rect.bottom < 0:# 子弹已经移出了屏幕上方 这时把子弹从精灵组删除self.kill()if self.path_num == 1:passelif self.path_num == 2:# 如果等于2 就是左侧的散弹self.rect.left -= 12elif self.path_num == 3:# 如果等于3 就是右侧的散弹self.rect.right += 12
  1. 敌机精灵类 继承精灵类
class EnemyPlane(pygame.sprite.Sprite):"""敌机精灵类 继承精灵类"""# 创建类属性 存放所有飞机的所有的子弹all_bullets = pygame.sprite.Group()def __init__(self, screen):# 调试父类初始化方法super().__init__()  # 方法二 pygame.sprite.Sprite.__init__(self)# 接收游戏窗口self.screen = screen# 创建一架敌方飞机图片self.image = pygame.image.load('./feiji/img-plane_5.png')# 敌机矩形区域对象self.rect = self.image.get_rect()# 左上角坐标 x坐标随机self.rect.topleft = [random.randint(-400, 812), -68]# 敌机的速度self.speed = 2# 一个精灵组 存放所有的子弹精灵self.bullets = pygame.sprite.Group()# 敌机的左右方向 默认开始向右self.direction = 'right'# 子弹的精灵组self.bullets = pygame.sprite.Group()# 标记敌机是否被击中 是否要删除self.is_remove = False# 显示爆炸图片的 索引 从0开始self.mIndex = 0# 存放爆炸图片的列表self.bomb_mImages = []for v in range(1, 15):# 把所有图片 存放到列表里 每个图片 存2次self.bomb_mImages.append(pygame.image.load('./feiji/image ' + str(v) + '.png'))self.bomb_mImages.append(pygame.image.load('./feiji/image ' + str(v) + '.png'))# 记录爆炸位置self.x = 0self.y = 0def auto_move(self):"""自动移动"""# 向下移动self.rect.bottom += self.speed# 如果飞机向下移出边界 删除它if self.rect.top > Manager.height:# 删除敌机对象self.kill()# 按不同方向左右移动:if self.direction == 'right':self.rect.right += 3elif self.direction == 'left':self.rect.right -= 3# 超出左右边界 更改移动方向if self.rect.right >= Manager.width + 10:self.direction = 'left'if self.rect.left <= -5:self.direction = 'right'def auto_fire(self):"""发射子弹"""# 用一个随机数定义发射子弹num = random.randint(1, 40)# 判断如果等于1就发射一颗子弹,降低发射频率if num == 1:# 生成敌机子弹  参1游戏窗口 参2坐标x 参3坐标ybullet = EnemyBullet(self.screen, self.rect.left, self.rect.top)# 添加到精灵组self.bullets.add(bullet)# 把子弹添加到类的all_bullets里 用来碰撞检测EnemyPlane.all_bullets.add(bullet)def bomb(self):"""显示爆炸图片 如果返回True 说明爆炸结束"""if self.mIndex >= len(self.bomb_mImages):# 播放到了最后 爆炸结束 返回Truereturn Trueself.screen.blit(self.bomb_mImages[self.mIndex], (self.x, self.y))self.mIndex += 1def update(self):if self.is_remove:if self.rect.left != -200:# 记录爆炸时的位置self.x = self.rect.leftself.y = self.rect.top# 如果被击中 把飞机移除窗口 防止继续碰撞检测self.rect.left = -200self.rect.top = -200# 显示爆炸效果if self.bomb() and not self.bullets:# 如果爆炸结束 把自己从精灵组里删除self.kill()else:# 自动移动self.auto_move()# 自动开火self.auto_fire()# 显示self.display()self.bullet_show()def display(self):# 把飞机显示到窗口上 飞机 116*100self.screen.blit(self.image, self.rect)def bullet_show(self):if self.bullets:# 敌机子弹更新self.bullets.update()# 敌机子弹显示self.bullets.draw(self.screen)
  1. 敌机子弹精灵类 继承精灵类
class EnemyBullet(pygame.sprite.Sprite):"""敌机子弹精灵类 继承精灵类"""def __init__(self, screen, x, y):# 调用父类初始化方法super().__init__()# 接收游戏窗口self.screen = screen# 一个子弹图片self.image = pygame.image.load('./feiji/bullet_6.png')# 子弹矩形区域对象self.rect = self.image.get_rect()# 子弹左上角坐标self.rect.topleft = [x + 40, y + 60]# 子弹的速度self.speed = 10def update(self):"""修改子弹坐标"""self.rect.bottom += self.speed# 如果子弹向下移除边界 删除它if self.rect.top > Manager.height:self.kill()
  1. 游戏音乐音效类
class GameSound(object):def __init__(self):pygame.mixer.init()  # 音乐模块初始化pygame.mixer.music.load("./feiji/bg2.ogg")pygame.mixer.music.set_volume(0.3)  # 声音大小0~1self.__bomb = pygame.mixer.Sound("./feiji/bomb.wav")self.__bomb.set_volume(0.08)  # 声音大小0~1def playBackgroundMusic(self):# 开始播放背景音乐 -1表示一直重复播放 其他数字就是播放几遍pygame.mixer.music.play(-1)def playBombSound(self):pygame.mixer.Sound.play(self.__bomb)  # 爆炸音乐
  1. 初始化地图
class GameBackground(object):# 初始化地图def __init__(self, screen):self.mImage1 = pygame.image.load('./feiji/img_bg_level_4.jpg')self.mImage2 = pygame.image.load('./feiji/img_bg_level_4.jpg')# 窗口self.screen = screen# 辅助移动地图self.y1 = 0self.y2 = -Manager.heightdef update(self):self.move()self.draw()# 移动地图def move(self):self.y1 += 2.2self.y2 += 2.2if self.y1 >= Manager.height:self.y1 = 0if self.y2 >= 0:self.y2 = -manager.height# 移动地图def draw(self):self.screen.blit(self.mImage1, (0, self.y1))self.screen.blit(self.mImage2, (0, self.y2))
  1. 管理游戏运行类
class Manager:"""管理类 管理程序运行"""hero: HeroPlane# 定义游戏窗口宽高width = 512height = 768def __init__(self):# pygame初始化 否则找不到文件pygame.init()# 1创建一个游戏窗口 参数1是宽高,参数2 附加参数 参数3是颜色深度self.screen = pygame.display.set_mode((self.width, self.height), 0, 32)# 2创建背景图片的对象# self.background = pygame.image.load('./feiji/img_bg_level_4.jpg')self.background = GameBackground(self.screen)# 创建飞机对象self.hero = HeroPlane(self.screen)# 敌机对象精灵组self.enemys = pygame.sprite.Group()# 创建时钟对象self.clock = pygame.time.Clock()# 初始化音效对象self.sound = GameSound()# 定义分数属性self.score = 0# 倒计时时间self.over_time = 3def exit(self):# pygame的退出pygame.quit()# 程序的退出exit()def new_enemy(self):# 创建敌机对象enemy = EnemyPlane(self.screen)# 添加到精灵组self.enemys.add(enemy)def drawText(self, text, x, y, textHeight=30, fontColor=(255, 255, 255), backgroudColor=None):# 通过字体文件获得字体对象 参数1 字体文件 参数2 字体大小font_obj = pygame.font.Font('./feiji/baddf.ttf', textHeight)# 1文字 2是否抗锯齿 3文字颜色 4背景颜色text_obj = font_obj.render(text, True, fontColor, backgroudColor)  # 配置要显示的文字# 获取要显示的对象recttext_rect = text_obj.get_rect()# 设置显示对象的坐标text_rect.topleft = (x, y)# 绘制字 到指定区域 参数1时文字对象 参数2是矩形对象self.screen.blit(text_obj, text_rect)def game_over_timer(self):"""执行倒计时"""self.over_time -= 1if self.over_time == 0:# 停止倒计时pygame.time.set_timer(Constants.game_over_id, 0)# 重新开始游戏self.start_game()def show_over_text(self):print('self.over_time', self.over_time)# 游戏结束 显示倒计时self.drawText('gameover %d' % self.over_time, 0, Manager.height / 2, textHeight=50, fontColor=[0, 0, 0])def start_game(self):global manager# 清空敌机子弹精灵组EnemyPlane.all_bullets.empty()manager = Manager()# 垃圾回收 提示python解释器 要回收了gc.collect()manager.main()def main(self):# 播放背景音乐self.sound.playBackgroundMusic()# 参1eventid是事件id,自己定义(0~32之间)不要和自己用的pygame的其他事件id冲突# 参2是定时事件的时隔,单位是毫秒pygame.time.set_timer(20, 800)while True:# 控制每秒循环的次数self.clock.tick(130)# 获取事件 并且处理for event in pygame.event.get():# 判断事件的类型是否是退出if event.type == pygame.QUIT:# 退出self.exit()elif event.type == 20:# 当事件等于20 说明定时器事件生效 添加一架敌机self.new_enemy()elif event.type == Constants.game_over_id:# 显示倒计时时间self.game_over_timer()# 3把背景图显示到窗口上# self.screen.blit(self.background, (0, 0))self.background.update()self.drawText('分数:%s' % self.score, 0, 0)if self.hero:self.drawText('血量:%s' % self.hero.blood_value, 0, 30)# 更新飞机self.hero.update()# 如果玩家飞机血量小于等于0,且子弹不在界面的时候(玩家飞机子弹精灵组里为空时)# if self.hero.blood_value <= 0 and not self.hero.bullets.sprites():#     # 把玩家飞机引用指向None 尽快释放#     self.hero = Noneelse:self.drawText('血量:0', 0, 30)# 更新敌机self.enemys.update()# 如果飞机已经挂掉 就一直显示倒计时if not self.hero:# 显示倒计时self.show_over_text()# 判断 玩家飞机 和敌机死否都存在 self.enemys.sprites()返回精灵组对应的精灵列表if self.hero and self.enemys.sprites():# 碰撞检测 返回碰撞到的 敌机列表collide_enemys = pygame.sprite.spritecollide(self.hero, self.enemys, False,pygame.sprite.collide_mask)# 如果列表不为空 说明碰到了敌机if collide_enemys:print('碰到了敌机')self.sound.playBombSound()self.hero.kill_blood(100)for enemy_item in collide_enemys:# 标记敌机已经被碰到enemy_item.is_remove = True# 判断 玩家飞机 和 玩家飞机的子弹 和 敌机是否都存在if self.hero and self.hero.bullets and self.enemys:# 检测玩家飞机的子弹 和敌机的碰撞# 返回是个字典 格式{<Bullet sprite(in 0 groups)>: [<EnemyPlane sprite(in 0 groups)>]}# {碰撞的子弹1:[打中的敌机1,打中的敌机2],碰撞的子弹2:[打中的敌机1,打中的敌机5]}collode_dict = pygame.sprite.groupcollide(self.hero.bullets, self.enemys, True, False,pygame.sprite.collide_mask)if collode_dict:# 爆炸声音self.sound.playBombSound()# 用一个集合 添加敌机 去除重复的enemyset = set()# 获取所有打中的敌机列表,然后遍历for v_enemys in collode_dict.values():# 遍历敌机列表for enemy_item in v_enemys:enemyset.add(enemy_item)# 标记敌机已经被击中enemy_item.is_remove = True# 碰撞后 +=10分*集合里敌机的数量self.score += 10 * len(enemyset)# 判断 玩家飞机 和 敌机子弹if self.hero and EnemyPlane.all_bullets:# 检测玩家 和敌机子弹的碰撞collide_bullets = pygame.sprite.spritecollide(self.hero, EnemyPlane.all_bullets, True,pygame.sprite.collide_mask)if collide_bullets:# 如果碰到了 就减少10*子弹数量的血量self.hero.kill_blood(10 * len(collide_bullets))# 2 显示窗口pygame.display.update()if __name__ == '__main__':manager = Manager()manager.main()
  1. 最后是一个自定义事件的模块,作为被主程序导入,Constants
# 倒计时事件的id
game_over_id = 25
# 产生敌机的事件id
new_enemy = 20

python版飞机大战相关推荐

  1. python飞机大战源代码-python版飞机大战代码分享

    利用pygame实现了简易版飞机大战.源代码如下: # -*- coding:utf-8 -*- import pygame import sys from pygame.locals import ...

  2. pygame的应用——python版飞机大战

    利用pygame实现了简易版飞机大战.源代码如下: # -*- coding:utf-8 -*- import pygame import sys from pygame.locals import ...

  3. python版飞机大战源码和素材免费

    个人写的python飞机大战 初学python 里面有两个版本 一个是多敌机版 一个是单敌机版 点击打开链接

  4. 重温经典:Python版飞机大战源码 神器 玩游戏就玩自己开发的

    目录 导语 正文 一.环境安装 二.我方飞机 三.敌方飞机 四.控制键盘移动 五.检测子弹碰撞 六.效果图 总结 免费源码领取处: 往期文章推荐-- Python从入门到实战-- 绘图Turtle系列 ...

  5. python版飞机大战及码源

    飞机大战是之前学习python时根据网上的代码改编写成的,有完整的代码和素材. 文件结构: images文件:放置程序所需要的图片素材 sound文件:放置程序所需要的声音素材 bullet.py:有 ...

  6. Python版飞机大战游戏的设计(一)-----敌机出场

    pygame 快速入门 目标 项目准备 使用 pygame 创建图形窗口 理解 图像 并实现图像绘制 理解 游戏循环 和 游戏时钟 理解 精灵 和 精灵组 项目准备 新建 飞机大战 项目 新建一个 h ...

  7. python实现飞机大战游戏

    python实现飞机大战小游戏(含源码+视频资源) 导语: 正文: 1.开发工具 2.环境搭建 3.效果如下 Step1:定义精灵类 Step2:实现游戏主循环 Step3:制作简易的游戏开始和结束界 ...

  8. 飞机大战HTML5游戏源码,基于Canvas制作的网页版飞机大战游戏+飞机大战手机端

    简介: 飞机大战HTML5游戏源码是一款基于Canvas制作的网页版飞机大战游戏,画质精美的飞机大战手机端游戏源码 网盘下载地址: http://kekewangLuo.net/W1S2LQcqAT2 ...

  9. python写飞机大战游戏_python实现飞机大战游戏

    飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累.实现出来,成就感还是满满的),如图所示: 完整代码如下: 1.工 ...

最新文章

  1. Oracle 块修改跟踪 (Block Change Tracking) 说明
  2. 【Python】Docx解析
  3. 在服务器上搭建基于yolo3 与crnn 实现中文自然场景文字检测及识别,GPU版本
  4. 区块链组织架构_区块链可以加速开放组织的5种方式
  5. python面向对象教程_Python入门系列教程3-面向对象
  6. tp3.2框架关闭日志记录
  7. 海洋工作室——网站建设专家:人生3万天 转载
  8. Linux-HA实战(1)— Heartbeat安装
  9. 重命名DC 以及 域
  10. mysql数据库保存文件_MySQL数据库文件介绍及存放位置
  11. android手机 ipad 同屏,iphone和ipad
  12. 标识解析数据网关IDG S800发布上线
  13. 2021年终总结与展望
  14. Python 课程学习笔记(5)列表 [ ] lst
  15. HTML+CSS鼠标悬停效果
  16. 期货开户交易交易风格各异
  17. Java笔记整理——包装类
  18. 小巧精致的至爱小播,是你陪睡陪聊的最佳伴侣!
  19. 列举三种强制类型转换
  20. VLC 推流的简单设置

热门文章

  1. 用Aspera批量下载数据
  2. 宝骏530中控屏怎么安装软件_#申精#宝骏530改装中控大屏导航
  3. 负载均衡集群技术LVS
  4. 数据仓库架构和建设方法
  5. 懒人煮紫菜蛋花青菜土豆汤
  6. html5教学案例撰写,撰写教学案例的收获
  7. 5G时代来临,为什么说获益最大的是工业互联网?
  8. 互联网架构(一)总体架构设计
  9. 数据库设计和ER图解释
  10. 力士乐压力补偿器ZDC25P-2X/M