python--python语言实现飞机大战,附完整代码,可直接运行~
前不久因为疫情的原因在家几个月,闲着无聊便开始学习python编程入门了python这门语言,在学习到面向对象的时候,最后的案例是开发一个飞机大战的项目游戏
因此试着开发了一下还不错,故献上源代码和所需要的图片素材,想要试试开发的朋友可以直接下载到IDE上运行即可。
配置要求
- 安装 python的游戏包 pygame 包
- python版本为3.0以上(安装介绍:https://www.cnblogs.com/wqb123/articles/12433427.html)
文件要求
- 先新建一个文件夹命名:py_飞机大战
- 命名2个文件:plane_main.py(主控程序文件) 和plane_sprites.py(辅助工具文件)
代码如下:
(plane_main.py文件)
1 import pygame 2 from plane_sprites import * 3 4 5 class PlaneGame(object): 6 """飞机大战主游戏""" 7 8 def __init__(self): 9 print("游戏初始化..") 10 11 # 1.创建游戏窗口 12 self.screen = pygame.display.set_mode(SCREEN_RECT.size) 13 # 2.创建游戏的时钟 14 self.clock = pygame.time.Clock() 15 # 3.调用私有方法,精灵和精灵组的创建 16 self.__create_sprites() 17 # 4.设置定时器--创建敌机出现 1s 18 pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000) 19 20 def __create_sprites(self): 21 """创建精灵和精灵组""" 22 # 1.创建背景精灵和精灵组 23 bg1 = Background() 24 bg2 = Background(True) 25 bg2.rect.y = -bg2.rect.height 26 self.back_group = pygame.sprite.Group(bg1, bg2) 27 # 2.创建敌机精灵组 28 self.enemy_group = pygame.sprite.Group() 29 # 3.创建英雄精灵组 30 self.hero = Hero() 31 self.hero_group = pygame.sprite.Group(self.hero) 32 33 def start_game(self): 34 print("游戏开始...") 35 while True: 36 # 1.设置刷新帧率 37 self.clock.tick(FRAME_PER_SEC) 38 # 2.事件监听 39 self.__event_handle() 40 # 3.碰撞检测 41 self.__check_collide() 42 # 4.更新精灵组 43 self.__update_sprites() 44 # 5.更新屏幕显示 45 pygame.display.update() 46 47 def __event_handle(self): 48 """事件监听""" 49 50 for event in pygame.event.get(): 51 # 监听游戏是否退出 52 if event.type == pygame.QUIT: 53 PlaneGame.__game_over() 54 # 监听敌机的出现 55 elif event.type == CREATE_ENEMY_EVENT: 56 print("敌机出场...") 57 # 创建敌机精灵 58 enemy = Enemy() 59 self.enemy_group.add(Enemy()) 60 # 让英雄发射子弹 61 elif event.type == Hero_FIRE_EVENT: 62 self.hero.fire() 63 # 获取用户按键 64 keys_pressed = pygame.key.get_pressed() 65 if keys_pressed[pygame.K_RIGHT]: 66 self.hero.speed = 2 67 elif keys_pressed[pygame.K_LEFT]: 68 self.hero.speed = -2 69 else: 70 self.hero.speed = 0 71 72 def __check_collide(self): 73 """碰撞检测""" 74 # 1.设置子弹摧毁敌机 75 pygame.sprite.groupcollide(self.hero.bullets, 76 self.enemy_group, True, True) 77 # 2.敌机摧毁英雄 78 enemies = pygame.sprite.spritecollide(self.hero, 79 self.enemy_group, True) 80 # 2.1判断列表是否有内容 81 if len(enemies) > 0: 82 # 让英雄牺牲 83 self.hero.kill() 84 # 结束游戏 85 PlaneGame.__game_over() 86 87 def __update_sprites(self): 88 """更新精灵组""" 89 # 1.背景更新渲染显示 90 self.back_group.update() 91 self.back_group.draw(self.screen) 92 # 2.敌机渲染更新显示 93 self.enemy_group.update() 94 self.enemy_group.draw(self.screen) 95 # 3.英雄渲染更新显示 96 self.hero_group.update() 97 self.hero_group.draw(self.screen) 98 # 4.子弹渲染更新显示 99 self.hero.bullets.update() 100 self.hero.bullets.draw(self.screen) 101 102 @staticmethod 103 def __game_over(): 104 """游戏结束""" 105 print("游戏结束") 106 pygame.quit() 107 exit() 108 109 if __name__ == \'__main__\': 110 # 创建游戏对象 111 game = PlaneGame() 112 # 开始游戏 113 game.start_game()
(plane_sprites.py文件)
import random import pygame # 游戏屏幕的尺寸 SCREEN_RECT = pygame.Rect(0, 0, 480, 700) # 游戏的刷新帧率 FRAME_PER_SEC = 60 # 敌机的定时器常量 CREATE_ENEMY_EVENT = pygame.USEREVENT # 英雄发射子弹事件 Hero_FIRE_EVENT = pygame.USEREVENT + 1 class GameSprite(pygame.sprite.Sprite): """游戏精灵基类""" def __init__(self, image_name, speed=1): # 调用父类的初始方法 super().__init__() self.image = pygame.image.load(image_name) self.rect = self.image.get_rect() # 记录速度 self.speed = speed def update(self, *args): # 默认在垂直方向移动 self.rect.y += self.speed class Background(GameSprite): """游戏背景精灵""" def __init__(self, is_alt=False): # 1.调用父类方法实现精灵的创建(image/rect/speed) image_name = "./images/background.png" super().__init__(image_name) # 2.判断是否交替图片,如果是,将图片设置到屏幕顶部 if is_alt: self.rect.y = -self.rect.height def update(self, *args): # 1.调用父类方法实现 super().update() # 2.判断是否移出屏幕,如移出,将图像设置到屏幕上方 if self.rect.y >= SCREEN_RECT.height: self.rect.y = -self.rect.height class Enemy(GameSprite): """敌机精灵""" def __init__(self): # 1.调用父类方法创建敌机精灵,并指定敌机图像 super().__init__("./images/enemy1.png") # 2.设置敌机的随机速度(初始) 1~3 self.speed = random.randint(1, 3) # 3.设置敌机的随机位置(初始)水平方向 self.rect.bottom = 0 max_x = SCREEN_RECT.width - self.rect.width self.rect.x = random.randint(0, max_x) def update(self, *args): # 1.调用父类让敌机在垂直方向移动 super().update() # 2.判断是否飞出屏幕,如果是,需将敌机删除 if self.rect.y >= SCREEN_RECT.height: print("敌机飞出屏幕...") # 3.将精灵从所有组中删除 self.kill() def __del__(self): print("敌机挂了 %s" % self.rect) class Hero(GameSprite): """英雄精灵""" def __init__(self): super().__init__("./images/me1.png", 0) # 设置初始位置 self.rect.centerx = SCREEN_RECT.centerx self.rect.bottom = SCREEN_RECT.bottom - 120 # 每隔 0.5s 发射一次子弹 pygame.time.set_timer(Hero_FIRE_EVENT, 500) # 1.创建子弹的精灵组 self.bullets = pygame.sprite.Group() def update(self, *args): # 英雄飞机在水平方向运动 self.rect.x += self.speed # 判断屏幕边界 if self.rect.left < 0: self.rect.left = 0 if self.rect.right > SCREEN_RECT.right: self.rect.right = SCREEN_RECT.right def fire(self): print("发射子弹...") # 实现一次发射三枚子弹 for i in (1, 2, 3): # 1.创建子弹精灵 bullet = Bullet() # 2.设置子弹精灵位置 bullet.rect.bottom = self.rect.y - i * 20 bullet.rect.centerx = self.rect.centerx # 3.将子弹精灵添加到精灵组 self.bullets.add(bullet) class Bullet(GameSprite): """子弹精灵""" def __init__(self): super().__init__("./images/bullet1.png", -2) def update(self, *args): super().update() # 判断是否飞出屏幕,飞出删除 if self.rect.bottom < 0: self.kill()
涉及的素材图
1.背景
2.敌机
3.主飞机
4.子弹
运行图
可以试着运行玩一下效果,感受一下用python完成一次面向对象的小案例把~