10 个版本

0.4.0 2023 年 8 月 12 日
0.3.3 2023 年 8 月 11 日
0.3.2 2022 年 9 月 7 日
0.3.1 2022 年 8 月 21 日
0.1.0 2022 年 7 月 11 日

#515 in 解析器实现


用于 dioxus-chessboard

MIT 许可证

300KB
6.5K SLoC

Owlchess 🦉🦀

Crates.io: owlchess Documentation Build

又一个 Rust 国际象棋库,注重速度和安全。主要用于各种国际象棋 GUI 和工具,也可以使用 Owlchess 构建快速的国际象棋引擎。

代码主要来自我的国际象棋引擎 SoFCheck,但用 Rust 重新编写,并考虑到安全性。

此库支持核心国际象棋功能

  • 生成走法
  • 执行走法
  • 计算游戏结果
  • 解析和格式化 FEN 格式的棋盘
  • 解析和格式化 UCI 和 SAN 格式的走法

功能

快速:棋盘建立在 Magic Bitboards 之上,这是一种快速生成走法和判断王是否受到攻击的方法。

安全:该库防止你创建无效的棋盘或执行无效的走法。虽然这种安全性通常是好事,但它通过运行时检查来强制执行,这可能会降低你的程序速度。例如,在 owlchess::Move::make 中的验证使此函数的速度大约慢了 30-50%。因此,如果性能真的很重要,你可以使用不安全的 API 来加速。

示例

生成走法

use owlchess::{Board, movegen::legal};

fn main() {
    // Create a board from FEN
    let board = Board::from_fen("rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1")
        .unwrap();

    // Generate legal moves
    let moves = legal::gen_all(&board);
    assert_eq!(moves.len(), 20);
}

从 UCI 符号执行走法

use owlchess::{Board, Move};

fn main() {
    // Create a board with initial position
    let board = Board::initial();

    // Create a legal move from UCI notation
    let mv = Move::from_uci_legal("e2e4", &board).unwrap();

    // Create a new board with move `mv` made on it
    let board = board.make_move(mv).unwrap();
    assert_eq!(
        board.as_fen(),
        "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
            .to_string(),
    );
}

玩游戏

以下示例展示了 MoveChain,它表示一个棋局。与 Board 不同,MoveChain 保留走法历史并能够检测重复和棋。

use owlchess::{Outcome, moves::make::Uci, types::OutcomeFilter, Color, WinReason, MoveChain};

fn main() {
    // Create a `MoveChain` from initial position
    let mut chain = MoveChain::new_initial();

    // Push the moves into `MoveChain` as UCI strings
    chain.push(Uci("g2g4")).unwrap();
    chain.push(Uci("e7e5")).unwrap();
    chain.push(Uci("f2f3")).unwrap();
    chain.push(Uci("d8h4")).unwrap();

    // Calculate current game outcome
    chain.set_auto_outcome(OutcomeFilter::Strict);
    assert_eq!(
        chain.outcome(),
        &Some(Outcome::Win {
            side: Color::Black,
            reason: WinReason::Checkmate,
        }),
    );
}

其他

一些示例位于 chess/examples 目录和库文档中。它们可能会给你更多关于如何使用该库的想法。

Rust 版本

此库目前仅在 Rust 1.71 或更高版本上进行了测试,但可能适用于较旧版本。Rust 版本低于 1.62 的一定不支持。

与其他库的比较

在Rust中,有两个著名的棋类库:一个是chess,另一个是shakmaty。以下将比较这些库与owlchess

chess的比较

chess相比,owlchess提供了更多功能

  • 区分各种游戏结果
  • 因物质不足而和棋
  • 格式化SAN移动
  • 更高的安全性:由于不能在不使用unsafe的情况下进行非法移动,因此棋盘始终是有效的
  • 在失败的情况下提供更详细的错误信息

然而,chess也有一些优势

  • 更快的合法移动生成器(owlchess依赖于快速的半合法移动生成器)
  • 更成熟的代码库

但是,在许多应用中,只需要快速的半合法移动生成器和快速的移动验证就足够了,所以实际性能差异可能小于预期。

shakmaty的比较

shakmaty相比,owlchess有以下优势

  • 更高的安全性:由于不能在不使用unsafe的情况下进行非法移动,因此棋盘始终是有效的
  • 支持重复和棋
  • 使用更自由的MIT许可协议而不是GPLv3

然而,shakmaty也有一些优势

  • 更快的合法移动生成器
  • 移动应用更快(尤其是如果未使用Zobrist散列时)
  • 支持许多棋类变体

基准测试

有一个单独的仓库,其中包含Rust中不同棋类实现基准测试。

许可协议

此仓库采用MIT许可协议。有关详细信息,请参阅LICENSE

依赖项

~0.4–0.9MB
~19K SLoC