pygame: concluindo nosso Snake Game
- #Python
Olá, seja muito bem vindo(a), no artigo anterior desenvolvemos melhor a movimentação da cobra no jogo: https://programacao-descomplicada.blogspot.com/2022/11/pygame-melhorando-movimentacao-da-nossa.html, hoje nós vamos resolver o game over, sendo que quando a cobra encostar em si mesma o usuário perde o jogo.
Reparem que quando a cobra encosta nela mesma o que ocorre é que ela está ocupando a mesma posição duas vezes, sendo que ela já tinha ocupado a posição antes e ela se encontra guardada na nossa lista de posições da cobra.
A lógica é simples, se a cabeça da cobra já estiver na listaCobra ela irá morrer e o jogo recomeça. Para isso primeiro, dentro do nosso laço while, abaixo de tamanho_cobra(lista_cobra), vamos criar uma condicional para verificar se existe alguma outra lista_cabeca que seja idêntica a atual que estamos passando.
if lista_cobra.count(lista_posicaoCabeca) > 1:
Saindo do nosso while, vamos criar uma variável chamada cobraMorta passando False. Voltando para a nossa condicional anterior, colocaremos True na variável cobraMorta quando ela entrar na condicional, e criamos um laço while que irá rodar enquanto essa variável for True:
if lista_cobra.count(lista_posicaoCabeca) > 1:
cobraMorta = True
while cobraMorta:
Agora, dentro desse while vamos colocar o nosso evento que encerra o jogo e outro que chama uma função que ainda iremos construir para quando o usuário morrer e quiser reiniciar o game, ele clica na tecla x e volta do início ao jogo.
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit()
if event.type == KEYDOWN:
if event.key == K_x:
gamePlay()
Abaixo da função tamanho_cobra, fora do while, vamos criar a função gamePlay(), no qual vamos reiniciar variáveis passadas ao longo das nossas aulas. Primeiro vamos zerar a pontuação, em seguida deixaremos o comprimento da cobra em 5 como estava no começo, faremos a cobra voltar para o começo da tela nas sua posição inicial de jogo. Vamos redefinir a lista_cobra e lista_posicaoCabeca para que elas voltem a ficar vazias.
A posição da nossa maçã será sorteada novamente e a nossa variável cobraMorta volta a ser False:
def gamePlay():
pontos = 0
tamanho_inicial_cobra = 5
XCobra = largura / 2
YCobra = altura / 2
lista_cobra = []
lista_posicaoCabeca = []
XMaca = randint(40, 600)
YMaca = randint(50, 430)
cobraMorta = False
Se você rodar o programa vai reparar que o jogo irá travar quando a cobra morrer, isso porque ainda precisamos declarar nossas variáveis dentro da função gamePlay como sendo globais, para isso basta colocar a seguinte linha de código dentro da nossa função:
global pontos, tamanho_inicial_cobra, XCobra, YCobra, lista_cobra, lista_posicaoCabeca, YMaca, XMaca, cobraMorta
Agora, vamos organizar nossa tela de game over, primeiro vamos voltar para a condicional responsável pela morte da nossa cobra, dentro do while vamos pintar a nossa tela inteira colocando tela.fill((192,192,192)) e no final do while, abaixo do for, colocamos pygame.display.update().
Acima desse while, vamos organizar uma mensagem de game over para colocar na nossa tela final:
mensagem = "Game Over! Pressione x para começar a jogar novamente"
texto_formatado = fonte.render(mensagem, True, (255, 255, 255))
Em um dos artigos anteriores falamos sobre texto na tela do jogo: link do artigo 5. Por fim, colocamos tela.blit(texto_formatado, (largura//2, altura//2)) abaixo de pygame.display.update() dentro do while.
Ainda precisamos resolver uma coisa, nosso texto não ficou no meio da tela. Para resolver isso, abaixo da nossa variável texto_formatado vamos colocar ret_texto = texto_formatado.get_rect().
Em cima de tela.blit() vamos passar o centro do nosso texto recebendo o meio da tela dessa forma: ret_texto.center = (largura//2, altura//2). Por fim, em tela.blit() passamos a variável ret_texto como parâmetro:
tela.blit(texto_formatado, ret_texto)
Para concluir nosso projeto vamos colocar abaixo da nossa condicional de game over as seguintes condicionais que vão cuidar de trazer a cobra de volta para a tela para que ela não ultrapasse a largura e a altura da mesma.
if XCobra > largura:
XCobra = 0
if XCobra < 0:
XCobra = largura
if YCobra > altura:
YCobra = 0
if YCobra < 0:
YCobra = altura
Espero que vocês tenham gostado da construção do nosso joguinho, aprendemos muito durante o processo de elaboração dele, seria interessante estudar um pouco mais profundamente essa biblioteca do python futuramente, deixo um abraço para você e até o próximo artigo.
Artigo Original: https://programacao-descomplicada.blogspot.com/2022/11/pygame-concluindo-nosso-snake-game.html