Clone em Python + Pygame do arcade clássico, começado no curso Build Asteroids using Python and Pygame da Boot.dev e expandido daí em diante.
O curso entrega o esqueleto: loop a 60 FPS, nave, tiros, asteroides que se partem e colisão circular. Este repositório parte desse ponto e vira um jogo que dá para sentar e jogar — com pontuação, vidas, wrap na tela, armas, power-ups e uma tela de instruções antes da partida.
▲
▲ ▲
| No curso | Depois do curso |
|---|---|
| Nave se move com velocidade constante | Aceleração, inércia, arrasto e teto de velocidade |
| Hitbox circular na nave | Hitbox triangular, igual ao desenho |
| Asteroides perfeitamente redondos | Polígonos irregulares (8–13 vértices) |
| Objetos saem da tela e desaparecem | Tudo envolve as bordas (wrap) |
| Um tiro, um jeito de atirar | Pulse, Spread e Rapid |
Uma vida, Game Over na hora |
3 vidas, respawn com invulnerabilidade |
| Fundo preto | Starfield em assets/background.png |
| Sem HUD, sem menu | Tela de instruções, pausa com H, placar e Game Over |
Em cima disso entram explosões em estilhaços, escudo, speed, bombas com pavio e a tela que explica o jogo antes de começar.
Na abertura, leia as instruções e pressione Espaço ou Enter. Durante a partida, H pausa e mostra o mesmo painel.
| Tecla | Ação |
|---|---|
← → |
Girar |
↑ |
Acelerar |
↓ |
Retroceder |
Espaço |
Atirar |
B |
Soltar bomba |
1 2 3 |
Pulse / Spread / Rapid |
C |
Ciclar arma |
H |
Abrir ou fechar instruções |
R |
Jogar de novo depois do Game Over |
Esc |
Sair |
- Pulse — tiro único, cadência padrão
- Spread — três tiros em leque
- Rapid — rajada rápida, projéteis menores
Caem às vezes quando um asteroide explode.
- Escudo (ciano) — enquanto dura, a nave destrói asteroides no contato
- Speed (amarelo) — mais aceleração e velocidade máxima
- Bomba (vermelho) — +1 bomba (começa com 2, máximo 5)
A bomba fica no mapa com pavio e explode em área. Asteroides dentro do raio são vaporizados.
Quanto menor a rocha, mais vale — no estilo do arcade original.
| Asteroide | Pontos |
|---|---|
| Grande | 20 |
| Médio | 50 |
| Pequeno | 100 |
Você tem 3 vidas. Ao ser atingido, a nave volta ao centro por 2,5 s sem colidir (pisca). Com o escudo ativo, o impacto destrói o asteroide em vez de gastar uma vida.
Python 3.13+ e uv (o projeto já tem pyproject.toml e uv.lock).
uv sync
uv run python main.pySe o ambiente virtual já existir:
.venv/bin/python main.pyDependência: pygame==2.6.1.
SDL_VIDEODRIVER=dummy python -m unittest discover -s tests -vCobre wrap na tela, hitbox triangular, pontuação por tamanho, aceleração, armas, power-ups, respawn e a tela de instruções.
asteroids/
├── main.py # loop, HUD, título e Game Over
├── player.py # nave, thrust, armas, vidas, bombas
├── asteroid.py # rochas irregulares + split
├── asteroidfield.py # spawn nas bordas
├── shot.py # projéteis com tempo de vida
├── bomb.py # bomba com pavio
├── powerup.py # escudo, speed, bomba extra
├── explosion.py # estilhaços no estilo arcade
├── circleshape.py # sprite base
├── collision.py # wrap, círculo e triângulo
├── constants.py # números do jogo
├── logger.py # game_state.jsonl / game_events.jsonl
├── assets/background.png
└── tests/
O logger.py veio do fluxo do curso: grava amostras de estado e eventos em JSONL enquanto a partida roda.
- Curso: Build Asteroids using Python and Pygame — Boot.dev, Sarah Schulte
- Arcade original: Asteroids (Atari, 1979)
- Extraído daí: pontuação, vidas, wrap, armas, power-ups, bombas, explosões, hitbox triangular, asteroides irregulares, fundo e tela de instruções