Python:飞机大战游戏3:框架搭建

一、总体目录

  • 明确主程序的指责
  • 实现飞机大战主程序类
  • 准备游戏精灵组

二、明确主程序的指责

  • 2.1、一个主程序的 职责 可以分为两个部分:初始化游戏循环
  • 2.2、根据明确的指责,设计 PlanGame 类如下:
    Python:飞机大战游戏3:框架搭建_第1张图片
    PlanGame

    提示:根据 职责 封装私有方法,可以避免某一个方法的代码写得太过冗长,如果某一个方法编写的太长,既不好看,也不容易维护!

  • 2.3、游戏初始化__init__() 会调用以下方法
    方法 职责
    __event_handler(self) 事件监听
    __check_collide(self) 碰撞检测---子弹销毁敌机、敌机撞毁英雄
    __update_sprites(self) 精灵组更新和绘制
    __game_over(self) 游戏结束

三、实现飞机大战主程序类

  • 3.1、明确文件职责


    Python:飞机大战游戏3:框架搭建_第2张图片
    明确文件职责
    • plane_main:封装 主游戏类;创建 游戏对象;启动游戏

    • plane_sprites : 封装游戏中 所有 需要使用的 精灵子类;提供游戏的 相关工具

    • 创建 plane_main.py 模块

      import pygame
      from plan_sprites import *
      
      class PlanGame(object):
               """飞机大战主游戏"""
      
      def __init__(self):
      
             print("游戏初始化")
      
      def start_game(self):
      
             print("开始游戏")
      
      # 在主模块里面编写测试代码
      if __name__ == '__main__':
      
              # 1、创建游戏对象
              game = PlanGame()
      
              # 2、启动游戏
              game.start_game()
      
  • 3.2、plane_main.py 模块 初始化内容的完善(SCREEN_RECT是屏幕 Rect的常量:常量相约是所有字母大写,字母之间用_下划线)

    def __init__(self):
    
          print("游戏初始化")
          # 1、设置游戏窗口
          self.screen = pygame.display.set_mode(SCREEN_RECT.size)
    
          # 2、创建游戏时钟
          self.lock = pygame.time.Clock()
    
         # 3、创建精灵和精灵组(私有方法)
         self. __create_plan_sprites()
      
         def __create_plan_sprites(self):
      
                     print("创建游戏精灵")
    
  • 3.3、plane_main.py 模块 开始游戏的代码完善

    def start_game(self):
    
      while True:
          print("开始游戏")
          # 1、设置刷新帧率
          self.lock.tick(FRAME_PER_SEC)
    
          # 2、事件监听
          self.__event_handler()
    
          # 3、碰撞检测
          self.__check_collide()
    
          # 4、更新/绘制精灵组
          self.__update_sprites()
    
          # 5、更新显示
          pygame.display.update()
    
    def __event_handler(self):
    
      print("处理用户的操作事件")
    
      for event in pygame.event.get():
    
          if event.type == pygame.QUIT:
              # 游戏关闭(结束)
              self.__game_over()
    
    def __check_collide(self):
    
        print("碰撞检测")
    
    def __update_sprites(self):
    
        print("更新/绘制精灵组")
    
    @staticmethod
    def __game_over():
    
         print("游戏结束")
    
         # 退出游戏,卸载加载的所有模块,
         pygame.quit()
         # 直接退出系统(终止当前正在执行的程序)
         exit()
    
  • 3.4、上面的代码用到了常量,比如上面的屏幕的Rect: SCREEN_RECT和时钟刷新帧率FRAME_PER_SEC,下面就介绍一下常量

    常量:不变化的量(没有真正意义的常量)
    变量:不可以变化的量

    • 应用场景:
      • 在开发时候,可能会需要使用 固定的数值,例如:屏幕的高度 是 700
      • 这个时候,建议 不要 直接使用固定数值,而是应该使用 常量
      • 在开发时,为了保证代码的可维护性,尽量不要使用 魔法数字
    • 常量的定义
      • 定义 常量 和定义 变量 的语法完全一样,都是使用 赋值语句
      • 常量命名 应该 所有字母都使用大写,单词与单词之间使用下划线连接起来
    • 常量的好处
      • 阅读代码时,通过 常量名 见名之意,不需要猜测数字的含义
      • 如果需要 调整值,只需要 修改常量定义 就可以实现 统一修改

三、准备游戏精灵组

  • 3.1、先在 __init__方法里面完善

     def __init__(self):
      
      # 新增精灵组属性
      self.enemy_group = None
      # 3、创建精灵和精灵组(私有方法),传精灵的个数
      self.__create_plan_sprites(4)
    
  • 3.2、 def __create_plan_sprites(self, enemy_num)方法里面完善, enemy_num精灵的个数

    def __create_plan_sprites(self,enemy_num):
          enemy_list = []
          num = 0
          while num < enemy_num:
                # 创建敌机的精灵对象
                enemy = GameSprites("./images/enemy1.png")
                enemy_list.append(enemy)
                num += 1
    
          enemy_tuple = tuple(enemy_list)
          # 创建敌机的精灵组
          self.enemy_group = pygame.sprite.Group(*enemy_tuple)
    
          print("enemy_list的数量 %d",len(enemy_list))
    
  • 3.3、 更新/绘制精灵组 self.__update_sprites()

    def __update_sprites(self):
    
        print("更新/绘制精灵组")
        # 让精灵组调用两个方法
        # update - 让组中的所有精灵更新位置
        self.enemy_group.update()
    
        # draw - 在screen上绘制所有的精灵
        self.enemy_group.draw(self.screen)
    

你可能感兴趣的:(Python:飞机大战游戏3:框架搭建)