#chess-engine #chess #uci #stdio #stdin #stdout #io

vampirc-io

一个用于异步、非阻塞、基于 UCI 协议的棋盘界面和棋力引擎之间通信的库

3个不稳定版本

0.3.0 2020年4月12日
0.2.1 2019年9月27日
0.2.0 2019年9月17日

#1370 in 游戏开发

Apache-2.0

11KB
133

vampirc-io 构建状态 文档状态

vampirc-io 是 vampirc-uci 的配套工具箱。虽然 vampirc-uci 负责解析和序列化 UCI 消息,但 vampirc-io 负责处理这些消息在棋盘客户端和棋力引擎之间的通信 - 通常是通过标准输入和标准输出。

它是通过 Rust 语言的异步功能实现的,最著名的是 async-std。读取从 stdin 读取数据并将其解析为 UciMessages 流的循环,以及将消息写入 stdout 的循环都是异步、非阻塞的。

信息:从 0.3.0 版本开始,这个工具箱不再需要 nightly Rust 构建,但它需要 1.39+,以支持异步。

UCI 协议是棋力引擎与棋盘 GUI(如 Scid vs. PC)通信的一种方式。

Vampirc 项目 是一个用 Rust 编写的棋力引擎和棋力库套件。它以斯洛文尼亚特级大师 Vasja Pirc 命名,也许还有吸血鬼?我不知道。

要使用该工具箱,请在 Cargo.toml 文件中声明依赖关系

使用方法

Cargo.toml 中声明依赖关系

[dependencies]
vampirc-io = "0.3"

然后在您的工具箱根目录中引用 vampirc_io 工具箱

extern crate vampirc_io;

导入

use vampirc_io as vio;
use vampirc_uci::UciMessage;

创建一个接收 futures 通道 - 用于接收 UCI 消息(来自 stdin 的那些)的通道

let (itx, irx) = vio::new_try_channel();

创建一个发送 futures 通道 - 用于发送 UCI 消息(输出到 stdout 的那些)的通道

let (otx, orx) = vio::new_channel();

编写一个处理接收到的消息的异步函数,例如

async fn process_message(engine: Arc<Engine>, mut msg_stream: Pin<Box<impl Stream<Item = io::Result<UciMessage>>>>, msg_handler: &dyn MsgHandler, msg_sender: &vio::UciSender) {

    while let Some(msg_r) =  msg_stream.next().await {
        if let Ok(msg) = msg_r {
            log_message(&msg);
            msg_handler.handle_msg(engine.as_ref(), &msg, msg_sender);
        } else {
            log_error(msg_r.err().unwrap());
        }
    }

}

msg_stream参数是您接收到的消息流 - 入站通道的接收端,或者是入站通道声明中的irx变量。msg_sender是出站通道的发送端,您将在此处发送UCI消息,或者是出站通道声明中的otx

最后,也是最重要的,在您的main函数中异步运行stdin/stdout读取/写入循环(vio::run_std_loops异步函数)以及您的process_message处理程序,使用join!宏。

vio::run_future(async {

        vio::join!(vio::run_std_loops(itx, orx), process_cmd(engine2, msg_stream, &msg_handler, &otx));
});

后端基础设施和未来开发

后端基础设施更加通用,允许使用其他流和汇(例如TCP套接字)传递消息,而不仅仅是stdin和stdout。然而,由于所有这些异步内容都是新的,目前Rust中的这些内容都非常不稳定,因此这个crate目前尚未准备好或稳定到足以公开底层API。尽管如此,您仍然可以浏览源代码

变更日志

0.3.0

  • 不再需要nightly rust,因为异步支持已被添加到稳定版本。
  • async-std升级到1.5,将futures升级到0.3。
  • vampirc-uci修复到0.9。

0.2.1

  • 支持async-std 0.99.7。

依赖项

~7–17MB
~240K SLoC