坦克大战

Posted markshui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了坦克大战相关的知识,希望对你有一定的参考价值。

模块安装(安装pygame)

  • 1.pip 安装

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

    • file-->settting-->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 MainGame:
    
        def start(self):
            """开始游戏"""
            pass
    
        def game_over(self):
            """结束游戏"""
            pass
    
    # - 基本坦克类
    class BaseTank:
        pass
    
    # - 我方坦克类
    class HeroTank:
        pass
    
    # - 敌方坦克类
    class EnemyTank:
        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))
              # 设置窗口标题
              pygame.display.set_caption("坦克大战v_1.0")
              while True:
                  #窗口背景颜色
                  MainGame.window.fill((0,0,0))
                  #刷新
                  pygame.display.update()
      
          def game_over(self):
              """结束游戏"""
              pass
      
主逻辑内进行事件检测
  • 获取新事件

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

    • pygame.key.getpressed()
  • 参考代码(在主逻辑代码中添加)

        def deal_event(self):
            """事件检测"""
            # print(pygame.event.get())
            for event in pygame.event.get():
                # 1. 鼠标点击关闭窗口事件
                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("右移")
                elif event.type==pygame.MOUSEBUTTONDOWN:
                    print("鼠标点击事件")
    

我方坦克分析

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

  • 基本坦克类:

    • 属性:图片、方向、图片矩形区域、坦克位置、移动速度、是否活着
    • 方法:移动、贴图
  • 参考代码(定义基本坦克类,让我方坦克类继承)

    class BaseTank:
        def __init__(self,x,y):
            """基本坦克类的属性"""
            # 加载图片文件,返回图片对象
            #将坦克图片储存在字典中
            self.images = {
                "U":pygame.image.load("tank_img/p1tankU.gif"),
                "D":pygame.image.load("tank_img/p1tankU.gif"),
                "L":pygame.image.load("tank_img/p1tankU.gif"),
                "R":pygame.image.load("tank_img/p1tankU.gif"),
            }
            #给初始化坦克一个方向
            self.direction = "U"
            #根据坦克方向获取坦克图片
            self.image = self.images[self.direction]
            #获取图片矩形区域
            self.rect = self.image.get_rect()
            #根据传入的参数,决定坦克的位置
            self.rect.x = x #坦克的x坐标
            self.rect.y = y #坦克的y坐标
            #移动速度
            self.speed = 3
            #是否活着
            self.live = True
        
        def display_tank(self):
            """贴坦克图片的方法"""
            #先获取坦克图片
            self.image = self.images[self.direction]
            #贴坦克图片
            MainGame.window.blit(self.image,self.rect)
    
    # - 我方坦克类
    class HeroTank(BaseTank):
        def __init__(self,x,y):
            super(HeroTank, self).__init__(x,y)
            self.speed = 2
    
  • 创建我方坦克,并加载图片

    • 在主逻辑中,一开始就存在我方坦克,定义P类属性记录
    • 先定义创建我方坦克的方法(create_hero_tank),再定义加载坦克图片的方法(load_hero_tank)
    • 在开始游戏时,调用创建坦克对象的方法,在循环中加载坦克图片
    #主逻辑中记录坦克
    P1 = None
    
        def create_tank(self):
            """创建我方坦克"""
            #判断是否创建了我方坦克
            if not MainGame.P1:
                MainGame.P1 = HeroTank(500,400) #坦克的初始位置
    
        def load_heor_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_heor_tank()
    

以上是关于坦克大战的主要内容,如果未能解决你的问题,请参考以下文章

Java坦克大战

坦克大战中的坦克

C语言——坦克大战

Java坦克大战

python 全解坦克大战 辅助类 附完整代码雏形

用javascript 面向对象制作坦克大战