#chess #move #bitboard #chess-engine #board #generation #newtype

无 std cozy-chess

Rust 钢琴和 Chess960 移动生成库

13 个版本

0.3.4 2024年4月5日
0.3.3 2023年7月21日
0.3.2 2023年3月28日
0.3.1 2022年9月27日
0.1.2 2021年11月17日

#19 in 游戏

Download history 92/week @ 2024-04-15 141/week @ 2024-04-22 52/week @ 2024-04-29 19/week @ 2024-05-06 26/week @ 2024-05-13 36/week @ 2024-05-20 210/week @ 2024-05-27 245/week @ 2024-06-03 17/week @ 2024-06-10 34/week @ 2024-06-17 36/week @ 2024-06-24 21/week @ 2024-07-08 7/week @ 2024-07-15 18/week @ 2024-07-22 19/week @ 2024-07-29

65 个月下载量
用于 pyrrhic-rs

MIT 许可证

590KB
3.5K SLoC

cozy-chess

Rust 钢琴和 Chess960 移动生成库

crates.io ko-fi lgbtq+ friendly trans rights

cozy-chess 是一个用 Rust 编写的 Chess 和 Chess960 (Fischer Random Chess) 移动生成库,旨在提供具有竞争力的移动生成性能。它主要受到 Jordan Bray 的简洁 chess 库的启发。 cozy-chess 的目标是成为 chess 的更安全替代品,在提供类似性能的同时保持正确性。

概述

  • no_std 兼容
  • 支持 Chess、Chess960/FRC 和 Double Chess960/DFRC
  • 强类型 API,大量使用 newtypes 避免错误
  • 适合在棋引擎中使用的高性能合法移动生成
    • 实现固定移位的魔法位板
    • 可选地实现基于 BMI2 内置函数的 PEXT 位板
    • 灵活的 API 可以批量生成移动,以便进行可选的批量过滤
  • 高效的基于位板的棋盘表示
  • 增量更新的 zobrist 哈希,可以快速获取棋盘的哈希值

软件包特性

  • std: 启用需要 std 的功能。目前仅用于 Error 特性。
  • pext: 启用 PEXT 位板。

关于 CPU 特性和性能的说明

默认情况下,Rust 可执行文件针对基线 CPU,以确保最大兼容性,但会牺牲性能。 cozy-chess 可以显著受益于现代 CPU 中的功能。为了获得最佳性能,可以将目标 CPU 设置为 native 以使用构建机器支持的功能。或者,可以将目标 CPU 设置为 x86-64-v3,这将生成在大多数现代 CPU 上运行的二进制文件。可以通过将 -C target-cpu=<CPU> 添加到 RUSTFLAGS 来更改目标 CPU。

PEXT 位图是一种比 cozy-chess 中使用的魔术位图算法更快的变化形式。PEXT 位图依赖于在 BMI2 CPU 扩展中引入的特性。然而,它默认是禁用的,因为在 Zen 3 之前实现的 PEXT 的 AMD CPU 上,PEXT 位图会 更慢。可以通过 pext 功能启用 PEXT 位图。

关于 UCI 解析的说明

为了支持 Chess960,cozy-chess 使用了与 UCI 协议使用的标准王后-车易位表示不兼容的 king-captures-rook 易位表示法。这是一个常见用例,因此 cozy_chess::util 模块提供了自动解析和在不同格式之间转换的辅助函数。

示例

基本示例

# use cozy_chess::*;
// Start position
let board = Board::default();
let mut move_list = Vec::new();
board.generate_moves(|moves| {
    // Unpack dense move set into move list
    move_list.extend(moves);
    false
});
assert_eq!(move_list.len(), 20);

批量获取捕获移动

# use cozy_chess::*;
// Parse position from FEN
let board = "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1"
    .parse::<Board>()
    .unwrap();

let mut total_moves = 0;
let mut total_captures = 0;

let enemy_pieces = board.colors(!board.side_to_move());
board.generate_moves(|moves| {
    let mut captures = moves.clone();
    // Bitmask to efficiently get all captures set-wise.
    // Excluding en passant square for convenience.
    captures.to &= enemy_pieces;

    total_moves += moves.len();
    total_captures += captures.len();
    false
});

assert_eq!(total_moves, 48);
assert_eq!(total_captures, 8);

Perft 示例

examples/perft.rs 中存在一个 perft 实现

$ cargo run --release --example perft -- 7
   Compiling cozy-chess v0.3.0
    Finished release [optimized] target(s) in 6.37s
     Running `target\release\examples\perft.exe 7`
3195901860 nodes in 10.05s (318045465 nps)

变更日志

v0.3.4

添加

  • 添加了处理 UCI 移动的辅助方法。
  • 添加了 Square::relative_to 以获取相对于某个颜色的方格。

v0.3.3

添加

  • 添加了半回合时钟和全回合数字字段的设置器。

修复

  • 修复了将死规则不优先于 50 检验规则平局的错误。
  • 修复了半回合时钟和全回合数字可能溢出的错误。

v0.3.2

修复

  • 修复了在解析和构建 Board 时,过路兵没有被正确验证的 bug。

v0.3.1

修复

  • 修复了在 Board::is_legal 期间,在将军的情况下,易位被认为是合法的错误。

v0.3.0

添加

  • 添加了从 Scharnagl 数字获取 Chess960 起始位置的方法。
  • 添加了使用 BMI2 PEXT 内置的 PEXT 位图。可能比默认算法更快。使用 pext 功能启用。
  • 添加了 Board::hash_without_ep 方法,用于快速等价性检查,排除过路兵方格。
  • 添加了 Board::same_position 以检查两个棋盘是否在 FIDE 规则下等效。
  • 添加了 Board::colored_pieces,它是 board.colors(color) & board.pieces(piece) 的简写。
  • 添加了 BitBoard::is_subsetBitBoard::is_supersetBitBoard::is_disjoint

更改(破坏性

  • BitBoard 现在以更集合的方式操作,而不是像 u64。位运算符更改为与集合运算符匹配。
  • BitBoard::popcnt 重命名为 BitBoard::len,以与其他数据结构保持一致。
  • BoardBuilderfullmove_number 字段更改为 u16,出于可用性原因。
  • BoardFromStr 实现现在解析 FEN 和 Shredder FEN。

已移除(破坏性更改

  • BitBoard不再直接实现Iterator
  • 滑动移动函数默认不再为const;如有需要,请使用const变体。
  • Board中移除了不必要的"try"变体;当调用*_unchecked方法时,接受 panic的风险。

修复

  • 修复了Square::try_offset中的溢出错误。
  • FenParseError不再是无法命名的。
  • 修复了FEN解析中返回的错误。
  • 修复了FEN解析中没有产生的一些错误。

依赖关系