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:
- Super/Ultimate tic-tac-toe in the module sttt.
- Ataxx in the module ataxx.
- Chess in the module chess, implemented as a simple wrapper around the chess crate.
Notable things currently implemented 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.
let mut board = AtaxxBoard::default();
println!("{}", board);
board.available_moves().for_each(|mv| {
println!("{:?}", mv)
});
let mv = board.random_available_move(&mut rng);
println!("Picked move {:?}", mv);
board.play(mv);
println!("{}", board);
let board = AtaxxBoard::default();
println!("{}", board);
let mut bot = MCTSBot::new(1000, 2.0, thread_rng());
println!("{:?}", bot.select_move(&board))