5 个版本 (3 个破坏性更新)
0.4.0 | 2024年1月14日 |
---|---|
0.3.0 | 2022年3月7日 |
0.2.1 | 2021年7月11日 |
0.2.0 | 2021年2月23日 |
0.1.0 | 2019年6月27日 |
#2 in #tic-tac-toe
每月下载 38 次
用于 pgn-traits
10KB
96 代码行
概述
一个用于抽象表示两人棋盘游戏的极简特性集合。这些特性可以为任何顺序、确定性、完全信息游戏实现。这包括许多流行的游戏,如象棋、围棋、象棋、五子棋、四子棋和井字棋。
本软件包中不提供任何实现。
使用示例
计算在 n 棋步深处的可能移动总数。通常称为 perf 测试,用于检查生成移动的正确性
pub fn perft<B: Board>(board: &mut B, depth: u16) -> u64 {
if depth == 0 {
1
} else {
let mut moves = vec![];
board.generate_moves(&mut moves);
moves
.into_iter()
.map(|mv| {
let reverse_move = board.do_move(mv);
let num_moves = perft(board, depth - 1);
board.reverse_move(reverse_move);
num_moves
})
.sum()
}
}
运行 n 着法的 Minimax 算法
fn minimax<B: EvalBoard>(board: &mut B, depth: u16) -> f32 {
match board.game_result() {
Some(GameResult::WhiteWin) => return 100.0,
Some(GameResult::BlackWin) => return -100.0,
Some(GameResult::Draw) => return 0.0,
None => (),
}
if depth == 0 {
board.static_eval()
} else {
let side_to_move = board.side_to_move();
let mut moves = vec![];
board.generate_moves(&mut moves);
let child_evaluations = moves.into_iter().map(|mv| {
let reverse_move = board.do_move(mv);
let eval = minimax(board, depth - 1);
board.reverse_move(reverse_move);
eval
});
match side_to_move {
Color::White => child_evaluations
.max_by(|a, b| a.partial_cmp(b).unwrap())
.unwrap(),
Color::Black => child_evaluations
.min_by(|a, b| a.partial_cmp(b).unwrap())
.unwrap(),
}
}
}