A desktop implementation of Baghchal (बाघचाल), a traditional Nepali strategic board game, featuring a strong AI opponent with 5 difficulty levels.
Baghchal is a game of asymmetric strategy played on a 5x5 grid. One player controls 4 tigers, the other controls 20 goats. Tigers hunt goats by jumping over them; goats try to trap all tigers so they cannot move. The asymmetry makes every game a unique tactical puzzle.
- Features
- Game Rules
- Prerequisites
- Building
- Running
- Controls
- How the AI Works
- Project Structure
- Roadmap
- Contributing
- License
- Three game modes: Play as Goat vs AI, Play as Tiger vs AI, or Human vs Human
- 5 AI difficulty levels: From beginner-friendly to very challenging
- Timed Human vs Human mode: 5-minute chess clock per side
- Sound effects and a polished main menu
- Keyboard and mouse support
- Self-contained: All assets (images, fonts, sounds) are embedded in the binary — no external files needed at runtime
| Tigers (Bagh) | Goats (Bakhra) | |
|---|---|---|
| Pieces | 4 (start on corners) | 20 (placed one per turn) |
| Objective | Capture 5 goats | Trap all tigers so they cannot move |
| Movement | Move to an adjacent point, or jump over a goat to capture it | Place a goat on any empty point, then move to adjacent points |
- Tigers and goats move along the lines of the board (horizontal, vertical, and diagonal where lines exist).
- A tiger captures a goat by jumping over it to an empty point directly beyond, along a line.
- Goats cannot jump or capture.
- The goat player must place all 20 goats before moving any of them.
- C++17 compatible compiler (clang++ or g++)
- SFML 2 — Simple and Fast Multimedia Library
brew install sfml@2sudo apt install libsfml-devNote: On Linux, you may need to adjust the include and library paths in the
Makefile(currently configured for Homebrew on macOS).
git clone https://github.com/code-geek/baghchal.git
cd baghchal
makeThis produces the baghchal_game executable in the project root.
To clean build artifacts:
make clean./baghchal_game| Action | Keyboard | Mouse |
|---|---|---|
| Move selector | Arrow keys | Hover over a point |
| Select / Place / Move | Enter | Click |
| Return to main menu | Z | — |
The AI uses a negamax search (a variant of minimax) with several modern enhancements:
- Bitboard representation — The 5x5 board (25 points) is encoded in a 32-bit integer for fast move generation and evaluation
- Iterative deepening with aspiration windows — searches progressively deeper within a 2-second time limit
- Alpha-beta pruning with Principal Variation Search (PVS)
- Transposition table — 4M-entry Zobrist hash table avoids re-evaluating positions
- Move ordering — killer moves, history heuristic, and countermove heuristic
- Pruning — null move pruning, futility pruning, and razoring to cut the search tree
- Quiescence search — extends the search for capture sequences to avoid horizon effects
- Symmetry canonicalization — exploits the board's 8-fold symmetry to reduce the search space
The evaluation function considers tiger mobility, goat clustering, possible captures, trapped tigers, center control, and dead goats.
baghchal/
├── main.cpp # Entry point
├── Game.cpp/.h # Game loop, initialization, rendering
├── AI.cpp/.h # AI engine (search, evaluation, bitboards)
├── Board.cpp/.h # Board representation and point coordinates
├── Tiger.cpp/.h # Tiger player logic and move validation
├── Goat.cpp/.h # Goat player logic and move validation
├── Input.cpp/.h # Keyboard and mouse input handling
├── Sprites.cpp/.h # Sprite rendering and image management
├── MainMenu.cpp/.h # Main menu UI and navigation
├── GameState.cpp/.h # Position history for repetition detection
├── GameTimer.cpp/.h # Chess clock for Human vs Human mode
├── Sound.cpp/.h # Sound effects
├── Text.cpp/.h # On-screen text rendering
├── Headers.h # Shared constants and enums
├── Flags.h # Game state flags
├── AIState.h # AI configuration (depth, time limit)
├── SelectionState.h # Selector/cursor state
├── DrawState.h # Rendering flags
├── ImgManager.h # Texture and image loader
├── images/ # Embedded image data (as header files)
├── fonts/ # Embedded font data
└── sounds/ # Embedded sound data
- Non-repetition rule enforcement
- Stronger evaluation function and deeper search
- Faster AI move times
- More sounds and animations
- Cross-platform build support (CMake)
Contributions are welcome! Feel free to open an issue or submit a pull request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/my-feature) - Commit your changes
- Push to the branch and open a pull request
This project is licensed under the MIT License. See the LICENSE file for details.