14 个不稳定版本 (4 个重大变更)
0.8.2 | 2023年7月1日 |
---|---|
0.8.1 | 2023年6月7日 |
0.6.0 | 2022年11月7日 |
0.5.0 | 2022年4月25日 |
0.3.6 | 2021年9月11日 |
#300 在 算法
每月89次下载
325KB
8K SLoC
board-game-rs
一个用于确定性的两人游戏的 棋盘 抽象。这允许代码对实际游戏进行泛化,因此只需编写一次。
特性
目前,已实现的游戏包括
- 象棋 作为 ChessBoard,通过简单包装 chess 包来实现。
- 围棋/Baduk 作为 GoBoard。
- 超级/终极井字棋 作为 STTTBoard。
- Ataxx 作为 AtaxxBoard。
- Oware 作为 OwareBoard。
- 四子棋 作为 Connect4。
- 井字棋 作为 TTTBoard。
大多数游戏实现都进行了高度优化,在适当的地方使用了位图或其他技术。
还有一些通用棋盘工具
- MaxMovesBoard 包装另一个棋盘,并在达到移动限制后设置结果为平局。
- DummyGame 是一个从显式游戏树构建的棋盘,用于调试。
此包中适用于任何 棋盘 的工具
- 游戏算法,具体来说
- RandomBot,它简单地选择一个随机移动。
- RolloutBot,它为每个可能的移动模拟固定数量的随机游戏,并选择获胜概率最高的一个。
- MinimaxBot,它根据可定制的启发式方法在固定深度下选择最佳移动。(实现为alpha-beta negamax)。
- MCTSBot,它通过蒙特卡洛树搜索找到最佳移动。
- 随机棋盘生成函数,请参阅board_gen。
- 用于比较对战力的机器人对战执行器,请参阅bot_game。
- 简单的游戏统计数据(perft、随机游戏长度),可用于测试棋盘实现。
此crate也用作kZero的基础,这是一个通用的AlphaZero实现。
示例
列出棋盘上的可用移动并随机选择一个。
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);
根据MCTS获取最佳移动
let board = AtaxxBoard::default();
println!("{}", board);
let mut bot = MCTSBot::new(1000, 2.0, thread_rng());
println!("{:?}", bot.select_move(&board))
依赖关系
~7.5MB
~136K SLoC