Criando um Jogo de Tiro com Arco no Python: Arqueiro vs Balões

 Bem-vindo(a) ao post no blog. 


Se você já domina o básico do Python, o próximo passo emocionante é aprender a lidar com multimídia: imagens, sons e colisões em tempo real. Hoje, na Academy Code Christ, vamos construir um jogo de ação completo onde você controla um arqueiro que deve proteger o céu!

🌟 O que aprenderemos hoje?

  • Gerenciamento de Assets: Como carregar imagens e sons externos.

  • Sistema de Som: Usar o mixer do Pygame para disparos e colisões.

  • Lógica de Listas: Controlar múltiplas flechas e inimigos simultaneamente.

  • Colisões Dinâmicas: Detectar o exato momento em que a flecha atinge o alvo.


🛠️ Preparação dos Arquivos

Para este jogo rodar, você precisará dos seguintes arquivos na mesma pasta do seu código:

  1. Imagens: céu.jpg, arqueiro.png, flecha.png e balão2.png.

  2. Sons: Crie uma pasta chamada sond e coloque disparo.wav, colisao com jogador.wav, etc.

💻 O Código Completo do Jogo

Aqui está a estrutura profissional para o seu jogo:

import pygame

import random


# Inicializando o pygame

pygame.init()


# Configurações da tela

tamanho_tela = (800, 600)

tela = pygame.display.set_mode(tamanho_tela)

pygame.display.set_caption("Space Shooter")


# Cores

BRANCO = (255, 255, 255)

PRETO = (0, 0, 0)

VERMELHO = (255, 0, 0)


# Carregar a imagem de fundo

fundo = pygame.image.load("céu.jpg")  # Coloque o caminho da sua imagem de fundo

fundo = pygame.transform.scale(fundo, (800, 600))  # Ajuste para o tamanho da tela (800x600)


# Carregar sons

pygame.mixer.init()  # Inicializa o mixer de som

som_disparo = pygame.mixer.Sound("sond/disparo.wav")  # Som do disparo

som_colisao_inimigo = pygame.mixer.Sound("sond/flecha colidindo com o balão.mp3")  # Som da colisão com o balão

som_colisao_jogador = pygame.mixer.Sound("sond/colisao com jogador.wav")  # Som da colisão com o jogador


# Classe da nave do jogador

class Nave:

    def __init__(self):

        self.imagem = pygame.image.load("arqueiro.png")  # Coloque o caminho da sua imagem do arquiro

        self.rect = self.imagem.get_rect()

        self.rect.center = (400, 550)  # Inicia no centro inferior da tela

        self.velocidade = 30  # Velocidade de movimento da flecha


    def mover(self, esquerda, direita, cima, baixo):

        if esquerda and self.rect.left > 0:

            self.rect.x -= self.velocidade

        if direita and self.rect.right < 800:

            self.rect.x += self.velocidade

        if cima and self.rect.top > 0:

            self.rect.y -= self.velocidade

        if baixo and self.rect.bottom < 600:

            self.rect.y += self.velocidade


    def desenhar(self):

        tela.blit(self.imagem, self.rect)


# Classe da flecha (no lugar do flecha)

class Flecha:

    def __init__(self, x, y):

        self.imagem = pygame.image.load("flecha.png")  # Coloque o caminho da imagem da flecha

        self.imagem = pygame.transform.scale(self.imagem, (30, 100))  # Ajuste o tamanho da flecha

        self.rect = self.imagem.get_rect()

        self.rect.center = (x, y)

        self.velocidade = 7


    def mover(self):

        self.rect.y -= self.velocidade  # A flecha vai para cima (ajuste para movimento desejado)


    def desenhar(self):

        tela.blit(self.imagem, self.rect)


# Classe do inimigo

class Inimigo:

    def __init__(self):

        self.imagem = pygame.image.load("balão2.png")  # Coloque o caminho da imagem do Balão

        self.rect = self.imagem.get_rect()

        self.rect.center = (random.randint(50, 750), random.randint(-100, -50))  # Posiçã o aleatória no topo

        self.velocidade = 2


    def mover(self):

        self.rect.y += self.velocidade


    def desenhar(self):

        tela.blit(self.imagem, self.rect)


# Função principal do jogo

