使用Python编写一个飞机大战的小游戏,直接上效果
此游戏先在Windows电脑上安装了一个VMWare软件,并在其中暗中了ubuntu18.04的Linux系统,在ubuntu中安装了pycharm,并安装pygame模块,在pycharmIDE平台上完成的游戏开发
代码分享,一共两个Python模块,分别为plane_main.py和plane_sprite.py
-
plane_main.py ,
import pygame from plane_sprite import * class PlaneGame(object): """飞机大战主游戏""" def __init__(self): print("游戏初始化") pygame.init() pygame.display.set_caption("飞机大战(by 酷酷的星)") # 1 创建游戏的窗口 self.screen = pygame.display.set_mode(SCREEN_RECT.size) # 2 创建游戏的时钟 self.clock = pygame.time.Clock() # 3 调用私有方法,实现精灵和精灵组的创建 self.__create_sprites() # 4 设置定时器事件-每秒创建一架敌机 pygame.time.set_timer(CREATE_ENEMY_EVENT,500) # 5 每隔0.5秒发射子弹 pygame.time.set_timer(HERO_FIRE_EVENT,500) def __create_sprites(self): """创建精灵组""" # 背景组 bg1 = Background() bg2 = Background(True) self.back_group = pygame.sprite.Group(bg1,bg2) # 敌机组 self.enemy_group = pygame.sprite.Group() # 英雄组 self.hero = Hero() self.hero_group = pygame.sprite.Group(self.hero) def start_game(self): """开始游戏""" print("开始游戏") while True: # 1 设置刷新帧率 self.clock.tick(FRAME_PER_SEC) # 2 事件监听 self.__event_handler() # 3 碰撞检测 self.__check_collide() # 4 更新精灵组 self.__update_sprites() # 5 更新屏幕显示 pygame.display.update() def __event_handler(self): """事件监听""" keys_pressed = pygame.key.get_pressed() if keys_pressed[pygame.K_RIGHT]: self.hero.speed = 6 elif keys_pressed[pygame.K_LEFT]: self.hero.speed = -6 else: self.hero.speed = 0 for event in pygame.event.get(): if event.type == pygame.QUIT: PlaneGame.__game_over() elif event.type == CREATE_ENEMY_EVENT: self.enemy_group.add(Enemy("./images/enemy1.png")) self.enemy_group.add(Enemy("./images/enemy2.png")) c4 = random.randint(1,6) if c4 == 3: self.enemy_group.add(Enemy("./images/bullet_supply.png")) elif event.type == HERO_FIRE_EVENT: self.hero.fire() def __check_collide(self): """碰撞检测""" pygame.sprite.groupcollide(self.hero.hero_bullet_group, self.enemy_group, True, True) enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True) if len(enemies) > 0: self.hero.kill() PlaneGame.__game_over() def __update_sprites(self): """更新精灵组""" self.back_group.update() self.back_group.draw(self.screen) self.enemy_group.update() self.enemy_group.draw(self.screen) self.hero_group.update() self.hero_group.draw(self.screen) self.hero.hero_bullet_group.update() self.hero.hero_bullet_group.draw(self.screen) @staticmethod def __game_over(): """游戏结束""" print("结束游戏") # 绘制结束游戏画面 screen = pygame.display.set_mode((480, 700)) over_image = pygame.image.load("./images/gameover.png") screen.blit(over_image,(100,300)) pygame.display.update() # 延时作用 while True: i = 0 if i < 10000: break pygame.quit() exit() if __name__ == '__main__': # 创建游戏对象 game = PlaneGame() # 开始游戏 game.start_game()
-
plane_sprite.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): # 默认在垂直方向移动 self.rect.y += self.speed class Background(GameSprite): """游戏背景精灵""" def __init__(self,is_alt = False): background_name = "./images/background.png" super().__init__(background_name) if is_alt: self.rect.y = -self.rect.height def update(self): super().update() if self.rect.y >= SCREEN_RECT.height: self.rect.y = -self.rect.height class Enemy(GameSprite): """敌机""" def __init__(self,enemy_name): # 1 调用父类的初始化方法,创建敌机并制定图像 super().__init__(enemy_name) # 2 设置敌机的随机初始速度2~5 self.speed = random.randint(2,4) # 3 设置敌机的随机初始位置 self.rect.bottom = 0 self.rect.x = random.randint(0,SCREEN_RECT.width-self.rect.width) def update(self): super().update() if self.rect.y >= SCREEN_RECT.height: self.kill() class Bullet(GameSprite): """子弹精灵""" def __init__(self,bullet_name,speed = -2): super().__init__(bullet_name,speed) def update(self): super().update() # 判断子弹是否超出屏幕,如果是,将子弹从精灵组删除 if self.rect.bottom < 0: self.kill() class Hero(GameSprite): """英雄精灵""" def __init__(self): super().__init__("./images/me1.png",0) # 设置初始位置 self.rect.centerx = SCREEN_RECT.centerx self.rect.bottom = SCREEN_RECT.bottom-20 # 定义子弹组 self.hero_bullet_group = pygame.sprite.Group() def update(self): # 飞机水平移动 self.rect.x +=self.speed # 判断屏幕边界 if self.rect.left < 0: self.rect.left = 0 elif self.rect.right > SCREEN_RECT.right: self.rect.right = SCREEN_RECT.right def fire(self): """开火""" # 连发两颗子弹 for i in (1,2): # 1创建子弹精灵,三个子弹口 bullet1 = Bullet("./images/bullet1.png") bullet2 = Bullet("./images/bullet1.png") bullet_center = Bullet("./images/bullet2.png") # 2 设置子弹精灵的初始位置 bullet1.rect.y = self.rect.y - i * 10 bullet1.rect.centerx = self.rect.centerx - 35 # bullet2.rect.y = self.rect.y - i * 10 bullet2.rect.centerx = self.rect.centerx + 35 bullet_center.rect.y = self.rect.y - i * 10 bullet_center.rect.centerx = self.rect.centerx # 3 将精灵添加到精灵组 self.hero_bullet_group.add(bullet1, bullet2, bullet_center)
游戏中需要的图片素材