A Python implementation of the classic Triple Triad card game from Final Fantasy VIII
Project description
Triple-triad
A terminal-based Python implementation of the classic Triple Triad card game from Final Fantasy VIII, complete with chiptune background music, smart AI opponents, and support for official rules like Same, Plus, and Open.
✨ Features
- Authentic gameplay — 110 cards from FFVIII
- 3 difficulty levels — Easy, Medium, and Hard CPU opponents with distinct AI strategies
- Optional rules — Open, Same, Plus, and Random capture mechanics
- Chiptune music — Retro-style background music generated with NumPy and played through Pygame
- Interactive deck builder — Browse, filter, and sort all cards before picking your hand
- Deck presets — Themed decks (Fire Power, Ice Wall, Thunder Rush, and more)
- Terminal rendering — ANSI-colored board with card ownership indicators
🎮 How to Play
Triple Triad is a 2-player card game played on a 3×3 grid. Each player has 5 cards. Players take turns placing one card on the board. When a card is placed adjacent to an opponent's card, the touching sides are compared — if the attacker's value is higher, the defender's card is captured. The player with the most cards on the board at the end wins.
┌──────────────────┬──────────────────┬──────────────────┐
│ │ │ │
│ [ 1 ] │ [ 2 ] │ [ 3 ] │
│ │ │ │
├──────────────────┼──────────────────┼──────────────────┤
│ ■Ifrit │ │ │
│ ▲ 9 │ [ 5 ] │ [ 6 ] │
│ ◀ 5 Ice 8 ▶ │ │ │
│ ▼ 6 │ │ │
├──────────────────┼──────────────────┼──────────────────┤
│ □Shiva │ │ │
│ ▲ 6 │ [ 8 ] │ [ 9 ] │
│ ◀ 6 Ice 9 ▶ │ │ │
│ ▼ 7 │ │ │
└──────────────────┴──────────────────┴──────────────────┘
- ■ = Your card
- □ = CPU's card
- Numbers inside empty cells = board position (1–9)
🚀 Getting Started
Prerequisites
- Python 3.13+
- NumPy (for audio synthesis)
- Pygame (for audio playback — optional, game runs silently without it)
Installation
# Clone the repository
git clone https://github.com/YOUR_USERNAME/triple-triad.git
cd triple-triad
# Install dependencies
uv sync --locked
Run the Game
python -m triple_triad.game
📦 Project Structure
triple_triad/
├── data/
│ └── cards.py # All 110 card definitions with stats & elements
├── synth/
│ ├── melodies/
│ │ └── background_music.py # Melody, chords, bass & percussion data
│ ├── constants.py # Note frequencies and sample rate
│ ├── player.py # Threaded chiptune player (pygame)
│ └── wave_generators.py # Square, triangle & noise wave synthesis
├── ai.py # CPU decision-making (random / greedy)
├── board.py # 3×3 grid state + ANSI terminal renderer
├── cards.py # Card class with immutable stats via CardStats
├── deck.py # Deck builders, presets & interactive picker
├── game.py # Main game loop and orchestration
├── rules.py # Capture logic (basic, Same, Plus)
└── ui.py # Display helpers and rule selection menu
🎵 Audio
The game includes a built-in chiptune soundtrack synthesized entirely in software:
- 5 channels: melody, harmony, pad, bass, and percussion
- Generated with NumPy — no audio files required
- Played through Pygame — if Pygame is unavailable, the game runs silently
🧩 Rules
| Rule | Description |
|---|---|
| Open | CPU's hand is visible to the player |
| Same | If 2+ adjacent cards share equal values, all are captured |
| Plus | If 2+ adjacent cards share equal value sums, all are captured |
| Random | Cards are dealt randomly from the full pool |
🛠 Development
Install Dev Dependencies
uv sync --locked
Run Tests
pytest
Lint
ruff check .
🤝 Contributing
Contributions are welcome! Here's how to get started:
- Fork the repository
- Create a feature branch —
git checkout -b feature/my-feature - Make your changes — follow the existing code style
- Run tests —
pytest - Submit a pull request
Please open an issue first for major changes to discuss the approach.
📄 License
This project is for educational and personal use. Triple Triad is a minigame from Final Fantasy VIII, © Square Enix. All card names and game mechanics are the property of their respective owners.
🙏 Acknowledgments
- Square Enix — for creating Triple Triad in Final Fantasy VIII
- The original card stats and element system are faithfully reproduced from the game
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file triple_triad_ff8-0.1.0.tar.gz.
File metadata
- Download URL: triple_triad_ff8-0.1.0.tar.gz
- Upload date:
- Size: 39.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2306d07c422399a9dbedc395d531213c7dea6959afd503abd92e6e33bd6cac42
|
|
| MD5 |
262f1cdd333e12863c76b8c6e526878d
|
|
| BLAKE2b-256 |
2d52ea544d09a2429746ec92b8b5ffa87000046c0c510d04dee1bb3df60a29bc
|
File details
Details for the file triple_triad_ff8-0.1.0-py3-none-any.whl.
File metadata
- Download URL: triple_triad_ff8-0.1.0-py3-none-any.whl
- Upload date:
- Size: 26.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f4a2b4f9d2b29484a8f06493eb744a32069eb086b445140dd68ea1672b5c3959
|
|
| MD5 |
64d01448a3b420b1f570b1f2dffd739a
|
|
| BLAKE2b-256 |
71fe89b6801428f3ec820ab5f92870eee752917bdeaeac9542e10a6786c3aef9
|