31 个版本
使用旧版 Rust 2015
0.5.0 | 2019 年 4 月 29 日 |
---|---|
0.4.4 | 2019 年 3 月 5 日 |
0.4.3 | 2018 年 6 月 26 日 |
0.3.11 | 2018 年 3 月 22 日 |
0.2.1 | 2017 年 11 月 28 日 |
#660 在 游戏开发 中排名
244 每月下载次数
在 5 个 包中使用 (直接使用 2 个)
420KB
8K SLoC
Pleco
Pleco 是一个棋类库,包含国际象棋引擎 Stockfish 的构建模块,完全用 Rust 重新编写。
本项目分为两个包,pleco
(您目前所在的库)包含库功能,而pleco_engine
包含兼容 UCI(通用棋类接口)的引擎和人工智能。
Pleco 的总体目标是重写 Stockfish 引擎,用于比较和教育目的。因此,这里使用的绝大多数算法都是 Stockfish 的直接移植,大多数代码的功劳应归于 Stockfish 的维护者和作者。
关于使用此库实现的棋类引擎,请参阅 pleco_engine。
特性
pleco
实现的一些特性
- 棋子位置的位图表示
- 并发访问棋盘状态的能力,供并行搜索程序使用
- 完整移动生成功能,包括生成伪合法移动
- 静态计算的查找表(包括魔法位图)
- Zobrist 哈希
- 转换表:快速查找表,用于存储棋盘信息
- 预实现的搜索器,其中一些使用 rayon.rs 以实现易于并行的搜索
使用
要在您的 Rust 项目中使用 Pleco,Pleco.rs 作为库在 crates.io 上可用。Pleco 在 rust 的三个发行版(nightly
、beta
、stable
)上运行。
基本用法
设置棋盘位置非常简单。
use pleco::{Board,Player,PieceType};
let board = Board::start_pos();
assert_eq!(board.count_piece(Player::White,PieceType::P), 8);
assert_eq!(&board.fen(),"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");
从位置创建棋盘
可以使用有效的FEN(Forsyth-Edwards记法)字符串通过任何有效的棋盘位置创建一个Board
对象。查看维基百科文章了解更多关于FEN字符串及其格式的信息。
let board: Board = Board::from_fen("rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2").unwrap();
应用和生成走法
走法用BitMove
结构表示。它们必须由Board
对象直接生成,才能被认为是有效的走法。使用Board::generate_moves()
将生成当前位置当前玩家的所有合法的BitMove
。
use pleco::{Board,BitMove};
let mut board = Board::start_pos(); // create a board of the starting position
let moves = board.generate_moves(); // generate all possible legal moves
board.apply_move(moves[0]);
assert_eq!(board.moves_played(), 1);
我们可以要求棋盘从字符串应用走法。此字符串必须遵循标准UCI走法的格式,格式为[src_sq][dst_sq][promo]。例如,将棋子从A1移动到B3将具有uci字符串“a1b3”,而晋升兵将类似于“e7e81”。如果向棋盘提供格式不正确或非法的UCI走法,则返回false。
let mut board = Board::start_pos(); // create a board of the starting position
let success = board.apply_uci_move("e7e8q"); // apply a move where piece on e7 -> eq, promotes to queen
assert!(!success); // Wrong, not a valid move for the starting position
撤销走法
我们可以通过简单的Board::undo_move()
回到先前的棋盘状态。
let mut board = Board::start_pos();
board.apply_uci_move("e2e4"); // A very good starting move, might I say
assert_eq!(board.moves_played(),1);
board.undo_move();
assert_eq!(board.moves_played(),0);
特性
如果在使用nightly rust时,功能"nightly"
可用。这启用了一些夜间优化和速度提升。
使用方法就像更新你的cargo.toml
以包含
[dependencies]
pleco = {version = "*", features = ["nightly"]}
贡献
欢迎所有贡献!打开一个PR来贡献一些改进。查看“问题”标签以了解需要哪些帮助。
许可协议
Pleco根据MIT许可协议分发。有关详细信息,请参阅LICENSE-MIT。打开pull请求被视为同意这些许可条款。
依赖关系
~2MB
~39K SLoC