Python___1025 2024-06-24 22:17 采纳率: 100%
浏览 7
已结题

代码错误,怎么进行修改

这个是python3.7编制的飞机大战的部分代码,第45行和第116行报黄,错误提示为应为类型 'Union[Union[_SpriteSupportsGroup, AbstractGroup[Union[_SpriteSupportsGroup, Any]], Iterable[Union[_SpriteSupportsGroup, Any]]], Any]' (匹配的泛型类型 'Union[_TSprite, AbstractGroup[_TSprite], Iterable[_TSprite]]'),但实际为 'PlayerBullet',运行程序后报警为AttributeError: 'EnemyBullet1' object has no attribute 'image' import random

import random

import pygame
from pygame.constants import *

import time


# 玩家飞机类
class HeroPlane(pygame.sprite.Sprite):
    def __init__(self, screen):
        # 精灵的初始化方法
        pygame.sprite.Sprite.__init__(self)

        # 载入图片 玩家飞机
        self.player = pygame.image.load('./images/me1.png')

        # 根据图片获取矩形对象
        self.rect = self.player.get_rect()
        self.rect.topleft = [480 / 2 - 100 / 2, 550]

        # 飞机速度
        self.speed = 5

        self.screen = screen

        # 装子弹的列表
        self.bullets = pygame.sprite.Group()

    def key_control(self):
        # 键盘连续监听
        key_pressed = pygame.key.get_pressed()

        if key_pressed[K_w] or key_pressed[K_UP]:
            self.rect.top -= self.speed
        if key_pressed[K_s] or key_pressed[K_DOWN]:
            self.rect.bottom += self.speed
        if key_pressed[K_a] or key_pressed[K_LEFT]:
            self.rect.left -= self.speed
        if key_pressed[K_d] or key_pressed[K_RIGHT]:
            self.rect.right += self.speed
        if key_pressed[K_SPACE]:
            bullet = PlayerBullet(self.screen, self.rect.left, self.rect.top)
            # 把子弹放到列表里
            self.bullets.add(bullet)

    def update(self):
        self.key_control()
        self.display()

    def display(self):
        # 将飞机图片贴到窗口
        self.screen.blit(self.player, self.rect)
        # 更新子弹坐标
        self.bullets.update()

        # 把所有子弹全部添加到屏幕
        self.bullets.draw(self.screen)


# 敌人飞机类1
class EnemyPlane1(pygame.sprite.Sprite):
    def __init__(self, screen):
        # 精灵的初始化方法
        pygame.sprite.Sprite.__init__(self)

        # 载入图片 玩家飞机
        self.enemy_plane1 = pygame.image.load('./images/enemy1.png')

        # 根据图片获取矩形对象
        self.rect = self.enemy_plane1.get_rect()
        self.rect.topleft = [0, 0]

        # 飞机速度
        self.speed = 3

        self.screen = screen

        # 装子弹的列表
        self.bullets = pygame.sprite.Group()

        # 敌机移动方向
        self.direction = 'right'

    def display(self):
        self.screen.blit(self.enemy_plane1, self.rect)  # 粘贴图片 玩家飞机
        # 更新子弹坐标
        self.bullets.update()

        # 把所有子弹全部添加到屏幕
        self.bullets.draw(self.screen)

    def update(self):
        self.auto_move()
        self.auto_fire()
        self.display()

    def auto_move(self):
        # 方向判断
        if self.direction == 'right':
            self.rect.right += self.speed
        elif self.direction == 'left':
            self.rect.right -= self.speed

        # 方向转换
        if self.rect.right > 480 - 57:
            self.direction = 'left'
        elif self.rect.right < 0:
            self.direction = 'right'

    def auto_fire(self):
        """自动开火 创建子弹对象 添加进列表"""
        random_num1 = random.randint(1, 20)
        if random_num1 == 8:
            bullet = EnemyBullet1(self.screen, self.rect.left, self.rect.top)
            self.bullets.add(bullet)


# 玩家子弹类
# 属性
class PlayerBullet(pygame.sprite.Sprite):
    def __init__(self, screen, x, y):
        # 精灵的初始化方法
        pygame.sprite.Sprite.__init__(self)

        # 创建图片
        self.player_bullet1 = pygame.image.load('./images/bullet1.png')

        # 获取矩形对象
        self.rect = self.player_bullet1.get_rect()
        self.rect.topleft = [x + 102 / 2 - 5 / 2, y - 11]

        # 窗口
        self.screen = screen
        # 速度
        self.speed = 13

    def update(self):
        # 修改子弹坐标
        self.rect.top -= self.speed

        # 如果子弹移除界面,销毁子弹
        if self.rect.top < -11:
            self.kill()


