Programador Leigo
Python 13 min leitura 15 MAR 2026

Como criar um jogo simples com Python e Pygame

Crie um jogo completo do zero com Pygame. Janela, sprites, colisão e pontuação em poucas linhas.


Por que Pygame?

Pygame é a forma mais acessível de criar jogos com Python. Você não precisa saber nada de game engines — só Python básico. E o resultado é visual e gratificante, o que torna o aprendizado muito mais divertido.

pip install pygame

Criando uma janela

import pygame

pygame.init()

LARGURA = 800
ALTURA = 600

tela = pygame.display.set_mode((LARGURA, ALTURA))
pygame.display.set_caption("Meu Primeiro Jogo")

rodando = True
while rodando:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False

    tela.fill((0, 0, 0))  # fundo preto
    pygame.display.flip()

pygame.quit()

Execute e uma janela preta de 800x600 vai aparecer. É o seu canvas.


Desenhando formas

import pygame

pygame.init()
tela = pygame.display.set_mode((800, 600))

rodando = True
while rodando:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False

    tela.fill((15, 15, 25))

    # Retangulo (superficie, cor, (x, y, largura, altura))
    pygame.draw.rect(tela, (232, 255, 71), (100, 100, 50, 50))

    # Circulo (superficie, cor, (centro_x, centro_y), raio)
    pygame.draw.circle(tela, (255, 100, 100), (400, 300), 30)

    # Linha (superficie, cor, ponto_inicio, ponto_fim, espessura)
    pygame.draw.line(tela, (100, 200, 255), (0, 0), (800, 600), 2)

    pygame.display.flip()

pygame.quit()

Movendo um personagem

import pygame

pygame.init()
tela = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

# Posicao do jogador
jogador_x = 375
jogador_y = 275
velocidade = 5

rodando = True
while rodando:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False

    # Capturar teclas pressionadas
    teclas = pygame.key.get_pressed()
    if teclas[pygame.K_LEFT]:
        jogador_x -= velocidade
    if teclas[pygame.K_RIGHT]:
        jogador_x += velocidade
    if teclas[pygame.K_UP]:
        jogador_y -= velocidade
    if teclas[pygame.K_DOWN]:
        jogador_y += velocidade

    # Limites da tela
    jogador_x = max(0, min(jogador_x, 750))
    jogador_y = max(0, min(jogador_y, 550))

    tela.fill((15, 15, 25))
    pygame.draw.rect(tela, (232, 255, 71), (jogador_x, jogador_y, 50, 50))
    pygame.display.flip()
    clock.tick(60)  # 60 FPS

pygame.quit()

O clock.tick(60) mantém o jogo a 60 quadros por segundo.


Usando Rect para colisões

O pygame.Rect é a base para posicionamento e detecção de colisão:

import pygame

jogador = pygame.Rect(375, 275, 50, 50)
obstaculo = pygame.Rect(500, 300, 60, 60)

# Verificar colisao
if jogador.colliderect(obstaculo):
    print("Colidiu!")

# Mover
jogador.x += 5
jogador.y -= 3

Exibindo texto na tela

import pygame

pygame.init()
tela = pygame.display.set_mode((800, 600))
fonte = pygame.font.Font(None, 48)

pontos = 0

# Dentro do loop principal:
texto = fonte.render(f"Pontos: {pontos}", True, (255, 255, 255))
tela.blit(texto, (10, 10))

Jogo completo: Coletor

Um quadrado que você controla precisa coletar itens que caem do topo. A cada item coletado, ganha pontos. Se um item chegar ao chão, perde vida.

import pygame
import random

pygame.init()

LARGURA = 800
ALTURA = 600
FPS = 60

tela = pygame.display.set_mode((LARGURA, ALTURA))
pygame.display.set_caption("Coletor Python")
clock = pygame.time.Clock()
fonte = pygame.font.Font(None, 36)
fonte_grande = pygame.font.Font(None, 72)

# Cores
FUNDO = (15, 15, 25)
AMARELO = (232, 255, 71)
VERMELHO = (255, 80, 80)
BRANCO = (255, 255, 255)
CINZA = (100, 100, 100)


def criar_item():
    x = random.randint(0, LARGURA - 30)
    return pygame.Rect(x, -30, 30, 30)


