AttributeError: ‘Tank‘ object has no attribute ‘live‘

求各位大佬看看坦克大战的代码哪错了

#encoding=gbk
import pygame
import time
import random
SCREEN_WIDTH=1000
SCREEN_HEIGHT=750
BG_COLOR=pygame.Color(0,0,0)#背景颜色
TEXT_COLOR=pygame.Color(255,0,0)#字体颜色
class Tank(object):
    '''该类会显示坦克的移动,进攻,显示和摧毁'''
    def __init__(self,left,top):
        #保存加载图片
        self.images={
            'U':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\p1tankU.gif"),
            'D':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\p1tankD.gif"),
            'L':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\p1tankL.gif"),
            'R':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\p1tankR.gif"),
            }
        #设置坦克方向
        self.direction='U'
        #获取加载图片
        self.image=self.images.get(self.direction)
        #获取矩形区域
        self.rect=self.image.get_rect()
        #设置图片left和top
        self.rect.left=left
        self.rect.top=top
        self.speed=1
        #是否停止
        self.stop=True
    def disTank(self):
        self.image=self.images.get(self.direction)
         #调用blit方法展示坦克
        MainGame.window.blit(self.image,self.rect)
    def moveTank(self):
        if self.direction=='L':
            if self.rect.left>0:
                self.rect.left-=self.speed
        elif self.direction=='R':
            if self.rect.left+self.rect.height<SCREEN_WIDTH:
                self.rect.left+=self.speed
        elif self.direction=='U':
            if self.rect.top>0:
                self.rect.top-=self.speed
        elif self.direction=='D':
            if self.rect.top+self.rect.height<SCREEN_HEIGHT:
                self.rect.top+=self.speed

    def destoryTank(self):
        pass
    def shot(self):
        pass
class MyBullet(object):
    '''子弹动画,飞行,命中'''
    def __init__(self,tank):
        self.image=pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemymissile.gif")
        #子弹方向
        self.direction=tank.direction
        #获取图片区域
        self.rect=self.image.get_rect()
        #设置left,top
        if self .direction=="U":
            self.rect.left=tank.rect.left+(tank.rect.width)/2-(self.rect.width)/2
            self.rect.top=tank.rect.top+tank.rect.height+self.rect.height
        if self .direction=="D":
            self.rect.left=tank.rect.left+(tank.rect.width)/2-(self.rect.width)/2
            self.rect.top=tank.rect.top-self.rect.height
        if self.direction=="L":
            self.rect.left=tank.rect.left+tank.rect.width+self.rect.width
            self.rect.top=tank.rect.top+(tank.rect.height)/2-(self.rect.height)/2
        if self.direction=="R":
            self.rect.left=tank.rect.left-self.rect.width
            self.rect.top=tank.rect.top+(tank.rect.height)/2-(self.rect.height)/2
        #子弹速度
        self.speed=10
        self.live=True
    def disMyBullet(self):
        #将图片加载到窗口
        MainGame.window.blit(self.image,self.rect)
    
    def moveBullet(self):
        if self.direction=="U":
            if self.rect.top+self.rect.height<=SCREEN_HEIGHT:
                self.rect.top+=self.speed
            else:#碰到墙壁
                self.live=False
        elif self.direction=="D":
            if self.rect.top>=0:
                self.rect.top-=self.speed
            else:#碰到墙壁
                self.live=False
        elif self.direction=="L":
            if self.rect.left+self.rect.width<=SCREEN_WIDTH:
                self.rect.left+=self.speed
            else:#碰到墙壁
                self.live=False
        elif self.direction=="R":
            if self.rect.left>=0:
                self.rect.left-=self.speed
            else:#碰到墙壁
                self.live=False
