A Galaga-style arcade shoot-'em-up written in Python with pygame, featuring the classic tractor-beam capture mechanic and a Tokyo Night color palette.
- 100 stages: wave-based enemy formations (drones, bees, boss) with swooping attack patterns, escalating difficulty
- Boss tractor-beam capture/rescue mechanic — free your captured ship to unlock dual-fighter mode
- A solo boss fight every 10 stages, bigger/faster/uglier each time, culminating in a multi-hit final boss (stage 100) that summons reinforcements and ends in a proper death sequence — screen flash, multiple explosions, and a victory screen
- Classic no-combat bonus stages every 10 stages (can't lose a life, just rack up points)
- Local Top-10 leaderboard with arcade-style 3-letter initials entry, viewable from the title screen (
H) - Procedurally generated 8-bit chiptune sound effects plus a looping background track (no external audio assets required for the SFX)
- Bézier-curve enemy swoop paths and a scrolling starfield
- Optional intro screen with a portrait easter egg
- Python 3.10+
- pygame
pip install pygamepython galago.pyStandalone Windows/Linux executables (no Python or pygame install required) are built automatically for tagged releases — see the Releases page. To build one yourself:
pip install -e . pyinstaller
pyinstaller galago.specThe result is a single-file executable at dist/galago (Linux) or dist/galago.exe (Windows) — built on the OS you're targeting, PyInstaller doesn't cross-compile.
| Action | Keys |
|---|---|
| Move | Arrow keys / WASD |
| Shoot | Space / Up / W |
| Confirm / Restart | Enter |
| High scores (from title) | H |
| Enter initials (on a new high score) | Arrows to pick letter/position, Enter to confirm |
| Quit | Q / Esc |
The game follows a pragmatic hexagonal (ports & adapters) layout under src/galago/:
domain/— entities, collisions, formation movement, the boss capture state machine, scoring. Pure Python, zeropygameimport.ports/— smallProtocolinterfaces (Renderer,InputProvider,AudioPlayer,GameClock) that the application layer depends on.app/—GameApp, the screen state machine (title → wave → playing → game over) driven purely through the ports.adapters/pygame_adapter/— the only place that importspygame: rendering, input polling, procedural audio synthesis, and the clock.
galago.py at the repo root is a thin compatibility shim so python galago.py keeps working unchanged.
pip install -e ".[test]"
pytestThe domain layer (src/galago/domain/) has no dependency on pygame and its tests run even without pygame installed — that's what proves the decoupling actually holds.
If you'd like to support ongoing development, you can sponsor via GitHub Sponsors.
Construido en HarnessOS con VS Code y Claude, por efrasoft@gmail.com.
