求Python大神指点

150 阅读3分钟

求Python大神指点,新手自学坦克大战,加载地方坦克一直出错,错误提示如下:

Traceback (most recent call last): File "E:\python\坦克大战\106-9.py", line 256, in MainGame().startGame() File "E:\python\坦克大战\106-9.py", line 34, in startGame self.creatEnemyTank() File "E:\python\坦克大战\106-9.py", line 75, in creatEnemyTank eTank = EnemyTank(left,top,speed) File "E:\python\坦克大战\106-9.py", line 192, in init self.image = self.images[self.randDirection]#-* KeyError: <bound method EnemyTank.randDirection of <main.EnemyTank object at 0x000001DE7108BDC0>>

我写的代码如下:

#V1.09 新增敌方坦克:完善地方坦克,显示地方坦克 import time import pygame import random

#这里是全局变量 _display = pygame.display COLOR_BLACK = pygame.Color(50,53,55) COLOR_RED = pygame.Color(255,0,0) version = 'v1.09'

class MainGame():

window = None
SCREEN_HEIGHT = 500
SCREEN_WIDTH = 800
#当颜色是方法的时候,调用方法,方法(1)
#创建我方坦克
TANK_P1 = None
#存储地方坦克
EnemyTank_list = []
EnemyTank_count = 5

def __init__(self):
    pass

def startGame(self):#----------------开始游戏-----------------
    _display.init()
    #创建窗口加载窗口,借鉴官方文档
    MainGame.window = _display.set_mode([MainGame.SCREEN_WIDTH,MainGame.SCREEN_HEIGHT])
    
    MainGame.TANK_P1 = Tank(400,380)
    self.creatEnemyTank()
    self.displayEnemyTank()
    _display.set_caption("坦克大战:"+version)
    
    self.getTextSurface('aaa中间')
    #是窗口持续刷新
    while True:
        #给窗口一个颜色填充,方法(1)
        #MainGame.window.fill(MainGame.COLOR_BLACK)
        
        #当颜色变量为全局变量时,就不是调用方法,而是调用变量方法(2)如下
        MainGame.window.fill(COLOR_BLACK)

        self.getEvent()
        
        #将绘制的文字得到的小画布,粘贴到窗口
        MainGame.window.blit(self.getTextSurface("剩余地方坦克%d辆"%5),(5,5))

        
        #将我方坦克加载进来
        MainGame.TANK_P1.displayTank()
        
        #将敌方坦克加装进来
        
        self.blitEnemyTank()
        
        if MainGame.TANK_P1 and not MainGame.TANK_P1.stop:
            MainGame.TANK_P1.move()
            
        #显示的时间频率
        time.sleep(0.015)
        
        #窗口的刷新
        _display.update()
#创建敌方坦克:
def creatEnemyTank(self):
    
    top = 100
    speed = 4 #random.randint(3,5)
    for i in range(MainGame.EnemyTank_count):
        left = random.randint(1,7)
        eTank = EnemyTank(left,top,speed)
        MainGame.EnemyTank_list.append(eTank)
        
#将敌方坦克加入列表
def blitEnemyTank(self):
    for eTank in MainGame.EnemyTank_list:
        eTank.displayTank()
    

def getEvent(self):
    '''1.获取事件
       2.对事件进行判断、处理(点击关闭,监控按键等)
    '''
    eventList = pygame.event.get()
    for event in eventList:
        #判断event.type是否是推出
        if event.type == pygame.QUIT:
            self.endGame()
        #判断事件类型,是否为按键按下,如果是,继续判断是哪一个按键,来进行对应处理
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print("坦克向左转")
                #修改坦克方向
                MainGame.TANK_P1.direction = 'L'
                MainGame.TANK_P1.stop = False
            elif event.key == pygame.K_RIGHT:
                print("坦克向右转")
                MainGame.TANK_P1.direction = 'R'
                MainGame.TANK_P1.stop = False
            elif event.key == pygame.K_UP:
                print("坦克向上")
                MainGame.TANK_P1.direction = 'U'
                MainGame.TANK_P1.stop = False
            elif event.key == pygame.K_DOWN:
                print("坦克向下")
                MainGame.TANK_P1.direction = 'D'
                MainGame.TANK_P1.stop = False
            elif event.key == pygame.K_SPACE:
                print("发射")
        if event.type == pygame.KEYUP:
            #将坦克的移动状态修改
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_DOWN or event.key == pygame.K_UP:
                MainGame.TANK_P1.stop = True
            