class EnemyBullet():
    '''子弹动画,飞行,命中'''
    def __init__(self,tank):
        self.image=pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemymissile.gif")
        #子弹方向
        self.direction=tank.direction
        #获取图片区域
        self.rect=self.image.get_rect()
        #设置left,top
        if self .direction=="D":
            self.rect.left=tank.rect.left+(tank.rect.width)/2-(self.rect.width)/2
            self.rect.top=tank.rect.top+tank.rect.height+self.rect.height
        if self .direction=="U":
            self.rect.left=tank.rect.left+(tank.rect.width)/2-(self.rect.width)/2
            self.rect.top=tank.rect.top-self.rect.height
        if self.direction=="R":
            self.rect.left=tank.rect.left+tank.rect.width+self.rect.width
            self.rect.top=tank.rect.top+(tank.rect.height)/2-(self.rect.height)/2
        if self.direction=="L":
            self.rect.left=tank.rect.left-self.rect.width
            self.rect.top=tank.rect.top+(tank.rect.height)/2-(self.rect.height)/2
        #子弹速度
        self.speed=10
        self.live=True
    def disEnemyBullet(self):
        #将图片加载到窗口
        MainGame.window.blit(self.image,self.rect)
    
    def moveBullet(self):
        if self.direction=="D":
            if self.rect.top+self.rect.height<=SCREEN_HEIGHT:
                self.rect.top+=self.speed
            else:#碰到墙壁
                self.live=False
        elif self.direction=="U":
            if self.rect.top>=0:
                self.rect.top-=self.speed
            else:#碰到墙壁
                self.live=False
        elif self.direction=="R":
            if self.rect.left+self.rect.width<=SCREEN_WIDTH:
                self.rect.left+=self.speed
            else:#碰到墙壁
                self.live=False
        elif self.direction=="L":
            if self.rect.left>=0:
                self.rect.left-=self.speed
            else:#碰到墙壁
                self.live=False
class Wall(object):
    '''墙体摧毁,障碍'''
    def __init__(self) -> None:
        pass
    def disWall(self):
        pass
    def destoryWall(self):
        pass
    def stopWall(self):#墙壁阻挡
        pass
class Music(object):
    '''发射,爆炸等音效'''
    def __init__(self) -> None:
        pass
    def backMusic(self):
        pass
    def boomMusic(self):
        pass
class Boom(object):
    '''爆炸效果'''
    def __init__(self) -> None:
        pass
    def disBoom(self):
        pass
