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 解析器实现
300KB
6.5K SLoC
Owlchess 🦉🦀
又一个 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