Форум сайта python.su
Привет! Помогите пожалуйста с кодом из книги “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)
Офлайн
Ilya_Python240
Привет! Помогите пожалуйста с кодом из книги “python crash course 3-е издание.” Написал код из книги, проверял 3 раза. Не работает. Цель кода выстрелы снарядами. Буду очень благодарен если поможете!Вот сам код:Alien_invashion.pyimport sysimport pygamefrom settings import Settingsfrom ship import Shipfrom bullet import Bulletfrom pygame.sprite import Groupclass 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.pyimport pygameclass 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.pyclass 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.pyimport pygamefrom pygame.sprite import Spriteclass 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)
Офлайн
Помещайте код в теги Python код из линейки сверху Это рядом с улыбкой.
Переписывать код не понимая это пустая трата времени. Посмотрите в книжке должны быть ссылки на сайт где размещен готовый код который не надо перебивать.
Офлайн
doza_and
Помещайте код в теги Python код из линейки сверху Это рядом с улыбкой.Переписывать код не понимая это пустая трата времени. Посмотрите в книжке должны быть ссылки на сайт где размещен готовый код который не надо перебивать.
Офлайн
Ilya_Python240проблема решена.
Офлайн