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()
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容