# 敌机子弹类
# 属性
class EnemyBullet1(pygame.sprite.Sprite):
    def __init__(self, screen, x, y):
        # 精灵的初始化方法
        pygame.sprite.Sprite.__init__(self)

        # 创建图片
        self.enemy_bullet1 = pygame.image.load('./images/bullet2.png')

        # 获取矩形对象
        self.rect = self.enemy_bullet1.get_rect()
        self.rect.topleft = [x + 58 / 2 - 4 / 2, y + 43]

        # 窗口
        self.screen = screen
        # 速度
        self.speed = 10

    def update(self):
        # 修改子弹坐标
        self.rect.top += self.speed

        # 如果子弹移除界面,销毁子弹
        if self.rect.top > 781:
            self.kill()


def main():
    """完成整个程序的控制"""
    # 创建窗口
    screen = pygame.display.set_mode((480, 700), 0, 32)
    # 载入图片 背景
    background = pygame.image.load('./images/background.png')
    # 创建玩家飞机对象
    player = HeroPlane(screen)
    # 创建敌人飞机1对象
    enemy_plane1 = EnemyPlane1(screen)

    while True:
        screen.blit(background, (0, 0))  # 粘贴图片 背景

        # 获取事件
        for event in pygame.event.get():
            # 判断事件类型
            if event.type == pygame.QUIT:
                # 执行退出
                pygame.quit()
                # python程序退出
                exit()

        # 执行飞机的按键监听
        player.key_control()
        # 显示玩家飞机
        player.display()

        # 显示敌人飞机1
        enemy_plane1.display()
        # 敌机自动移动
        enemy_plane1.auto_move()
        # 敌机自动开火
        enemy_plane1.auto_fire()

        # 显示图片内容
        pygame.display.update()
        time.sleep(0.01)


if __name__ == '__main__':
    main()


  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-24 22:17
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据你提供的错误信息和代码,这里有几个问题需要解决:

    1. 类型不匹配问题:错误提示指出在第45行和第116行存在类型不匹配问题。这通常发生在你尝试将一个对象添加到一个pygame的Group中,但该对象的类型与Group期望的类型不匹配。在pygame中,Group可以包含Sprite对象或其它Group对象,但不能直接包含非Sprite类型的对象。

    2. AttributeError问题:运行程序时出现 'EnemyBullet1' object has no attribute 'image' 错误,这意味着EnemyBullet1类中没有定义image属性,但在某个地方尝试访问了这个属性。

    针对这些问题,这里是一些可能的解决方案:

    解决类型不匹配问题

    • 确保你添加到Group中的对象都是pygame.sprite.Sprite的实例。在你的代码中,PlayerBulletEnemyBullet1类都继承自pygame.sprite.Sprite,所以它们应该可以被添加到Group中。如果问题仍然存在,检查是否有其他地方错误地使用了Group

    解决AttributeError问题

    • 错误提示'EnemyBullet1' object has no attribute 'image'表明在某个地方尝试访问了EnemyBullet1实例的image属性,但这个属性在EnemyBullet1类中没有定义。你需要检查代码中是否有地方错误地引用了image属性。根据你的代码,EnemyBullet1类中定义了enemy_bullet1属性,所以你应该使用self.enemy_bullet1来代替任何对image的引用。

    代码示例修正

    • 根据你的代码,EnemyBullet1类中的update方法应该使用self.enemy_bullet1而不是self.image。修正后的update方法如下:
    class EnemyBullet1(pygame.sprite.Sprite):
        # ... 省略其他部分 ...
    
        def update(self):
            # 修改子弹坐标
            self.rect.top += self.speed
    
            # 如果子弹移除界面,销毁子弹
            if self.rect.top > 781:
                self.kill()
    
            # 这里需要使用self.enemy_bullet1而不是self.image
            self.screen.blit(self.enemy_bullet1, self.rect)
    

    检查引用

    • 检查你的代码中是否有其他地方错误地引用了image属性。如果有,将它们替换为正确的属性名。

    测试和调试

    • 修复上述问题后,运行你的程序并观察是否还有错误。如果错误仍然存在,使用调试工具逐步执行代码,查看在哪个部分出现了问题。

    如果你需要进一步的帮助,或者有特定的代码段需要检查,请随时告诉我。我会尽力提供更具体的帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月28日
  • 已采纳回答 6月28日
  • 创建了问题 6月24日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见