DDDeED719 2022-11-08 17:18 采纳率: 0%
浏览 40

AttributeError: 'EnemyTank' object has no attribute 'displayBullet'

怎样解决:'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()

  • 写回答

1条回答 默认 最新

  • honestman_ 2022-11-08 17:27
    关注

    贴了这一坨,连哪里报错都没贴, 就是敌机类没有这个方法displayBullet,加上就行了

    评论

报告相同问题?

问题事件

  • 创建了问题 11月8日

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大