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.