#engine #shogi #protocols #command #board-game #communication #game-engine

usi

一个用于与USI兼容的将棋引擎进行类型安全通信的库

9个版本 (5个重大更新)

0.6.2 2022年6月6日
0.6.1 2021年12月26日
0.6.0 2021年10月3日
0.4.0 2020年11月14日
0.1.0 2017年5月13日

#749 in 游戏开发


用于 usi-run

MIT 许可证

44KB
919

usi-rs

Github Actions Coverage Status crates.io docs.rs

一个用于与USI兼容的将棋引擎进行类型安全通信的库。USI协议定义了从GUI或引擎发送的命令。有关USI协议的详细信息,请参阅http://www.geocities.jp/shogidokoro/usi.html

文档

用法

表示USI协议中定义的命令的数据类型

GuiCommand和EngineCommand代表协议中定义的输入/输出命令。

示例

use std::time::Duration;
use usi::{GuiCommand, ThinkParams, EngineCommand, BestMoveParams};

// GuiCommand can be converted into the USI compliant string.
let params = ThinkParams::new().btime(Duration::from_secs(1)).wtime(Duration::from_secs(2));
let cmd = GuiCommand::Go(params);
assert_eq!("go btime 1000 wtime 2000", cmd.to_string());

// EngineCommand can be parsed from the command string sent from the USI engine.
let cmd = EngineCommand::parse("bestmove 7g7f ponder 8c8d").unwrap();
match cmd {
    EngineCommand::BestMove(BestMoveParams::MakeMove(ref m, Some(ref pm))) => {
        assert_eq!("7g7f", *m);
        assert_eq!("8c8d", *pm);
    },
    _ => unreachable!(),
}

与USI引擎进程协同工作

可以使用UsiEngineHandler来创建USI引擎进程。您可以发送GuiCommands并接收EngineCommand。

示例

use usi::{BestMoveParams, Error, EngineCommand, GuiCommand, UsiEngineHandler};

let mut handler = UsiEngineHandler::spawn("/path/to/usi_engine", "/path/to/working_dir").unwrap();

// Get the USI engine information.
let info = handler.get_info().unwrap();
assert_eq!("engine name", info.name());

// Set options.
handler.send_command(&GuiCommand::SetOption("USI_Ponder".to_string(), Some("true".to_string()))).unwrap();
handler.prepare().unwrap();
handler.send_command(&GuiCommand::UsiNewGame).unwrap();

// Start listening to the engine output.
// You can pass the closure which will be called
//   everytime new command is received from the engine.
handler.listen(move |output| -> Result<(), Error> {
    match output.response() {
        Some(EngineCommand::BestMove(BestMoveParams::MakeMove(
                     ref best_move_sfen,
                     ref ponder_move,
                ))) => {
                    assert_eq!("5g5f", best_move_sfen);
                }
        _ => {}
    }
    Ok(())
}).unwrap();
handler.send_command(&GuiCommand::Usi).unwrap();

许可证

usi-rs 使用MIT许可证。请阅读此仓库中的LICENSE文件以获取更多信息。

依赖项

~0.7–1.2MB
~26K SLoC