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 游戏
65 个月下载量
用于 pyrrhic-rs
590KB
3.5K SLoC
cozy-chess
Rust 钢琴和 Chess960 移动生成库
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_subset
、BitBoard::is_superset
和BitBoard::is_disjoint
。
更改(破坏性)
BitBoard
现在以更集合的方式操作,而不是像u64
。位运算符更改为与集合运算符匹配。BitBoard::popcnt
重命名为BitBoard::len
,以与其他数据结构保持一致。BoardBuilder
的fullmove_number
字段更改为u16
,出于可用性原因。Board
的FromStr
实现现在解析 FEN 和 Shredder FEN。
已移除(破坏性更改)
BitBoard
不再直接实现Iterator
。- 滑动移动函数默认不再为
const
;如有需要,请使用const
变体。 - 从
Board
中移除了不必要的"try"变体;当调用*_unchecked
方法时,接受 panic的风险。
修复
- 修复了
Square::try_offset
中的溢出错误。 FenParseError
不再是无法命名的。- 修复了FEN解析中返回的错误。
- 修复了FEN解析中没有产生的一些错误。