Проблема с игрой в пайгейм

Рейтинг: -2Ответов: 1Опубликовано: 02.03.2023
# основной файл
import sys
import pygame
from settings import Settings
from ship import Ship
from bullet import Bullet
from alien import Alien

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.screen, self.settings)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        
        self._create_fleet()
    def _create_fleet(self):
        '''Создание флота вторжения.'''
        # Создание пришельца и вычисление кол-ва пришельцев в ряду.
        # P.s.Интервал между соседними пришельцами равен ширине пришельца.
        alien = Alien(self)
        alien_width = alien.rect.width
        available_space_x = self.screen.width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)
        
        # Создание первого ряда пришельцев.
        for alien_number in range(number_aliens_x):
            # Создание пришельца и размещение его в ряду.
            alien = Alien(self)
            alien.x = alien_width + 2 * alien_width * alien_number
            alien.rect.x = alien.x
            self.aliens.add(alien)
        # Назначение цвета фона.
    
    def run_game(self):
        '''Запуск основного цикла игры.'''
        while True:
            self._check_events()
            self.ship.update()
            self.update_bullets()
            self._update_screen()
            # Удаление снарядов, вышедших за край экрана.
            print(len(self.bullets))
            
            self._update_screen()
            # При каждом проходе цикла перерисовывается экран.
    # Отслеживание событий клавиатуры и мыши.
    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):
        '''Создание нового снаряда и включение его в группу bullets.'''
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)
    
    def update_bullets(self):
        '''Обновлет позиции снарядов и уничтожает старые снаряды.'''
        # Обновление позиций снарядов.
        self.bullets.update()
        # Удаление снарядов, вышедших за край экрана.
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(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()
                
if __name__ == '__main__':
# Создание эклемпляра и запуск игры.
    ai = AlienInvasion()
    ai.run_game()

#settings
class Settings():
    '''Класс для хранения всех настроек игры Alien Invasion'''
    
    def __init__(self):
        'Инициализирует настройки игры.'
        # Параметры экрана:
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)
        
        # Настройки корабля
        self.ship_speed = 1.5
        
        # Параметры снаряда
        self.bullet_speed = 1
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = (60, 60, 60)
        self.bullets_allowed = 3
#ship
import pygame

class Ship():
    '''Класс для управления кораблём.'''
    
    def __init__(self, ai_game, settings):
        '''Инициализирует корабль и задаёт его начальную позицию.'''
        self.screen = ai_game
        self.settings = settings
        self.screen_rect = ai_game.get_rect()
        
        # Загружает изображение корабля и получает прямоугольник.
        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect()
        # Каждый новый корабль появляется у нижнего края экрана.
        self.rect.midbottom = self.screen_rect.midbottom
        # Сохранение вещественной координаты центра корабля.
        self.x = float(self.rect.x)
        
        # Флаги перемещения
        self.moving_right = False
        self.moving_left = False
    
    def update(self):
        """Обновляет позицию корабля с учётом флага."""
        # Обновляется атрибут x, не rect.
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x += self.settings.ship_speed
        
        elif self.moving_left and self.rect.left > 0:
            self.x -= self.settings.ship_speed
            
        # Обновление атрибута rect на основании self.x.
        self.rect.x = self.x
        
    def blitme(self):
        'Рисует корабль в текущей позиции.'
        self.screen.blit(self.image, self.rect)
#Bullet
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
    '''Класс для управления снарядами, выпущенными кораблём.'''
    
    def __init__(self, ai_game):
        '''Создаёт объект снарядов в текущей позиции корабля.'''
        super().__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.color = self.settings.bullet_color
        
        # Создание снаряда в позиции (0, 0) и назначение правильной позиции.
        self.rect = pygame.Rect(0, 0, self.settings.bullet_width,
            self.settings.bullet_height)
        self.rect.midtop = ai_game.ship.rect.midtop
        
        # Позиция снаряда хранится в вещественном формате.
        self.y = float(self.rect.y)
        
    def update(self):
        '''Перемещает снаряд вверх по экрану.'''
        # Обновление позиции снаряда в вещественном формате.
        self.y -= self.settings.bullet_speed
        # Обновление позиции прямоугольника.
        self.rect.y = self.y
    
    def draw_bullet(self):
        '''Вывод снаряда на экран.'''
        pygame.draw.rect(self.screen, self.color, self.rect)
#Alien
import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
    '''Класс, представляющий одного пришельца.'''
    
    def __init__(self, ai_game):
        '''Инициализирует пришельца и задаёт его начальную позицию.'''
        super().__init__()
        self.screen = ai_game.screen
        
        # Загрузка изображения пришельца и назначение атрибута rect.
        self.image = pygame.image.load('images/alien.bmp')
        self.rect = self.image.get_rect()
        
        # Сохранение точной горизонтальной позиции пришельца.
        self.x = float(self.rect.x)

Выдаёт ошибку: available_space_x = self.screen.width - (2 alien_width) AttributeError: 'pygame.Surface' object has no attribute 'width' и кучу ошибок подобного формата

Ответы

▲ 0

Пропущено self.settings.screen_width:

alien_width = alien.rect.width
available_space_x = self.settings.screen_width - (2 * alien_width)
number_aliens_x = available_space_x // (2 * alien_width)