-
Notifications
You must be signed in to change notification settings - Fork 0
/
game_functions.py
242 lines (200 loc) · 9.06 KB
/
game_functions.py
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
import sys
from time import sleep
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event, ai_settings, screen, stats, sb, ship, aliens,
bullets):
'''Responde a pressionamentos de tecla'''
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
fire_bullet(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_p:
if not stats.game_active:
start_game(ai_settings, screen, stats, sb, ship, aliens, bullets)
elif event.key == pygame.K_q:
exit_game(stats)
def check_keyup_events(event, ship):
'''Responde a solturas de tecla'''
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ai_settings, screen, stats, sb, play_button, ship, aliens,
bullets):
'''Responde a eventos de pressionamento de teclas e mouse'''
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, stats, sb, ship,
aliens, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(ai_settings, screen, stats, sb, play_button, ship,
aliens, bullets, mouse_x, mouse_y)
elif event.type == pygame.QUIT:
exit_game(stats)
def check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens,
bullets, mouse_x, mouse_y):
'''Inicia um novo jogo quando o jogador clicar em Play.'''
button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
if button_clicked and not stats.game_active:
start_game(ai_settings, screen, stats, sb, ship, aliens, bullets)
def start_game(ai_settings, screen, stats, sb, ship, aliens, bullets):
# Reinicia as configurações do jogo
ai_settings.initialize_dynamic_settings()
# Oculta o cursor do mouse
pygame.mouse.set_visible(False)
# Reinicia os dados estatísticos do jogo
stats.reset_stats()
stats.game_active = True
# Reinicia as imagens do painel de pontuação
sb.prep_images()
# Esvazia a lista de alienígenas e de projéteis
aliens.empty()
bullets.empty()
# Cria uma nova frota e centraliza a espaçonave
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,
play_button):
'''Atualiza as imagens na tela e alterna para a nova tela'''
# Redesenha a tela a cada passagem pelo laço
screen.fill(ai_settings.bg_color)
# Redesenha todos os projéteis atrás da espaçonave e dos alienígenas
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)
# Desenha a informação sobre pontuação
sb.show_score()
# Desenha o botão Play se o jogo estiver inativo
if not stats.game_active:
play_button.draw_button()
# Deixa a tela mais recente visível
pygame.display.flip()
def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):
'''Atualiza a posição dos projéteis e se livra dos projéteis antigos.'''
# Atualiza as posições dos projéteis
bullets.update()
# Livra-se dos projéteis que desapareceram
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens,
bullets)
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens,
bullets):
'''Responde a colisões entre projéteis e alienígenas.'''
# Remove qualquer projétil e alienígena que tenham colidido
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
if collisions:
for aliens in collisions.values():
stats.score += ai_settings.alien_points * len(aliens)
sb.prep_score()
check_high_score(stats, sb)
if len(aliens) == 0:
# Se a frota toda for destruída, inicia um novo nível
bullets.empty()
ai_settings.increase_speed()
# Aumenta o nível
stats.level += 1
sb.prep_level()
create_fleet(ai_settings, screen, ship, aliens)
def fire_bullet(ai_settings, screen, ship, bullets):
'''Dispara um projétil se o limite ainda não foi alcançado.'''
# Cria um novo projétil e o adiciona ao grupo de projéteis
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def get_number_aliens_x(ai_settings, alien_width):
'''Determina o número de alienígenas que cabem em uma linha.'''
available_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
return number_aliens_x
def get_number_rows(ai_settings, ship_height, alien_height):
'''Determina o número de linhas com alienígenas que cabem na tela.'''
available_space_y = (ai_settings.screen_height -
(3 * alien_height) - ship_height)
number_rows = int(available_space_y / (2 * alien_height))
return number_rows
def create_alien(ai_settings, screen, aliens, alien_number, row_number):
# Cria um alienígena e o posiciona na linha
alien = Alien(ai_settings, screen)
alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
aliens.add(alien)
def create_fleet(ai_settings, screen, ship, aliens):
'''Cria uma frota completa de alienígenas.'''
# Cria um alienígena e calcula o número de alienígenas em uma linha
# O espaçamento entre os alienígenas é igual à largura de um alienígena
alien = Alien(ai_settings, screen)
number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height)
# Cria a frota de alienígenas
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
create_alien(ai_settings, screen, aliens, alien_number, row_number)
def check_fleet_edges(ai_settings, aliens):
'''Responde apropriadamente se algum alienígena alcançou uma borda.'''
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_direction(ai_settings, aliens)
break
def change_fleet_direction(ai_settings, aliens):
'''Faz toda a frota descer e muda a sua direção.'''
for alien in aliens.sprites():
alien.rect.y += ai_settings.fleet_drop_speed
ai_settings.fleet_direction *= -1
def ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets):
'''Responde ao fato de a espaçonave ter sido atingida por um alienígena.'''
if stats.ships_left > 0:
# Decrementa ships_left
stats.ships_left -= 1
# Atualiza o painel de pontuações
sb.prep_ships()
# Esvazia a lista de alienígenas e de projéteis
aliens.empty()
bullets.empty()
# Cria uma nova frota e centraliza a espaçonave
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
# Faz uma pausa
sleep(0.5)
else:
stats.game_active = False
pygame.mouse.set_visible(True)
def check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets):
'''Verifica se algum alienígena alcançou a parte inferior da tela.'''
screen_rect = screen.get_rect()
for alien in aliens.sprites():
if alien.rect.bottom >= screen_rect.bottom:
# Trata esse caso do mesmo modo que é feito quando uma espaçonave
# é atingida
ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)
break
def update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets):
'''Verifica se a frota está em uma das bordas e então
atualiza as posições de todos os alienígenas da frota.'''
check_fleet_edges(ai_settings, aliens)
aliens.update()
# Verifica se houve colisões entre alienígenas e a espaçonave
if pygame.sprite.spritecollideany(ship, aliens):
ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)
# Verifica se há algum alienígena que atingiu a parte inferior da tela
check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets)
def check_high_score(stats, sb):
'''Verifica se há uma nova pontuação máxima.'''
if stats.score > stats.high_score:
stats.high_score = stats.score
sb.prep_high_score()
def exit_game(stats):
'''Encerra o jogo'''
stats.write_high_score()
sys.exit()