def getTextSurface(self,text):
    #字体初始化
    pygame.font.init()
    #查看系统所支持的字体
    # fontList = pygame.font.get_fonts()
    # print(fontList)
    #选中一个合适的字体
    font = pygame.font.SysFont('fangsong',18)
    #使用对应的字体完成相关的内容
    textSurface = font.render(text,True,COLOR_RED)
    return textSurface
def endGame(self):
    print("谢谢使用")
    exit()
    #pass

class Tank(): def init(self,left,top): self.images = { 'U':pygame.image.load('/python/坦克大战/坦克U.png'), 'D':pygame.image.load('/python/坦克大战/坦克D.png'), 'L':pygame.image.load('/python/坦克大战/坦克L.png'), 'R':pygame.image.load('/python/坦克大战/坦克R.png') }

    self.direction = 'U'
    self.image = self.images[self.direction]#//////
    #坦克所在的区域
    self.rect = self.image.get_rect()
    #指定坦克初始化的位置
    self.rect.left = left
    self.rect.top = top
    self.speed = 5
    #增加坦克的开关
    self.stop = True
def move(self):#移动方法
    if self.direction == 'L':
        if self.rect.left > 0:
            self.rect.left -= self.speed
    elif self.direction == 'R':
        if self.rect.left < 755:
            self.rect.left += self.speed
    elif self.direction == 'U':
        if self.rect.top > 10:
            self.rect.top -= self.speed
    elif self.direction == 'D':
        if self.rect.top < 448:
            self.rect.top += self.speed
def shot(self):#射击方法
    pass

def displayTank(self):#展示方法
    #重新设置坦克的图片-------------------
    self.image = self.images[self.direction]
    #将坦克加入到窗口
    MainGame.window.blit(self.image,self.rect)

class MyTank(Tank):#我方坦克 def init(self): pass

class EnemyTank(Tank):#敌方坦克 def init(self,left,top,speed): self.images = { 'U':pygame.image.load('/python/坦克大战/敌方坦克U.png'), 'D':pygame.image.load('/python/坦克大战/敌方坦克D.png'), 'L':pygame.image.load('/python/坦克大战/敌方坦克L.png'), 'R':pygame.image.load('/python/坦克大战/敌方坦克R.png') }

    #self.direction = self.randDirection
    self.image = self.images[self.randDirection]#-*
    #坦克所在的区域
    self.rect = self.image.get_rect()
    #指定坦克初始化的位置
    self.rect.left = left
    
    self.rect.top = top
    
    self.speed = speed
    
    self.stop = True
def randDirection(self):
    num = random.randint(1,4)
    if num == 1:
        return 'U'
    elif num == 2:
        return 'D'
    elif num == 3:
        return 'L'
    elif num == 4:
        return 'R'


def displayEnemyTank(self):#展示方法
    self.image = self.images[self.direction]
    super().displayTank()

class Bullet():#子弹类 def init(self): pass

def move(self):#移动方法
    pass

def displayBullet(self):#展示子弹方法
    pass

class Explode():#爆炸类 def init(self): pass

def displayExplode(self):#展示爆炸方法
    pass

class Wall():#墙类 def init(self): pass

def displayWall(self):#展示爆炸方法
    pass

class Music():#音乐类 def init(self): pass

def startMusic(self):#开始音乐方法
    pass
def endMusic(self):#结束音乐方法
    pass

MainGame().startGame()