def jogo():
    jogador = pygame.Rect(LARGURA // 2 - 40, ALTURA - 70, 80, 20)
    velocidade = 8

    itens = []
    tempo_spawn = 0
    intervalo_spawn = 45  # frames

    pontos = 0
    vidas = 3
    velocidade_item = 3

    rodando = True
    while rodando:
        for evento in pygame.event.get():
            if evento.type == pygame.QUIT:
                return False

        # Movimento
        teclas = pygame.key.get_pressed()
        if teclas[pygame.K_LEFT] and jogador.left > 0:
            jogador.x -= velocidade
        if teclas[pygame.K_RIGHT] and jogador.right < LARGURA:
            jogador.x += velocidade

        # Spawn de itens
        tempo_spawn += 1
        if tempo_spawn >= intervalo_spawn:
            itens.append(criar_item())
            tempo_spawn = 0

        # Mover itens
        for item in itens[:]:
            item.y += velocidade_item

            if jogador.colliderect(item):
                itens.remove(item)
                pontos += 10
                # Aumentar dificuldade
                if pontos % 50 == 0:
                    velocidade_item += 1
                    intervalo_spawn = max(15, intervalo_spawn - 5)
            elif item.top > ALTURA:
                itens.remove(item)
                vidas -= 1
                if vidas <= 0:
                    return pontos

        # Desenhar
        tela.fill(FUNDO)

        pygame.draw.rect(tela, AMARELO, jogador)

        for item in itens:
            pygame.draw.rect(tela, VERMELHO, item)

        # HUD
        txt_pontos = fonte.render(f"Pontos: {pontos}", True, BRANCO)
        txt_vidas = fonte.render(f"Vidas: {'*' * vidas}", True, VERMELHO)
        tela.blit(txt_pontos, (10, 10))
        tela.blit(txt_vidas, (10, 45))

        pygame.display.flip()
        clock.tick(FPS)

    return pontos


def tela_game_over(pontos):
    tela.fill(FUNDO)

    txt_fim = fonte_grande.render("Game Over", True, VERMELHO)
    txt_pontos = fonte.render(f"Pontuacao final: {pontos}", True, BRANCO)
    txt_reiniciar = fonte.render("Pressione ENTER para jogar novamente", True, CINZA)

    tela.blit(txt_fim, (LARGURA // 2 - txt_fim.get_width() // 2, 200))
    tela.blit(txt_pontos, (LARGURA // 2 - txt_pontos.get_width() // 2, 300))
    tela.blit(txt_reiniciar, (LARGURA // 2 - txt_reiniciar.get_width() // 2, 400))

    pygame.display.flip()

    esperando = True
    while esperando:
        for evento in pygame.event.get():
            if evento.type == pygame.QUIT:
                return False
            if evento.type == pygame.KEYDOWN:
                if evento.key == pygame.K_RETURN:
                    return True
                if evento.key == pygame.K_ESCAPE:
                    return False
    return False


# Loop principal
jogando = True
while jogando:
    resultado = jogo()
    if resultado is False:
        break
    jogando = tela_game_over(resultado)

pygame.quit()

O que aprendemos nesse jogo

Conceito Onde usamos
Game loop while rodando com eventos, update e draw
Input pygame.key.get_pressed()
Colisão jogador.colliderect(item)
Spawn aleatório random.randint() para posição X
Dificuldade progressiva Velocidade e spawn aumentam com pontos
Telas Função separada para game over
FPS constante clock.tick(60)

Próximos passos

Ideias para melhorar o jogo:

  • Adicionar imagens em vez de retângulos (pygame.image.load())
  • Sons ao coletar itens (pygame.mixer)
  • Power-ups que dão vida extra
  • Ranking de pontuações salvo em arquivo
  • Diferentes tipos de itens (bons e ruins)

Resumo

Função Para que serve
pygame.init() Inicializar o Pygame
pygame.display.set_mode() Criar janela
pygame.draw.rect() Desenhar retângulo
pygame.key.get_pressed() Capturar teclas
Rect.colliderect() Detectar colisão
pygame.font.Font() Criar fonte para texto
clock.tick(fps) Controlar FPS

Pygame é a porta de entrada perfeita para game dev com Python. O jogo que criamos aqui tem menos de 120 linhas e já tem movimento, colisão, pontuação e game over. Imagine o que você pode fazer com mais prática.

Continue lendo

Compartilhar