#go #protocols #baduk #weiqi

gtp

Rust 的 GTP (Go Text Protocol) 控制器实现

3 个版本

0.1.2 2021年8月11日
0.1.1 2019年6月14日
0.1.0 2019年6月13日

#1112解析器实现

GPL-3.0-or-later

55KB
931

A GTP (Go Text Protocol) controller implementation for Rust

此包实现了一个 GTP (Go Text Protocol) 解析器、序列化器以及一个 GTP 引擎控制器的抽象。如果您有替代的 GTP 引擎控制器实现,您可以仅使用协议处理部分。但您也可以自由使用此包提供的实现。

另请参阅

用法

关于此包 API 的简要概述。

与 GTP 引擎通信

这是与像 GNU GoLeela ZeroKataGo 这样的 GTP 引擎通信的基本用法。

use std::time::Duration;
use gtp::Command;
use gtp::controller::Engine;

let mut ctrl = Engine::new("/usr/bin/gnugo", &["--mode", "gtp"]);
assert!(ctrl.start().is_ok());

ctrl.send(Command::cmd("name", |e| e));
let resp = ctrl.wait_response(Duration::from_millis(500)).unwrap();
let ev = resp.entities(|ep| ep.s().s()).unwrap();
assert_eq!(ev[0].to_string(), "GNU");
assert_eq!(ev[1].to_string(), "Go");
assert_eq!(resp.text(), "GNU Go");

编码 GTP 命令和解码 GTP 响应

发送命令

use gtp;
let mut c = gtp::Command::new("list_commands");
assert_eq!(c.to_string(), "list_commands\n");

使用实体发送命令

use gtp::Command;
assert_eq!(Command::new("clear_board").to_string(), "clear_board\n");
assert_eq!(Command::new_with_args("boardsize", |eb| eb.i(19)).to_string(),
           "boardsize 19\n");

接收响应

let mut rp = gtp::ResponseParser::new();
rp.feed("= o");
rp.feed("k\n\n");
rp.feed("= A\nB\nC\n\n= white b3 b T19\n\n");

assert_eq!(rp.get_response().unwrap().text(), "ok");
assert_eq!(rp.get_response().unwrap().text(), "A\nB\nC");

// And processing entities in the response:
let ents = rp.get_response().unwrap()
             .entities(|ep| ep.color().vertex().mv()).unwrap();
assert_eq!(ents[0].to_string(), "w");
assert_eq!(ents[1].to_string(), "B3");
assert_eq!(ents[2].to_string(), "b T19");

// And processing entities in the response more complicatedly:
rp.feed("= white b3\n\n");

let mut ep = gtp::EntityParser::new(&rp.get_response().unwrap().text());
let res = ep.mv().result().unwrap();
assert_eq!(res[0].to_string(), "w B3");

match res[0] {
    gtp::Entity::Move((color, (h, v))) => {
        assert_eq!(color, gtp::Color::W);
        assert_eq!(h, 2);
        assert_eq!(v, 3);
    },
    _ => {},
}

许可协议

本项目受 GNU 通用公共许可证第 3 版或更高版本许可。

为什么选择 GPL?

选择代码的许可证困扰了我很长时间。我阅读了许多关于这个主题的讨论。阅读许可证说明。并与其他开发者讨论了这个问题。

首先,关于 我为什么要免费编写代码

  • 编写计算机程序是我的激情所在。在空闲时间,我可以按照自己的意愿、时间和方式编写代码。我可以自由分配我的时间,并自由选择我想工作的项目。
  • 帮助朋友或家人。
  • 解决我遇到的问题。

这些都是我免费编写代码的原因。现在,当我可以选择保留代码时,我 发布代码 的原因

  • 以便它可以为用户和自由软件社区带来价值。
  • 作为艺术家展示我的作品。
  • 与其他开发者取得联系。
  • 并且这是我对我的私人项目进行更多润色的一个很好的改变。

其中大多数原因还不能证明 GPL 的必要性。GPL 的主要点是:GPL 确保软件永远保持自由软件。软件的使用者始终处于控制地位。用户至少有 手段 将软件适应新的平台或用例。即使原始作者不再维护该软件。最终防止了 "供应商锁定"。我真的很讨厌供应商锁定,尤其是作为开发者。尤其是作为开发者,我想并且需要保持对我使用的计算机的控制。

另一个观点是,我的作品具有价值。如果我不附带任何条件地放弃我的作品,我实际上是在免费工作。免费为公司工作。我会降低我技能、劳动力和时间的价格。

这让我有两个选择GPL的理由

  1. 我不希望支持供应商锁定,至少不免费支持。我希望在有机会的时候阻止这种情况。在你问之前,是的,我在一家销售闭源软件的公司工作。我对闭源的事实并不满意。但这是我的收入来源,它让我在空闲时间可以自由地编写免费软件。
  2. 我不想通过赠送无附加条件的免费软件来降低自己的工资和价格(对于公司来说)。

如果您需要许可宽松或私人许可(MIT)

如果您需要其他许可并真的想使用我的代码,请与我联系。只要我是唯一的作者,我可以更改许可。我们可能会达成协议。

贡献

除非您明确表示,否则您故意提交以包含在gtp-rs中的任何贡献,应按照GPLv3或更高版本许可,不附加任何其他条款或条件。

作者

  • 奇构造者 [email protected] (您可以在Rust Discord上找到我作为 WeirdConstructor

无运行时依赖