#board #ai #ataxx #tree-search #sttt

bin+lib board-game

棋盘游戏抽象及其相关通用工具

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算法

Download history 1/week @ 2024-03-08 2/week @ 2024-03-15 21/week @ 2024-03-29 4/week @ 2024-04-05

每月89次下载

MIT/Apache

325KB
8K SLoC

board-game-rs

Crates.io CI status

一个用于确定性的两人游戏的 棋盘 抽象。这允许代码对实际游戏进行泛化,因此只需编写一次。

特性

目前,已实现的游戏包括

大多数游戏实现都进行了高度优化,在适当的地方使用了位图或其他技术。

还有一些通用棋盘工具

  • 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