求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()