Привет! Помогите пожалуйста с кодом из книги “python crash course 3-е издание.” Написал код из книги, проверял 3 раза. Не работает. Цель кода выстрелы снарядами. Буду очень благодарен если поможете!
Вот сам код:
Alien_invashion.py
import sys
import pygame
from settings import Settings
from ship import Ship
from bullet import Bullet
from pygame.sprite import Group
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.bg_color = (230, 230, 230)
def run_game(self):
“”“ Запуск основного цикла игры.”“”
while True:
self._check_events()
self.ship.update()
self._update_screen()
self.bullets.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_d:
self.ship.moving_right = True
elif event.key == pygame.K_a:
self.ship.moving_left = True
elif event.key == pygame.K_ESCAPE:
sys_exit()
elif event.key == pygame.K_SPACE:
self._fire_bullet()
def _check_keyup_events(self, event):
“”“ Реагирует на отпускиние клавиш.”“”
if event.key == pygame.K_d:
self.ship.moving_right = False
elif event.key == pygame.K_a:
self.ship.moving_left = False
def _fire_bullet(self):
“”“ ”“”
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()
# Отображение последнего прорисованного экрана
pygame.display.flip()
if __name__ == ‘__main__’:
# Создание экземпляра и запуск игры
ai = AlienInvasion()
ai.run_game()
ship.py
import pygame
class Ship():
“”“ Класс для управления кораблем”“”
def __init__(self, ai_game):
“”“ Инициализирует корабль и задает его начальную позицию.”“”
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
self.settings = ai_game.settings
# Загружает изображение корабля и получает прямоугольник.
self.image = pygame.image.load('Draketa.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
if 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)
settings.py
class Settings():
“”“ Класс для хранения всех настроек игры Alien Invasion.”“”
def __init__(self):
“”“ Инициализирует настройки игры.”“”
# Параметры экрана
self.screen_width = 1400
self.screen_height = 900
self.bg_color = (255, 255, 255)
# Настройка коробля
self.ship_speed = 2
# Параметры снаряда
self.bullet_speed = 2
self.bullet_width = 2
self.bullet_height = 15
self.bullet_color = (60, 60, 60)
bullet.py
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)