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.1.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.1-py3-none-any.whl (26.6 kB view details)

Uploaded Python 3

File details

Details for the file triple_triad_ff8-0.1.1.tar.gz.

File metadata

  • Download URL: triple_triad_ff8-0.1.1.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.1.tar.gz
Algorithm Hash digest
SHA256 d396c6b509571bdfd10269ab6da75fba03924a9e7def214f050f9e1fc4787eb9
MD5 1ec15d972e89e9d3dd9b94f4a0065ce4
BLAKE2b-256 9c8472ae0a6d46ad6e45f1db76868e05a33a876c914dea214ea0e9c46927f61a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for triple_triad_ff8-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e47dd1130efdea92ffdb37eac5b6e16fecdd25be9aebe2661feae53579b74bee
MD5 2d21d3b5c8fdca99f7334a53918cec1f
BLAKE2b-256 61aa7c9eed0bce84e914bd0bd38ba283adfb3389b21fbf4c89c78141d4d2ce2b

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