DEV Community

Aqua Asael Pelegon Semjasa
Aqua Asael Pelegon Semjasa

Posted on

A python game

Image description
import pygame
import os
import random

TELA_LARGURA = 500
TELA_ALTURA = 800

IMAGEM_CANO = pygame.transform.scale2x(pygame.image.load(os.path.join('imgs', 'pipe.png')))
IMAGEM_CHAO = pygame.transform.scale2x(pygame.image.load(os.path.join('imgs', 'base.png')))
IMAGEM_BACKGROUND = pygame.transform.scale2x(pygame.image.load(os.path.join('imgs', 'bg.png')))
IMAGENS_PASSARO = [
pygame.transform.scale2x(pygame.image.load(os.path.join('imgs', 'bird1.png'))),
pygame.transform.scale2x(pygame.image.load(os.path.join('imgs', 'bird2.png'))),
pygame.transform.scale2x(pygame.image.load(os.path.join('imgs', 'bird3.png'))),
]

pygame.font.init()
FONTE_PONTOS = pygame.font.SysFont('arial', 50)

class Passaro:
IMGS = IMAGENS_PASSARO
# animações da rotação
ROTACAO_MAXIMA = 25
VELOCIDADE_ROTACAO = 20
TEMPO_ANIMACAO = 5

def __init__(self, x, y):
    self.x = x
    self.y = y
    self.angulo = 0
    self.velocidade = 0
    self.altura = self.y
    self.tempo = 0
    self.contagem_imagem = 0
    self.imagem = self.IMGS[0]

def pular(self):
    self.velocidade = -10.5
    self.tempo = 0
    self.altura = self.y

def mover(self):
    # calcular o deslocamento
    self.tempo += 1
    deslocamento = 1.5 * (self.tempo**2) + self.velocidade * self.tempo

    # restringir o deslocamento
    if deslocamento > 16:
        deslocamento = 16
    elif deslocamento < 0:
        deslocamento -= 2

    self.y += deslocamento

    # o angulo do passaro
    if deslocamento < 0 or self.y < (self.altura + 50):
        if self.angulo < self.ROTACAO_MAXIMA:
            self.angulo = self.ROTACAO_MAXIMA
    else:
        if self.angulo > -90:
            self.angulo -= self.VELOCIDADE_ROTACAO

def desenhar(self, tela):
    # definir qual imagem do passaro vai usar
    self.contagem_imagem += 1

    if self.contagem_imagem < self.TEMPO_ANIMACAO:
        self.imagem = self.IMGS[0]
    elif self.contagem_imagem < self.TEMPO_ANIMACAO*2:
        self.imagem = self.IMGS[1]
    elif self.contagem_imagem < self.TEMPO_ANIMACAO*3:
        self.imagem = self.IMGS[2]
    elif self.contagem_imagem < self.TEMPO_ANIMACAO*4:
        self.imagem = self.IMGS[1]
    elif self.contagem_imagem >= self.TEMPO_ANIMACAO*4 + 1:
        self.imagem = self.IMGS[0]
        self.contagem_imagem = 0


    # se o passaro tiver caindo eu não vou bater asa
    if self.angulo <= -80:
        self.imagem = self.IMGS[1]
        self.contagem_imagem = self.TEMPO_ANIMACAO*2

    # desenhar a imagem
    imagem_rotacionada = pygame.transform.rotate(self.imagem, self.angulo)
    pos_centro_imagem = self.imagem.get_rect(topleft=(self.x, self.y)).center
    retangulo = imagem_rotacionada.get_rect(center=pos_centro_imagem)
    tela.blit(imagem_rotacionada, retangulo.topleft)

def get_mask(self):
    return pygame.mask.from_surface(self.imagem)
Enter fullscreen mode Exit fullscreen mode

class Cano:
DISTANCIA = 200
VELOCIDADE = 5

def __init__(self, x):
    self.x = x
    self.altura = 0
    self.pos_topo = 0
    self.pos_base = 0
    self.CANO_TOPO = pygame.transform.flip(IMAGEM_CANO, False, True)
    self.CANO_BASE = IMAGEM_CANO
    self.passou = False
    self.definir_altura()

