tank大战

模块安装(安装pygame)

  • 1.pip安装

    • widows+R-->输入cmd-->命令行输入pip install pygame
  • 2.pycharm中安装

    • file-->setting-->Project Interpreter-->右侧+--install-->搜索框输入pygame-->下方install package
  • 3.下载好安装包直接安装

    • 在python官网下载好pygame-1.9.6-cp37-cp37m-win_amd64.whl,打开命令窗口,切换到安装包目录,执行pip install pygame-1.9.6-cp37-cp37m-win_amd64.whl
  • 使用pip list 查看是否有pygame

面向对象分析

  • 游戏原理分析

    • 游戏原理:和动画原理相同,快速切换图片,为了避免上一次贴图,每次刷新前,重贴所有图片
  • 实现框架的搭建(类的设计)

    • 主逻辑类

    • 基本坦克类

    • 我方坦克类

    • 敌方坦克类

    • 子弹类

    • 障碍物

    • 爆炸类

框架的搭建

  • 参考代码

    #主逻辑类
    class MianGame:
        def start(self):
            """开始游戏"""
            pass
        
        def game_over(self):
            """结束游戏"""
            pass
    
    #基本坦克类
    class BaseTank:
        pass
    
    #我方坦克类
    class HeroTank(BaseTank):
        pass
    
    #敌方坦克类
    class EnemyTank(BaseTank):
        pass
    
    #子弹类
    class Bullet:
        pass
    
    #障碍物类
    class Wall:
        pass
    
    #爆炸类
    class Bomb:
        pass
    

主逻辑类

  • 属性:游戏主窗口

  • 方法:

    • 开始游戏

      • 调用窗口初始化

      • 设置窗口

      • 设置标题(坦克大战v_1.0)

      • 窗口背景

      游戏应在无限循环中

    class MainGame:
        #游戏窗口
        window = None
        def start(self):
            """开始游戏"""
            #调用窗口初始化
            pygame.display.init()
            #设置窗口
            MainGame.window = pygame.display.set_mode((900,500))
            while True:
                MainGame.window.fill((0,0,0))
                #刷新
                pygame.display.update()
                # time.sleep(2)
    

事件检测

  • 获取新事件

    • pygame.event.get():
      • 鼠标点击窗口事件 pygame.QUIT
      • 键盘按下事件 pygame.KEYDOWN
  • 键盘长按事件

    • pygame.key.getpressed()
  • 参考代码

        def deal_event(self):
            # print(pygame.event.get())
            for event in pygame.event.get():
                #鼠标点击关闭窗口事件
                if event.type == pygame.QUIT:
                    print("点击关闭窗口按钮")
                    sys.exit()  # 关闭程序
                elif event.type==pygame.KEYDOWN:
                    # print("按下键盘")
                    if event.key==pygame.K_LEFT:
                        print("左移")
                    elif event.key==pygame.K_RIGHT:
                        print("右移")
                    if event.key==pygame.K_SPACE:
                        print("发射子弹")
    

我方坦克分析

  • 由于我方坦克和敌方坦克有相似的属性和方法,所以可以定义基本坦克类,让我方坦克和敌方坦克类继承基本坦克类

  • 基本坦克类

    • 属性:图片,方向,坦克位置,坦克矩形区域,移动速度,是否活着
    • 方法:移动,贴图
  • 参考代码

    class BaseTank:
        def __init__(self,x,y):
            """基本坦克属性"""
            # 加载图片文件,返回图片对象
            #将坦克图片储存在字典中
            # image = pygame.image.load("图片路径")
            self.images = {
                "U":pygame.image.load("tank_img/p1tankU.gif"),
                "D": pygame.image.load("tank_img/p1tankD.gif"),
                "L": pygame.image.load("tank_img/p1tankL.gif"),
                "R": pygame.image.load("tank_img/p1tankR.gif"),
            }
            #给初始化坦克一个方向
            self.direction = "U"
            #根据坦克方向获取坦克坦克
            self.img = self.images[self.direction]
            #获取图片矩形区域
            self.rect = self.img.get_rect()
            self.rect.x = x #坦克的x坐标
            self.rect.y = y #坦克的y坐标
            #移动速度
            self.speed = 3
            #坦克状态
            self.live = True
        def display_tank(self):
            """贴坦克图片的方法"""
            # 获取图片对象
            self.img = self.images[self.direction]
            #贴坦克图片
            # 贴图(指定坐标,将图片绘制到窗口)
            MainGame.window.blit(self.img, self.rect)
    #我方坦克类
    class HeroTank(BaseTank):
        def __init__(self,x,y):
            super(HeroTank, self).__init__(x,y)
            self.speed = 4
    
  • 创建我方坦克,并加载图片

    • 在主逻辑中,一开始就存在了我方坦克,定义类属性P记录我方坦克
    • 先定义创建我方坦克的方法(create_hero_tank),再定义加载我方坦克图片的方法(load_hero_tank)
    • 在游戏开始时,调用创建坦克的方法,在循环中加载坦克图片
    在主逻辑中记录坦克
    P1 = None
        
        def create_hero_tank(self):
            """创建我方坦克"""
            #判断是否创建了我方坦克
            if not MainGame.P1:
                MainGame.P1 = HeroTank(500,400) #坦克的初始位置
    
        def load_hero_tank(self):
            """加载我方坦克"""
            if MainGame.P1 and MainGame.P1.live:
                #如果坦克存在并且活着
                MainGame.P1.display_tank()
            else:
                del MainGame.P1
                MainGame.P1 = None
    #在开始游戏时调用 self.create_tank()
    #在开始游戏循环中调用self.load_hero_tank()
    
  • 实现我方坦克移动的方法

    • 在基本基本类中添加移动方法

    • 判断坦克的方向属性,是哪个方向就向哪个方向移动(向右x为正,向下y为正)

      • 移动方式:图片坐标+坦克速度
    • 参考代码

          def move(self):
              """坦克移动的方法"""
              if self.direction=="U":
                  self.rect.y-=self.speed
              elif self.direction=="D":
                  self.rect.y+=self.speed
              elif self.direction=="L":
                  self.rect.x-=self.speed
              elif self.direction=="R":
                  self.rect.x+=self.speed
      #在加载我方坦克中调用坦克移动的方法  MainGame.P1.move()
      #此时坦克只能向上移动
      
  • 优化坦克移动方法

    • 检测键盘长按事件,获取按键状态
    • 检测到键盘改变方向后,调用父类移动方向

    参考代码

    #我方坦克重写move()方法    
        def move(self):
            """我方坦克移动方法"""
            #键盘长按事件,获取键盘上所有的按键状态,按下1,没按0
            keys_status = pygame.key.get_pressed()
            # print(pressed_keys)
            if keys_status[pygame.K_UP]: #按键“上”被按下
                self.direction="U" #修改方向属性
                super(HeroTank, self).move()
            elif keys_status[pygame.K_DOWN]: #按键“下”被按下
                self.direction="D" #修改方向属性
                super(HeroTank, self).move()
            elif keys_status[pygame.K_LEFT]: #按键“左”被按下
                self.direction="L" #修改方向属性
                super(HeroTank, self).move()
            elif keys_status[pygame.K_RIGHT]: #按键“右”被按下
                self.direction="R" #修改方向属性
                super(HeroTank, self).move()
    

你可能感兴趣的:(tank大战)