3 个版本
0.1.2 | 2021年8月11日 |
---|---|
0.1.1 | 2019年6月14日 |
0.1.0 | 2019年6月13日 |
#1112 在 解析器实现
55KB
931 行
A GTP (Go Text Protocol) controller implementation for Rust
此包实现了一个 GTP (Go Text Protocol) 解析器、序列化器以及一个 GTP 引擎控制器的抽象。如果您有替代的 GTP 引擎控制器实现,您可以仅使用协议处理部分。但您也可以自由使用此包提供的实现。
另请参阅
用法
关于此包 API 的简要概述。
与 GTP 引擎通信
这是与像 GNU Go
、Leela Zero
或 KataGo
这样的 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的理由
- 我不希望支持供应商锁定,至少不免费支持。我希望在有机会的时候阻止这种情况。在你问之前,是的,我在一家销售闭源软件的公司工作。我对闭源的事实并不满意。但这是我的收入来源,它让我在空闲时间可以自由地编写免费软件。
- 我不想通过赠送无附加条件的免费软件来降低自己的工资和价格(对于公司来说)。
如果您需要许可宽松或私人许可(MIT)
如果您需要其他许可并真的想使用我的代码,请与我联系。只要我是唯一的作者,我可以更改许可。我们可能会达成协议。
贡献
除非您明确表示,否则您故意提交以包含在gtp-rs中的任何贡献,应按照GPLv3或更高版本许可,不附加任何其他条款或条件。
作者
- 奇构造者 [email protected] (您可以在Rust Discord上找到我作为
WeirdConstructor
)