#board-game #traits #abstract #representation #moves #deterministic #tic-tac-toe

board-game-traits

抽象游戏位置表示特性的集合

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

MIT 许可证

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(),
        }
    }
}

无运行时依赖