class MainGame:
    '''开始,结束,模式转换'''
    window=None
    myTank=None
    enemyCount=1
    enemyList=[]
    myBulletList=[]
    enemyBullentList=[]
    def __init__(self) -> None:
        pass
    #创建敌方坦克
    def createEnemyTank(self):
        
        for i in range(MainGame.enemyCount):
            left=random.randint(0,1000)
            speed=random.randint(1,9)
            top=random.randint(0,50)
            enemyTank=EnemyTank(left,top,speed)
            #添加到列表
            MainGame.enemyList.append(enemyTank)
    #加载敌方坦克
    def disEnemyTank(self):
        for enemyTank in MainGame.enemyList:
            #调用moveTank进行移动
            enemyTank.randMove()
            #展示敌方坦克
            enemyTank.disTank()
            #初始化敌方坦克发射的子弹
            enemyBullent=enemyTank.shot()
            MainGame.enemyBullentList.append(enemyBullent)
    #显示敌方子弹
    def disEnemyBullet(self):
        for enemyBullet in MainGame.enemyBullentList:
            if enemyBullet.live:
                enemyBullet.disEnemyBullet()
                enemyBullet.moveBullet()
            else:
                MainGame.enemyBullentList.remove(enemyBullet)
    #显示我方子弹
    def disMyBullet(self):
        for myBullet in MainGame.myBulletList:
            #判断子弹是否存活
            if myBullet.live:
                myBullet.disMyBullet()
                myBullet.moveBullet()
            else:
                MainGame.myBulletList.remove(myBullet)
    def startgame(self):
        pygame.init()
        MainGame.window=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
        pygame.display.set_caption("变态的坦克大战")
        MainGame.myTank=Tank(0,0)
        self.createEnemyTank()
        while True:
            time.sleep(0.005)
            MainGame.window.fill(BG_COLOR)
            #文字提示信息
            textSurface=self.getTextSurface("敌方坦克剩余数量%d"%100)
            #主窗口显示文字信息
            MainGame.window.blit(textSurface,(6,6))
            #关闭游戏事件监听
            self.getEvent()
            #调用坦克显示方法
            MainGame.myTank.disTank()
            if not MainGame.myTank.stop:
                MainGame.myTank.moveTank()
            #加载敌方坦克
            self.disEnemyTank()
            #加载我方子弹
            self.disMyBullet()
            #加载敌方子弹
            self.disEnemyBullet()
            pygame.display.update()
    def overgame(self):
        print("关闭游戏")
        exit()
    #文字信息编辑
    def getTextSurface(self,text):
        #文字模块初始化
        pygame.font.init()
        #获取所有字体
        #print(pygame.font.get_fonts())
        #获取字体对象
        font=pygame.font.SysFont("fangsong",20)
        #绘制文字信息
        textSurface=font.render(text,True,TEXT_COLOR)
        return textSurface
    #添加事件监听
    def getEvent(self):
        #获取所有事件
        eventlist=pygame.event.get()
        #遍历事件
        for event in eventlist:
            #关闭游戏
            if event.type==pygame.QUIT:
                self.overgame()
            if event.type==pygame.KEYDOWN:
                #上,下,左,右
                if event.key==pygame.K_LEFT:
                    print("按下左键")
                    MainGame.myTank.direction='L'
                    MainGame.myTank.stop=False
                elif event.key==pygame.K_RIGHT:
                    print("按下右键")
                    MainGame.myTank.direction='R'
                    MainGame.myTank.stop=False
                elif event.key==pygame.K_UP:
                    print("按下上键")
                    MainGame.myTank.direction='U'
                    MainGame.myTank.stop=False
                elif event.key==pygame.K_DOWN:
                    print("按下下键")
                    MainGame.myTank.direction='D'
                    MainGame.myTank.stop=False
                elif event.key==pygame.K_SPACE:
                    print("发射子弹")
                    #判断子弹数量是否小于2
                    if len(MainGame.myBulletList)<2:
                        #初始化子弹
                        myBullet=(MainGame.myTank)
                        MainGame.myBulletList.append(myBullet)
            if event.type==pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_UP or event.key == pygame.K_RIGHT or event.key == pygame.K_DOWN:
                    MainGame.myTank.stop=True
           
               
class MyTank(Tank):
    def __init__(self) -> None:
        super().__init__()
        pass
class EnemyTank(Tank):
    def __init__(self,left,top,speed):
        self.images={
            'U':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemy1U.gif"),
            'D':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemy1D.gif"),
            'L':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemy1L.gif"),
            'R':pygame.image.load("D:\BaiduNetdiskDownload\源码\坦克大战\img\enemy1R.gif"),
            }
        #设置敌方坦克方向
        self.direction=self.randDirection()
        #根据方向获取图片
        self.image=self.images.get(self.direction)
        #获取矩形区域
        self.rect=self.image.get_rect()
        #设置left,top,speed
        self.rect.left=left
        self.rect.top=top
        self.speed=speed
        self.step=60
    #随机生成方向
    def randDirection(self):
        num=random.randint(1,4)
        if num==1:
            return"U"
        if num==2:
            return"D"
        if num==3:
            return"L"
        if num==4:
            return"R"
    #随机移动敌方坦克
    def randMove(self):
        if self.step<=0:
            #修改坦克方向
            self.direction=self.randDirection()
            #步数复位
            self.step=30
        else:
            self.moveTank()
            #步数递减
            self.step-=1
    def shot(self):
        return EnemyBullet(self)
if __name__=="__main__":
    MainGame().startgame()
    #MainGame().getTextSurface("aa")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值