def definir_altura(self):
    self.altura = random.randrange(50, 450)
    self.pos_topo = self.altura - self.CANO_TOPO.get_height()
    self.pos_base = self.altura + self.DISTANCIA

def mover(self):
    self.x -= self.VELOCIDADE

def desenhar(self, tela):
    tela.blit(self.CANO_TOPO, (self.x, self.pos_topo))
    tela.blit(self.CANO_BASE, (self.x, self.pos_base))

def colidir(self, passaro):
    passaro_mask = passaro.get_mask()
    topo_mask = pygame.mask.from_surface(self.CANO_TOPO)
    base_mask = pygame.mask.from_surface(self.CANO_BASE)

    distancia_topo = (self.x - passaro.x, self.pos_topo - round(passaro.y))
    distancia_base = (self.x - passaro.x, self.pos_base - round(passaro.y))

    topo_ponto = passaro_mask.overlap(topo_mask, distancia_topo)
    base_ponto = passaro_mask.overlap(base_mask, distancia_base)

    if base_ponto or topo_ponto:
        return True
    else:
        return False
Enter fullscreen mode Exit fullscreen mode

class Chao:
VELOCIDADE = 5
LARGURA = IMAGEM_CHAO.get_width()
IMAGEM = IMAGEM_CHAO

def __init__(self, y):
    self.y = y
    self.x1 = 0
    self.x2 = self.LARGURA

def mover(self):
    self.x1 -= self.VELOCIDADE
    self.x2 -= self.VELOCIDADE

    if self.x1 + self.LARGURA < 0:
        self.x1 = self.x2 + self.LARGURA
    if self.x2 + self.LARGURA < 0:
        self.x2 = self.x1 + self.LARGURA

def desenhar(self, tela):
    tela.blit(self.IMAGEM, (self.x1, self.y))
    tela.blit(self.IMAGEM, (self.x2, self.y))
Enter fullscreen mode Exit fullscreen mode

def desenhar_tela(tela, passaros, canos, chao, pontos):
tela.blit(IMAGEM_BACKGROUND, (0, 0))
for passaro in passaros:
passaro.desenhar(tela)
for cano in canos:
cano.desenhar(tela)

texto = FONTE_PONTOS.render(f"Pontuação: {pontos}", 1, (255, 255, 255))
tela.blit(texto, (TELA_LARGURA - 10 - texto.get_width(), 10))
chao.desenhar(tela)
pygame.display.update()
Enter fullscreen mode Exit fullscreen mode

def main():
passaros = [Passaro(230, 350)]
chao = Chao(730)
canos = [Cano(700)]
tela = pygame.display.set_mode((TELA_LARGURA, TELA_ALTURA))
pontos = 0
relogio = pygame.time.Clock()

rodando = True
while rodando:
    relogio.tick(30)

    # interação com o usuário
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False
            pygame.quit()
            quit()
        if evento.type == pygame.KEYDOWN:
            if evento.key == pygame.K_SPACE:
                for passaro in passaros:
                    passaro.pular()

    # mover as coisas
    for passaro in passaros:
        passaro.mover()
    chao.mover()

    adicionar_cano = False
    remover_canos = []
    for cano in canos:
        for i, passaro in enumerate(passaros):
            if cano.colidir(passaro):
                passaros.pop(i)
            if not cano.passou and passaro.x > cano.x:
                cano.passou = True
                adicionar_cano = True
        cano.mover()
        if cano.x + cano.CANO_TOPO.get_width() < 0:
            remover_canos.append(cano)

    if adicionar_cano:
        pontos += 1
        canos.append(Cano(600))
    for cano in remover_canos:
        canos.remove(cano)

    for i, passaro in enumerate(passaros):
        if (passaro.y + passaro.imagem.get_height()) > chao.y or passaro.y < 0:
            passaros.pop(i)

    desenhar_tela(tela, passaros, canos, chao, pontos)
Enter fullscreen mode Exit fullscreen mode

if name == 'main':
main()

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (1)

Collapse
 
aquael5 profile image
Aqua Asael Pelegon Semjasa • Edited

A good code of a game in python, but for some reason, the code breaks in a certain part, I've tested it in a python IDE, like Replit, but it's still broken. I'll sort this out later.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay