怎样解决:'EnemyTank' object has no attribute 'displayBullet'
import pygame
import time
import random
_display = pygame.display
COLOR_BLACK = pygame.Color(0, 0, 0)
COLOR_RED = pygame.Color(255, 0, 0)
class MainGame():
# 游戏主窗口
window = None
SCREEN_HEIGHT = 500
SCREEN_WIDTH = 800
# 创建我方坦克
TANK_P1 = None
# 存储敌方所有坦克
EnemyTank_list = []
# 要创建的敌方坦克数量
EnemyTank_count = 5
# 我方子弹列表
Bullet_list = []
# 敌方子弹列表
Enemy_bullet_list = []
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, 450)
# 创建敌方坦克
self.createEnemyTank()
# 设置游戏标题
_display.set_caption('坦克大战!')
# 让窗口持续刷新操作
while True:
# 给窗口完成一个填充颜色
MainGame.window.fill(COLOR_BLACK)
# 在循环中持续完成事件的获取
self.getEvent()
# 将绘制文字得到的小画布粘贴到窗口中
MainGame.window.blit(self.getTextSurface('敌方剩余坦克%d辆!' %len(MainGame.EnemyTank_list)), (5, 5))
# 将我方坦克加入到窗口
MainGame.TANK_P1.displayTank()
# 展示敌方坦克
self.blitEnemyTank()
# 根据开关的状态调用坦克的移动方法
if MainGame.TANK_P1 and not MainGame.TANK_P1.stop:
MainGame.TANK_P1.move()
# 调用渲染子弹列表的一个方法
self.blitBullet()
# 调用渲染敌方子弹列表的方法
self.blitEnemyBullet()
time.sleep(0.02)
# 窗口的刷新
_display.update()
# 创建敌方坦克
def createEnemyTank(self):
top = 100
speed = random.randint(3, 6)
for i in range(MainGame.EnemyTank_count):
# 每次随机生成left值
left = random.randint(1, 7)
eTank = EnemyTank(left * 100, top, speed)
MainGame.EnemyTank_list.append(eTank)
# 将敌方坦克加入到窗口中
def blitEnemyTank(self):
for eTank in MainGame.EnemyTank_list:
eTank.displayTank()
# 调用坦克移动的方法
eTank.randMove()
# 调用敌方坦克的射击方法
eBullet = eTank.shot()
# 将子弹存储到敌方子弹列表中
MainGame.Enemy_bullet_list.append(eTank)
# 将我方子弹加入到窗口中
def blitBullet(self):
for bullet in MainGame.Bullet_list:
if bullet.live:
# 展示子弹
bullet.displayBullet()
# 子弹移动
bullet.bulletMove()
else:
MainGame.Bullet_list.remove(bullet)
def blitEnemyBullet(self):
for eBullet in MainGame.Enemy_bullet_list:
if eBullet.live:
# 展示子弹
eBullet.displayBullet()
# 子弹移动
eBullet.bulletMove()
else:
MainGame.Bullet_list.remove(eBullet)
# 获取程序期间所有事件(鼠标事件,键盘事件)
def getEvent(self):
# 获取所有事件
eventLsit = pygame.event.get()
# 对事件进行判断处理(点击关闭按钮,按下某个按键)
for event in eventLsit:
# 判断event.type是否是quit,如果是退出的花话,直接调用程序结束方法
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 len(MainGame.Bullet_list) < 3:
# 产生一颗子弹
m = Bullet(MainGame.TANK_P1)
# 将子弹加入子弹列表
MainGame.Bullet_list.append(m)
else:
print('子弹数量不足!')
print('当前屏幕中的子弹数量为:%d' % len(MainGame.Bullet_list))
if event.type == pygame.KEYUP:
# 如果松开方向键,才更改移动开关状态
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:
MainGame.TANK_P1.stop = True
# 在左上角文字绘制的功能
def getTextSurface(self, text):
# 初始化文字模块
pygame.font.init()
# fontList = pygame.font.get_fonts()
# 选中一个合适的字体
font = pygame.font.SysFont('kaiti', 18)
# 使用对应的字符完成相关内容的绘制
textSurface = font.render(text, True, COLOR_RED)
return textSurface
# 结束游戏方法
def endGame(self):
print('游戏结束!')
# 结束python解释器
exit()
class Tank():
def init(self, left, top):
self.images = {
'U': pygame.image.load('/resources/mytankU.jpg'),
'D': pygame.image.load('/resources/mytankD.jpg'),
'L': pygame.image.load('/resources/mytankL.jpg'),
'R': pygame.image.load('/resources/mytankR.jpg')}
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
self.live = 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 + self.rect.height < MainGame.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 < MainGame.SCREEN_HEIGHT:
self.rect.top += self.speed
# 射击方法
def shot(self):
return Bullet(self)
# 展示坦克方法
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):
super(EnemyTank, self).init(left, top)
self.images = {
'U': pygame.image.load('/resources/enemytankU.jpg'),
'D': pygame.image.load('/resources/enemytankD.jpg'),
'L': pygame.image.load('/resources/enemytankL.jpg'),
'R': pygame.image.load('/resources/enemytankR.jpg')}
self.direction = self.randDirection()
self.image = self.images[self.direction]
# 坦克所在的区域
self.rect = self.image.get_rect()
self.rect.left = left
self.rect.top = top
self.speed = speed
self.stop = True
self.step = 50
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 randMove(self):
if self.step <= 0:
self.direction = self.randDirection()
self.step = 50
else:
self.move()
self.step -= 1
def shot(self):
num = random.randint(1, 1000)
if num <= 30:
return Bullet(self)
class Bullet():
def init(self, tank):
self.image = pygame.image.load('E:/pythonProject/resources/bullet.jpg')
self.direction = tank.direction
self.rect = self.image.get_rect()
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
elif 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
elif self.direction == 'L':
self.rect.left = tank.rect.left - self.rect.width/2 - self.rect.width/2
self.rect.top = tank.rect.top + tank.rect.width/2 - self.rect.width/2
elif self.direction == 'R':
self.rect.left = tank.rect.left + tank.rect.width
self.rect.top = tank.rect.top + tank.rect.width/2 - self.rect.width/2
self.speed = 7
self.live = True
# 子弹移动方法
def bulletMove(self):
if self.direction == 'U':
if self.rect.top > 0:
self.rect.top -= self.speed
else:
self.live = False
elif self.direction == 'D':
if self.rect.top < MainGame.SCREEN_HEIGHT - self.rect.height:
self.rect.top += self.speed
else:
self.live = False
elif self.direction == 'L':
if self.rect.left > 0:
self.rect.left -= self.speed
else:
self.live = False
elif self.direction == 'R':
if self.rect.left < MainGame.SCREEN_WIDTH - self.rect.width:
self.rect.left += self.speed
else:
self.live = False
# 子弹展示方法
def displayBullet(self):
MainGame.window.blit(self.image, self.rect)
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 play(self):
pass
MainGame().startGame()