-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame_functions.py
More file actions
243 lines (196 loc) · 9.02 KB
/
Copy pathgame_functions.py
File metadata and controls
243 lines (196 loc) · 9.02 KB
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
import pygame
from time import sleep
from bullet import Bullet
from alien import Alien
def ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets):
"""Responde ao fato de a espaçonave ter sido atingida por um alienigena"""
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 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 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 get_number_aliens_x(ai_settings,alien_width):
"""Determina o número de aliens 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 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 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)
for row_number in range(number_rows):
# Cria a primeira linha de alienígenas
for alien_number in range(number_aliens_x):
create_alien(ai_settings,screen,aliens,alien_number,row_number)
def check_keydown_events(event,ai_settings,screen,stats,ship,aliens,bullets):
"""Responde aos 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_q:
sys.exit()
elif event.key == pygame.K_p:
start_game(ai_settings,screen,stats,ship,aliens,bullets)
def check_keyup_events(event,ship):
"""Responde as 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,stats,sb,play_button,screen,ship,aliens,bullets):
"""Responde a eventos de pressioamento de teclas e de mouse"""
# Observa eventos de teclado e de mouse
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,stats,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)
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 os dados estatísticos do jogo
stats.reset_stats()
stats.game_active = True
# Reinicia as imagens do painel de pontuação
sb.prep_score()
sb.prep_high_score()
sb.prep_level()
sb.prep_ships()
# Oculta o cursos do mouse
pygame.mouse.set_visible(False)
# Esvazia a lista de alienígenas e de projéteis
aliens.empty()
bullets.empty()
# Reinicia as configurações do jogo
ai_settings.initialize_dynamic_settings()
# Cria uma nova frota e centraliza a espaçonave
create_fleet(ai_settings,screen,ship,aliens)
ship.center_ship()
def update_screen(ai_settings, stats, screen, sb, ship, aliens, bullets, play_button):
"""Desenha todos os componentes na tela"""
# Redesenha a tela
screen.fill(ai_settings.bg_color)
# Desenha o botão play se o jogo estiver inativo
if not stats.game_active:
play_button.draw_button()
else:
# Redesenha a espaçonave
ship.blitme()
# Redesenha o alienígena
aliens.draw(screen)
# Redesenha todos os projéteis
for bullet in bullets.sprites():
bullet.draw_bullet()
# Desenha a informação sobre pontuação
sb.show_score()
# Deixa a tela mais recente visível
pygame.display.flip()
def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):
"""Desenha todos os projéteis na tela"""
# Atualiza a posição dos projéteis
bullets.update()
# Remove projéteis que já saíram da tela
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
# Verifica se algum projétil atingiu os alienígenas
# Em caso afirmativo, livra-se do projétil e do alienígena
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 aliens"""
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:
# Destrói os projéteis existentes, aumenta a velocidade
# do jogo, cria uma nova frota e aumenta o nivel de dificuldade
bullets.empty()
ai_settings.increase_speed()
create_fleet(ai_settings,screen,ship,aliens)
# Aumenta o nível
stats.level += 1
sb.prep_level()
def update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets):
"""Atualiza a posição de todos os alienígenas da frota"""
check_fleet_edges(ai_settings,aliens)
aliens.update()
# Verifica se há algum alienígena que atingiu a parte inferior da tela
check_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets)
# Verifica se houveram colisões entre alienígenas e a espaçonave
if pygame.sprite.spritecollideany(ship,aliens):
ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets)
def fire_bullet(ai_settings,screen,ship,bullets):
"""Dispara um projétil se o limite máximo não foi atingido"""
# 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 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 check_aliens_bottom(ai_settings,stats,screen,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 a
# espaçonave é atingida
ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets)
break
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()