#Python#外星人大战遇到的问题

涉及的内容《Python编程:从入门到实践》一书里《外星人大战》项目
1.有警告提示的代码 self.aliens.add(alien),里面传入的alien给了警告

def _create_alien(self, alien_number, row_number):
        """创建一个外星人并将其加入当前行。"""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)


2.报错内容:Expected type '_SpriteSupportsGroup | AbstractGroup[_SpriteSupportsGroup | Any] | Iterable[_SpriteSupportsGroup | Any] | Any' (matched generic type '_TSprite | AbstractGroup[_TSprite] | Iterable[_TSprite]'), got 'Alien' instead
3.查证了Alien类,Alien类也继承了Sprite,类型应该正确才对。搞不懂为什么会报错。

import pygame
from pygame.sprite import Sprite


class Alien(Sprite):
    """表示单个外星人的类。"""

    def __init__(self, ai_game):
        """初始化外星人并设置其起始位置。"""
        super().__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings

        # 加载外星人图像并设置其rect属性
        self.image = pygame.image.load('images/alien.bmp')
        self.rect = self.image.get_rect()

        # 每个外星人最初都在屏幕左上角附近。
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

        # 存储外星人的精确水平位置。
        self.x = float(self.rect.x)

4.系统是win10家庭版,软件用的PyCharm 版本信息:2022.3.2
5.希望有知道的伙伴指导一二

该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据报错信息,可能是因为self.aliens不是一个有效的Sprite组。请确认self.aliens是如下形式之一:

  • pygame.sprite.Group
  • pygame.sprite.LayeredUpdates
  • 继承自pygame.sprite.AbstractGroup的自定义类
    如果self.aliens的类型不是这些中的任何一个,那么self.aliens.add(alien)将无法正常工作,因为它需要一个有效的Sprite组作为参数。

同时,请确保在实例化self.aliens之前已经导入了pygame.sprite模块,例如:

import pygame
from pygame.sprite import Sprite, Group


如果还有问题,请提供完整的代码和完整的错误信息,以便更好地帮助您解决问题。

下面就是相关的部分代码,警告应该也是从这里面找原因
主程序的部分主要代码

import pygame
self.aliens = pygame.sprite.Group()

Alien类的部分主要代码

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
    """表示单个外星人的类。"""

    def __init__(self, ai_game):
        """初始化外星人并设置其起始位置。"""
        super().__init__()