AttributeError: 'Alien' object has no attribute 'screen'

Самообучаюсь по книге Эрика Маттеса Pyhon Crash Course. При написании игры Alien Invasion столкнулся с ошибкой AttributeError: 'Alien' object has no attribute 'screen'. Никак не могу разобраться, прошу помощи.

class AlienInvasion:
# общий клас, который управляет ресурсами и поведением игры

def __init__(self):
    # инициализировать игру, создать ресурсы игры

    pygame.init()
    self.settings = Settings()

    self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
    self.settings.screen_width = self.screen.get_rect().width
    self.settings.screen_height = self.screen.get_rect().height
    pygame.display.set_caption("Alien Invasion")
    
    self.ship = Ship(self)
    self.bullets = pygame.sprite.Group()
    self.aliens = pygame.sprite.Group()

    self._create_fleet()

def _create_fleet(self):
    alien = Alien(self)
    alien_width, alien_height = alien.rect.size
    available_space_x = self.settings.screen_width - (2 * alien_width)
    number_aliens_x = available_space_x // (2 * alien_width)

    ship_height = self.ship.rect.height
    available_space_y = (self.settings.screen_height - (3 * alien_height) - ship_height)
    number_rows = available_space_y // (2 * alien_height)
    
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            self._create_alien(alien_number, row_number)


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)

def _check_fleet_edges(self):
    """ реагирует на достижение когото из приш края экрана """
    for alien in self.aliens.sprites():
        if alien.check_edges():
            self._change_fleet_direction()
            break

def _change_fleet_direction(self):
    """ спуск всего флота и изменение его направления"""
    for alien in self.aliens.sprites():
        alien.rect.y += self.settings.fleet_drop_speed
    self.settings.fleet_direction *= -1


def run_game(self):
    # начать главный цикл игры

    while True:
        # следить за событиями игры

        self._check_events()
        self.ship.update()
        self._update_bullets()
        self._update_aliens()
        self._update_screen()

def _update_bullets(self):
    self.bullets.update()
    # delete bullets
    for bullet in self.bullets.copy():
        if bullet.rect.bottom <= 0:
            self.bullets.remove(bullet)

def _update_aliens(self):
    """проверить не находится ли флот на краю и тогда обновить позиции всех приш флота"""
    self._check_fleet_edges()
    self.aliens.update()


def _check_events(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            self._check_keydown_events(event)
        elif event.type == pygame.KEYUP:
            self._check_keyup_events(event)

def _check_keydown_events(self, event):
    if event.key == pygame.K_RIGHT:
        self.ship.moving_right = True
    elif event.key == pygame.K_LEFT:
        self.ship.moving_left = True
    elif event.key == pygame.K_q:
        sys.exit()

    elif event.key == pygame.K_SPACE:
        self._fire_bullet()
            
def _check_keyup_events(self, event):           
    if event.key == pygame.K_RIGHT:
        self.ship.moving_right = False
    elif event.key == pygame.K_LEFT:
        self.ship.moving_left = False

def _fire_bullet(self):
    if len(self.bullets) < self.settings.bullets_allowed:
        new_bullet = Bullet(self)
        self.bullets.add(new_bullet)

def _update_screen(self):
                # заново перерисовать экран на каждой итерации цикла
    self.screen.fill(self.settings.bg_color)
    self.ship.blitme()
    for bullet in self.bullets.sprites():
        bullet.draw_bullet()
    self.aliens.draw(self.screen)
            
    pygame.display.flip()
                # показать последний нарисованный экран


class Settings:
# класс для сохранения всех настроек игры

def __init__(self):
    # инициализировать настройки игры

    # Screen settings
    self.screen_width = 1200
    self.screen_height = 800
    self.bg_color = (230, 230, 230)
    self.ship_speed = 1.5

    #bullet settings
    self.bullet_speed = 1.0
    self.bullet_width = 3
    self.bullet_height = 15
    self.bullet_color = (60, 60, 60)
    self.bullets_allowed = 3

    #alien settings
    self.alien_speed = 1.0
    self.fleet_drop_speed = 10
    self.fleet_direction = 1

class Alien(Sprite):

def __init__(self, ai_game):
    super().__init__()
    self.screeen = ai_game.screen
    self.settings = ai_game.settings
    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)

def check_edges(self):
    screen_rect = self.screen.get_rect()
    if self.rect.right >= screen_rect.right or self.rect.left <= 0 :
        return True


def update(self):
    """сместить пришельца вправо"""
    self.x += (self.settings.alien_speed * self.settings.fleet_direction)
    self.rect.x = self.x

Ответы (1 шт):

Автор решения: videx

Вы пытаетесь получить атрибут 'screen' но в классе 'Alien' такого атрибута нету, есть атрибут 'screeen' в котором 3 буквы е вместо двух. Полагаю вы опечатались.

→ Ссылка