0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 20
|
|
|
|
Не получается создать флот пришельцев (pygame)
20.03.2021, 13:56. Показов 4998. Ответов 0
main.py
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
| 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(
(self.settings.screen_width, self.settings.screen_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 run_game(self):
"""Запуск основного цикла игры."""
while True:
# Отслеживание событий клавиатуры и мыши.
self._check_events()
self.ship.update()
self._update_bullets()
self._check_fleet_edges()
self._update_aliens()
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_DOWN:
self.ship.moving_down = True
elif event.key == pygame.K_UP:
self.ship.moving_up = True
elif event.key == pygame.K_q:
sys.exit()
elif event.key == pygame.K_SPACE:
self._fire_bullet()
def _fire_bullet(self):
"""Создание нового снаряда и включение его в группу bullets."""
if len(self.bullets) < self.settings.bullets_allowed:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
def _check_keyup_events(self, event):
"""Реагирует на отпускание клавиш."""
if event.key == pygame.K_DOWN:
self.ship.moving_down = False
elif event.key == pygame.K_UP:
self.ship.moving_up = False
def _update_bullets(self):
"""Обновляет позиции снарядов и уничтожает старые снаряды."""
# Обновление позиций снарядов.
self.bullets.update()
for bullet in self.bullets.copy():
if bullet.rect.right >= self.settings.screen_width:
self.bullets.remove(bullet)
self._check_bullet_alien_collisions()
def _check_bullet_alien_collisions(self):
"""Обработка коллизий снарядов с пришельцами."""
# Удаление снарядов и пришельцев, участвующих в коллизиях.
collisions = pygame.sprite.groupcollide(
self.bullets, self.aliens, True, True)
if not self.aliens:
# Уничтожение существующих снарядов и создание нового флота.
self.bullets.empty()
self._create_fleet()
def _update_aliens(self):
"""Обновляет позиции всех пришельцев во флоте."""
self.aliens.update()
def _create_fleet(self):
"""Создание флота вторжения."""
# Создание пришельца и вычисление количества пришельцев в ряду
# Интервал между соседними пришельцами равен ширине пришельца.
alien = Alien(self)
alien_width, alien_height = alien.rect.size
"""Определяет количество рядов, помещающихся на экране."""
available_space_y = (self.settings.screen_height -
(2 * alien_height))
number_aliens_y = available_space_y // (2 * alien_height)
ship_width = self.ship.rect.width
available_space_x = (self.settings.screen_width - (3 * alien_width) -
ship_width)
number_rows = available_space_x // (2 * alien_width)
# Создание флота вторжения.
for row_number in range(number_rows):
for alien_number in range(number_aliens_y):
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.rect.y = alien.rect.height + 2 * alien.rect.height * alien_number
alien.rect.y = alien.y
alien.x = self.settings.screen_width - 2 * alien_width * row_number
self.aliens.add(alien)
def _change_fleet_direction(self):
"""Опускает весь флот и меняет направление флота."""
for alien in self.aliens.sprites():
alien.rect.x -= self.settings.fleet_drop_speed
self.settings.fleet_direction *= -1
def _check_fleet_edges(self):
"""Реагирует на достижение пришельцем края экрана."""
for alien in self.aliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
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.py
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| 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 = 15
self.bullet_height = 300
self.bullet_color = (60, 60, 60)
self.bullets_allowed = 3
# Настройки пришельцев
self.alien_speed = 0.3
self.fleet_drop_speed = 3
# fleet_direction = 1 обозначает движение вправо; а -1 - влево.
self.fleet_direction = 1 |
|
alien.py
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
"""Класс, представляющий одного пришельца."""
def __init__(self, ai_game):
"""Инициализирует пришельца и задает его начальную позицию."""
super().__init__()
self.screen = ai_game.screen
self.settings = ai_game.settings
# Загрузка изображения пришельца и назначение атрибута rect.
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
# Каждый новый пришелец появляется в левом верхнем углу экрана.
self.rect.x = self.settings.screen_width - self.rect.width
self.rect.y = self.rect.height
# Сохранение точной горизонтальной позиции пришельца.
self.y = float(self.rect.y)
def check_edges(self):
"""Возвращает True, если пришелец находится у края экрана."""
screen_rect = self.screen.get_rect()
if self.rect.bottom >= screen_rect.bottom or self.rect.top <= 0:
return True
def update(self):
"""Перемещает пришельца вправо."""
"""Перемещает пришельца влево или вправо."""
self.y += (self.settings.alien_speed *
self.settings.fleet_direction)
self.rect.y = self.y |
|
ship.py
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| import pygame
class Ship:
"""Класс для управления кораблем."""
def __init__(self, ai_game):
"""Инициализирует корабль и задает его начальную позицию."""
self.screen = ai_game.screen
self.settings = ai_game.settings
self.screen_rect = ai_game.screen.get_rect()
# Загружает изображение корабля и получает прямоугольник.
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
# Каждый новый корабль появляется у нижнего края экрана.
self.rect.midleft = self.screen_rect.midleft
# Сохранение вещественной координаты центра корабля.
self.y = float(self.rect.y)
# Флаг перемещения
self.moving_down = False
self.moving_up = False
def update(self):
"""Обновляет позицию корабля с учетом флага."""
# Обновляется атрибут x, не rect.
if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
self.y += self.settings.ship_speed
if self.moving_up and self.rect.top > 0:
self.y -= self.settings.ship_speed
# Обновление атрибута rect на основании self.x.
self.rect.y = self.y
def blitme(self):
"""Рисует корабль в текущей позиции."""
self.screen.blit(self.image, self.rect) |
|
bullet.py
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| 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.midbottom = ai_game.ship.rect.midbottom
# Позиция снаряда хранится в вещественном формате.
self.x = float(self.rect.x)
def update(self):
"""Перемещает снаряд вверх по экрану."""
# Обновление позиции снаряда в вещественном формате.
self.x += self.settings.bullet_speed
# Обновление позиции прямоугольника.
self.rect.x = self.x
def draw_bullet(self):
"""Вывод снаряда на экран."""
pygame.draw.rect(self.screen, self.color, self.rect) |
|
По заданию из нужно было сделать стреляющий корабль по флоту пришельцев который медленно идет налево двигаясь вверх и вниз. Все работает кроме того что вместо флота выводит только один корабль в правом верхнем углу. Что нужно исправить чтобы флот нормально создавался?
0
|