def jogo():

    # Criando objetos

    jogador = Nave()

    flechas = []  # Agora temos uma lista de flechas, ao invés de mísseis

    inimigos = [Inimigo() for _ in range(5)]

    

    # Variáveis de controle

    clock = pygame.time.Clock()

    pontos = 0

    vidas = 3

    fim_jogo = False


    # Loop principal do jogo

    while not fim_jogo:

        tela.fill(PRETO)


        # Desenhar o fundo

        tela.blit(fundo, (0, 0))  # Coloca a imagem de fundo na tela


        # Movimentos do jogador

        esquerda = direita = cima = baixo = False

        for evento in pygame.event.get():

            if evento.type == pygame.QUIT:

                fim_jogo = True

            if evento.type == pygame.KEYDOWN:

                if evento.key == pygame.K_LEFT:

                    esquerda = True

                if evento.key == pygame.K_RIGHT:

                    direita = True

                if evento.key == pygame.K_UP:

                    cima = True

                if evento.key == pygame.K_DOWN:

                    baixo = True

                if evento.key == pygame.K_SPACE:

                    # Disparar a flecha

                    flechas.append(Flecha(jogador.rect.centerx, jogador.rect.top))

                    som_disparo.play()  # Toca o som do disparo


        # Mover o arqueiro

        jogador.mover(esquerda, direita, cima, baixo)


        # Mover flechas

        for flecha in flechas:

            flecha.mover()

            if flecha.rect.bottom < 0:

                flechas.remove(flecha)


        # Mover inimigos

        for inimigo in inimigos:

            inimigo.mover()

            if inimigo.rect.top > 600:

                inimigos.remove(inimigo)

                inimigos.append(Inimigo())


            # Verificar colisão com as flechas

            for flecha in flechas:

                if flecha.rect.colliderect(inimigo.rect):

                    flechas.remove(flecha)

                    inimigos.remove(inimigo)

                    inimigos.append(Inimigo())

                    pontos += 10

                    som_colisao_inimigo.play()  # Toca o som da colisão com inimigo


            # Verificar colisão com o jogador

            if jogador.rect.colliderect(inimigo.rect):

                vidas -= 1

                inimigos.remove(inimigo)

                inimigos.append(Inimigo())

                som_colisao_jogador.play()  # Toca o som da colisão com o jogador

                if vidas <= 0:

                    fim_jogo = True


        # Desenhar tudo

        jogador.desenhar()

        for flecha in flechas:

            flecha.desenhar()

        for inimigo in inimigos:

            inimigo.desenhar()


        # Exibir informações

        fonte = pygame.font.SysFont("arial", 30)

        texto_pontos = fonte.render(f"Pontos: {pontos}", True, BRANCO)

        tela.blit(texto_pontos, (10, 10))


        texto_vidas = fonte.render(f"Vidas: {vidas}", True, BRANCO)

        tela.blit(texto_vidas, (700, 10))


        # Atualizar a tela

        pygame.display.flip()

        clock.tick(60)  # 60 FPS


    pygame.quit()


# Iniciar o jogo

jogo()


🔍 Mergulhando na Lógica

1. A Orquestra de Sons 🎵

Diferente de programas comuns, um jogo precisa de feedback auditivo. Usamos o pygame.mixer.Sound para carregar o áudio na memória e o .play() para executá-lo no exato momento da ação. Isso cria imersão!

2. Movimentação Livre

Neste código, permitimos que o arqueiro se mova nas quatro direções (cima, baixo, esquerda, direita). Observe como usamos os limites da tela (800x600) para impedir que o herói saia do cenário.

3. Gestão de Memória (Listas)

Note que usamos uma lista para as flechas. Por que? Porque o jogador pode atirar várias vezes seguidas. Quando uma flecha sai da tela ou atinge um inimigo, nós a removemos da lista para não sobrecarregar o computador.

✝️ Reflexão: Precisão e Foco

Na programação, um erro de um único pixel pode fazer a flecha errar o alvo. Na nossa caminhada, a precisão também é importante. Assim como o arqueiro precisa de foco para acertar o balão, precisamos manter nossos olhos no que é correto e justo.

"Os teus olhos olhem direitinho, e as tuas pálpebras mirem defronte de ti." (Provérbios 4:25)

🏆 Desafio do Arqueiro

Conseguiu rodar? Agora tente personalizar:

  1. Níveis de Dificuldade: Aumente a velocidade dos inimigos conforme os pontos sobem.

  2. Poderes: Crie uma flecha especial que seja maior ou mais rápida.

  3. Várias Vidas: Adicione uma imagem de coração para representar as vidas restantes na tela.


 


Esse conteúdo faz parte do projeto Academy Code Christ, criado para ajudar iniciantes a aprender programação de forma gratuita e direta.

Se esse conteúdo te ajudou, você pode me pagar um café ☕

Pix: antropologiacrista@gmail.com  


Comentários

Postagens mais visitadas