Skip to main content

Crate backgammon

Crate backgammon 

Source
Expand description

status-badge

§Backgammon: The Oldest Board Game in the World

This crate provides a pure, canonical implementation of the game Backgammon.

§Supported Doubling Cube Rules

The following doubling cube rules are supported:

  • Beaver
  • Raccoon
  • Murphy
  • Jacobi
  • Crawford
  • Holland

For a correct and tournament-legal implementation, AI agents should interact with the Match struct rather than the Game struct directly. use backgammon::prelude::*;

AI Agent Setup: Always define the match context first

use backgammon::prelude::*;

fn setup_agent_environment() -> Match {
let mut m = Match::new();
m.set_points(13).unwrap();
m.set_crawford(true).unwrap();
m
}
  • Why Match?: It manages the Doubling Cube, Match Points, and rules like Jacoby or Crawford which are essential for calculating “Match Equity” (the probability of winning the whole match).
  • Statelessness: This crate is stateless. Agents must persist the Match object between turns.

§Difference between Game and Match Structs

FeatureGame StructMatch Struct
Checker MovementYesYes (via current game)
Dice RollingYesYes
Doubling CubeNoYes
Match ScoreNoYes
Tournament RulesNoYes (Crawford, etc.)

§Examples

§Creating a Match

To create a new backgammon match, load the prelude module and define a mutable match:

use backgammon::prelude::*;

let mut m = Match::new();

Depending on the style of tournament, it is possible to set any number of rules:

use backgammon::prelude::*;

fn play_match() -> Result<(), Error> {

let mut m = Match::new();
m.set_points(13)?;
m.set_jacobi(true)?;

Ok(())
}

§The first roll

In a physical game, both players roll with one die. Then, the higher roll defines the first player.

use backgammon::prelude::*;

fn play_match() -> Result<(), Error> {

let mut m = Match::new();
m.roll(Player::Nobody)?;

Ok(())
}

§Playing an Example Backgammon Match

To see this library in action, run the included example:

cargo run --example backgammon_tui

For more examples, have a look at the examples directory.

§Design Philosophy

This library is designed to provide stateless Backgammon gameplay functionality. Because it does not track or store game states itself, you can easily implement wrappers that use this library along with an external database to manage and persist game states.

§Discussions and Support

Remember that the APIs are not stable yet. Any support is very welcome. Please open an Issue to discuss features or ask for help.

Re-exports§

pub use error::Error;
pub use game::Game;
pub use match::Match;
pub use match::MatchState;

Modules§

ai
Implements the AI Agent API. Useful for training neural networks.
error
Implements all possible Backgammon errors.
game
Implements a Backgammon game.
match
Implements a Backgammon match.
prelude
Provides commonly used types and structures for ease of use in external modules. It is recommended to always use the prelude module for convenience.
rules
Implements the board, the dice, the cube, and all other Backgammon rules.
stats
Implements statistics.