Проблема с игрой в пайгейм
# основной файл
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' и кучу ошибок подобного формата
Источник: Stack Overflow на русском