Python飞机大战(完整版)

news/2024/10/18 18:21:19/

简介:一共分为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()

 


http://www.ppmy.cn/news/246791.html

相关文章

Python升级版飞机大战

Python升级版飞机大战&#xff0c;程序运行截图&#xff1a; 敌方共有大中小3款飞机&#xff0c;分为高中低三种速度; 子弹的射程并非全屏,而大概是屏幕长度的80%;消灭小飞机需要1发子弹,中飞机需要8发,大飞机需要20发子弹;每消灭一架小飞机得1000分,中飞机6000分,大飞机10000…

飞机大战一触即发

1&#xff1a;飞机的移动&#xff0c;发射子弹&#xff0c;手雷&#xff0c;生命值&#xff0c;生命条\n\n2&#xff1a;敌飞机有3种形态&#xff08;小&#xff0c;中&#xff0c;大&#xff09;不同的飞机大小不一样&#xff0c;生命值不一样&#xff0c;爆炸动画也不一样\n\…

飞机小游戏流畅版

提示&#xff1a;新人入坑&#xff0c;采用的新手模板草草写就&#xff0c;望谅解 文章目录 前言一、代码原理和功能二、成果展示1.源代码 总结 前言 在做课下的游戏设计作业时&#xff0c;因为一时乐趣加入了一些功能&#xff0c;最后的完成代码可玩性不错&#xff0c;于是决…

疯狂的世界

最近看《中国二十年重案追踪-造假案》&#xff0c;其讲的都是近年来大的造假案件。有造假币&#xff0c;有造假药&#xff0c;有造假车票&#xff0c;甚至还有造假老虎的。其中既有目不识丁的农民&#xff0c;也有优秀有文化的人。所有造假案的共同点都是利令智昏。 由斯皮尔伯…

python的飞机大战

python的飞机大战的完整代码 alien.py import pygame from pygame.sprite import Sprite class Alien(Sprite):"""表示单个外星人的类"""def __init__(self, ai_settings, screen):"""初始化外星人并设置其他位置""&…

Java窗口游戏开发,飞机大战,打飞机,打大飞机,打无敌飞机妙啊!!!!————————香啊~~~~~~~~~~~~~~~~~

身无分文宅家&#xff0c;细发日渐稀疏。 双亲日益劳累&#xff0c;奈何无心寻工。 复试遥遥无期&#xff0c;心情惨惨戚戚。 若问此时作甚&#xff1f;抽烟喝酒扣叮。---杂记2020/3/25-2020/4/12 矫情下&#xff0c;莫认真 接下来奉上近日学习内容 ok这也是本人的一幅作品&am…

Html飞机大战(十): 消灭敌机

好家伙&#xff0c;本篇是带着遗憾写完的。 很遗憾&#xff0c;我找了很久&#xff0c;找到了bug但并没有成功修复bug 再上一篇中我们看到 子弹射中了敌机&#xff0c;但是敌机并没有消失&#xff0c;所以这篇我们要来完善这个功能 按照惯例我们来捋一下思路&#xff1a; 看看…

飞机大战【python】

飞机大战 需要模块pygame 环境python3.9 pycharm 代码的使用 下载image中的所有图片&#xff0c;没有用到的可以做后续更改 将两个代码和images文件夹放在同一目录下 将最上方.py文件命名为plane_sprites 运行最下方的代码 代码细节 建立精灵组&#xff0c;创建类后继承…