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游戏开发 中排名

Download history 84/week @ 2024-04-23 72/week @ 2024-04-30 82/week @ 2024-05-07 80/week @ 2024-05-14 77/week @ 2024-05-21 74/week @ 2024-05-28 58/week @ 2024-06-04 49/week @ 2024-06-11 71/week @ 2024-06-18 77/week @ 2024-06-25 65/week @ 2024-07-02 39/week @ 2024-07-09 63/week @ 2024-07-16 58/week @ 2024-07-23 61/week @ 2024-07-30 56/week @ 2024-08-06

244 每月下载次数
5 包中使用 (直接使用 2 个)

MIT 许可证

420KB
8K SLoC

Pleco

Pleco 是一个棋类库,包含国际象棋引擎 Stockfish 的构建模块,完全用 Rust 重新编写。

Pleco crate Build Status

本项目分为两个包,pleco(您目前所在的库)包含库功能,而pleco_engine 包含兼容 UCI(通用棋类接口)的引擎和人工智能。

Pleco 的总体目标是重写 Stockfish 引擎,用于比较和教育目的。因此,这里使用的绝大多数算法都是 Stockfish 的直接移植,大多数代码的功劳应归于 Stockfish 的维护者和作者。

关于使用此库实现的棋类引擎,请参阅 pleco_engine

特性

pleco 实现的一些特性

  • 棋子位置的位图表示
  • 并发访问棋盘状态的能力,供并行搜索程序使用
  • 完整移动生成功能,包括生成伪合法移动
  • 静态计算的查找表(包括魔法位图)
  • Zobrist 哈希
  • 转换表:快速查找表,用于存储棋盘信息
  • 预实现的搜索器,其中一些使用 rayon.rs 以实现易于并行的搜索

使用

要在您的 Rust 项目中使用 Pleco,Pleco.rs 作为库在 crates.io 上可用。Pleco 在 rust 的三个发行版(nightlybetastable)上运行。

基本用法

设置棋盘位置非常简单。

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