A Board abstraction for deterministic two player games. This allows for code to be generic over the actual game, so it only needs to written once.
Currently, the implemented games are:
- Chess as ChessBoard, implemented as a simple wrapper around the chess crate.
- Go/Baduk as GoBoard.
- Super/Ultimate tic-tac-toe as STTTBoard.
- Ataxx as AtaxxBoard.
- Oware as OwareBoard.
- Connect4 as Connect4.
- Tic Tac Toe as TTTBoard.
Most game implementations are heavily optimized, using bitboards or other techniques where appropriate.
There are also some utility boards:
- MaxMovesBoard wraps another board and sets the outcome to a draw after move limit has been reached.
- DummyGame is a board that is constructed from an explicit game tree, useful for debugging.
Utilities in this crate that work for any Board:
- Game-playing algorithms, specifically:
- RandomBot, which simply picks a random move.
- RolloutBot, which simulates a fixed number of random games for each possible move and picks the one with the best win probability.
- MinimaxBot, which picks the best move as evaluated by a customizable heuristic at a fixed depth. (implemented as alpha-beta negamax).
- MCTSBot, which picks the best move as found by Monte Carlo Tree Search.
- Random board generation functions, see board_gen.
- A bot vs bot game runner to compare playing strength, see bot_game.
- Simple game statistics (perft, random game length) which can be used to test board implementations.
This crate is also used as the foundation for kZero, a general AlphaZero implementation.
let mut board = AtaxxBoard::default();
println!("{}", board);
board.available_moves().unwrap().for_each(|mv| {
println!("{:?}", mv)
});
let mv = board.random_available_move(&mut rng).unwrap();
println!("Picked move {:?}", mv);
board.play(mv).unwrap();
println!("{}", board);
let board = AtaxxBoard::default();
println!("{}", board);
let mut bot = MCTSBot::new(1000, 2.0, thread_rng());
println!("{:?}", bot.select_move(&board))
Each game has a separate cargo feature, and there's a game_all
default feature that enables all games.
See the docs for a full list.