Skip to main content

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:

  1. Fork the repository
  2. Create a feature branchgit checkout -b feature/my-feature
  3. Make your changes — follow the existing code style
  4. Run testspytest
  5. 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

triple_triad_ff8-0.1.0.tar.gz (39.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

triple_triad_ff8-0.1.0-py3-none-any.whl (26.6 kB view details)

Uploaded Python 3

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

Hashes for triple_triad_ff8-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2306d07c422399a9dbedc395d531213c7dea6959afd503abd92e6e33bd6cac42
MD5 262f1cdd333e12863c76b8c6e526878d
BLAKE2b-256 2d52ea544d09a2429746ec92b8b5ffa87000046c0c510d04dee1bb3df60a29bc

See more details on using hashes here.

File details

Details for the file triple_triad_ff8-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for triple_triad_ff8-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f4a2b4f9d2b29484a8f06493eb744a32069eb086b445140dd68ea1672b5c3959
MD5 64d01448a3b420b1f570b1f2dffd739a
BLAKE2b-256 71fe89b6801428f3ec820ab5f92870eee752917bdeaeac9542e10a6786c3aef9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page