/
game_loop.py
94 lines (70 loc) · 3.02 KB
/
game_loop.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
from snake import Snake
from mapa import Mapa
from settings import COR_BACKGROUND, COR_LINHA, COR_TEXTO
from settings import DISTANCIA_TEXTO, GROSSURA, TAMANHO_TITULO
from settings import MAPA_TAMANHO, MAPA_INTERVALO, FPS
from settings import fonteTitulo, fonteScore
from settings import X, Y
import pygame
def game_loop():
""" Main do jogo """
# Ler mapa guardado :
with open("mapa.txt") as ficheiro:
tamanho = eval(ficheiro.readline())
paredes = eval(ficheiro.readline())
# Inicialização do mapa
pos_inicial = [tamanho[X] // 2, tamanho[Y] // 2]
cobra = Snake([pos_inicial, [pos_inicial[X], pos_inicial[Y] - 1]])
mapa = Mapa(tamanho[X], tamanho[Y], cobra, paredes, False)
# Calculo das posições / tamanho do mapa em relação ao tamanho
# da janela e calculo do tamanho necessario para a janela
tamanho_mapa = ((mapa.tamanho[X] * MAPA_TAMANHO) + ((mapa.tamanho[X] - 1) * MAPA_INTERVALO), \
(mapa.tamanho[Y] * MAPA_TAMANHO) + ((mapa.tamanho[Y] - 1) * MAPA_INTERVALO))
pos_mapa = (MAPA_TAMANHO, 120)
tamanho = (tamanho_mapa[X] + 2 * pos_mapa[X], tamanho_mapa[Y] + pos_mapa[X] + pos_mapa[Y])
# Ecrã
ecra = pygame.display.set_mode(tamanho)
# Header
titulo = "The Snake"
the_snake = fonteTitulo.render(titulo, True, COR_TEXTO)
text_width, text_height = fonteTitulo.size(titulo) # Dimenções do retangulo que involve o texto
# Centrar o texto em relação a posição do mapa
pos_texto = (tamanho[X] // 2 - text_width // 2, 10)
# Linha por baixo do titulo
pos_retangulo = (pos_mapa[X], pos_texto[Y] + text_height + DISTANCIA_TEXTO)
retangulo = pygame.Rect(pos_retangulo[X], pos_retangulo[Y] , tamanho_mapa[X], GROSSURA)
# Score :
score = "Score :"
pos_score = (pos_retangulo[X], pos_retangulo[Y] + GROSSURA + 5)
score_width, score_height = fonteScore.size(score)
pos_pontos = (pos_score[X] + score_width + 10, pos_score[Y])
# FPS
clock = pygame.time.Clock()
# Game loop :
a_correr = True
while a_correr:
clock.tick(FPS)
ecra.fill(COR_BACKGROUND)
# Titulo
ecra.blit(the_snake, pos_texto)
pygame.draw.rect(ecra, COR_LINHA, retangulo)
# Score
score_texto = fonteScore.render(score, True, (140, 142, 143))
pontos_texto = fonteScore.render(str(cobra.score), True, COR_TEXTO)
ecra.blit(score_texto, pos_score)
ecra.blit(pontos_texto, pos_pontos)
tecla = None
# Receber eventos
for evento in pygame.event.get():
if evento.type == pygame.QUIT:
quit()
# Uma tecla foi primida
elif evento.type == pygame.KEYDOWN:
# Funcionalidade para cada tecla
tecla = chr(evento.key)
# Update da cobra
a_correr = cobra.update(mapa, tecla)
# Dar display do mapa
mapa.display(pos_mapa, ecra, cobra)
# Dar update do ecrã
pygame.display.update()