Leverage 对抗裁判程序编写指南

裁判程序可以选用 C(不推荐)、C++、Java(不推荐)、Javascript、Python 编写,评测机与裁判程序间使用 JSON 进行通信。

输出格式

裁判程序首先需要输出内容给评测机,然后再接受评测机的输入,一个通常的示例如下:

{
	"command": "request",
	"content": {
		"0": "0 90231849 57933430 77682741",
		"2": "2 90231849 57933430 77682741"
	},
	"display": "[90231849,57933430,77682741]"
}

command 的值只能为“request”或“finish”,前者代表向 bot 发送信息,后者代表游戏结束。

content 的值为一个对象(散列表),键为 bot 的名称(“0”、“1”、“2”、“3”等,须为字符串)。

如果 command 的值为 request,则值的内容(字符串)为指定 bot 的输入。不强制每回合每名 bot 都必须接受输入,若代表 bot 的一项不存在,则不给该 bot 输入。

如果 command 的值为 finish,则值的内容为 bot 的得分(整数),每名 bot 都必须有得分。

display 的值为一个字符串,内容可自行指定,将会每回合传给前台的回放程序。

讲解一下上述的例子:本回合游戏正常运行,向0号 bot 发送“0 90231849 57933430 77682741”,向2号 bot 发送“2 90231849 57933430 77682741”,向回放程序发送“[90231849,57933430,77682741]”。

再看另一个例子:

{
	"command": "finish",
	"display": "{\"gamer\":0,\"x\":9,\"y\":6,\"winner\":0,\"error\":\"\",\"map\":[[...]]}",
	"content": {
		"0": 1,
		"1": 0
	}
}

这条输出意味着游戏已结束,bot0得分为1,bot1得分为0,向回访程序发送“{\”gamer\”:0,\”x\”:9,\”y\”:6,\”winner\”:0,\”error\”:\”\”,\”map\”:[[…]]}”

输入格式

在向评测机发送 request 请求后,裁判程序即应立即等待下一次输入。一个输入的例子:

{
	"0": {
		"verdict": "OK",
		"raw": "4 2"
	},
	"2": {
		"verdict": "OK",
		"raw": "-1 4"
	}
}

输出的 content 有哪些 bot,输入的内容就有哪些 bot 的输出。

verdict 为 bot 的状态,只有为“OK”时其状态才正常,如果不是“OK”,请将其判负。

raw 为 bot 的输出。

通信方法

请注意以上的所有例子都进行了格式化,实际上传输的文本是没有这些空白字符的,例如:

输入> {"0":{"verdict":"OK","raw":"6 9"}}

输出> {"command":"request","content":{"0":"4 4","1":"4 4"},"display":"{\"0\":\"4 4\",\"1\":\"4 4\"}"}
Javascript 与 Python

这两种语言提供了 JSON 解析的官方库,请参见 MDN 的官方文档Python 的官方文档

C++

使用了 nlohmann/json 用于 JSON 解析,下载最新版的 json.hpp,将其放于裁判程序目录下的 nlohmann 子目录内即可使用。

C 与 Java

没有用于 JSON 解析的官方库,也没有预装任何的第三方库,因此强烈不建议使用。

示例程序

戳这里以查看示例程序

如何调试裁判程序

可以手动输入 JSON 进行调试

输出> {"command":"request","display":"{\"gamer\":1,\"x\":-1,\"y\":-1}","content":{"0":"-1 -1"}}
输入> {"0":{"verdict":"OK","raw":"7 7"}}
输出> {"command":"request","display":"{\"gamer\":0,\"x\":7,\"y\":7}","content":{"1":"7 7"}}
输入> {"1":{"verdict":"OK","raw":"6 6"}}
输出> {"command":"request","display":"{\"gamer\":1,\"x\":6,\"y\":6}","content":{"0":"6 6"}}
输入> {"0":{"verdict":"OK","raw":"7 8"}}
输出> {"command":"request","display":"{\"gamer\":0,\"x\":7,\"y\":8}","content":{"1":"7 8"}}
输入> {"1":{"verdict":"OK","raw":"7 6"}}

稍后我也许会上线一个自动化的调试模块,敬请期待!

说点什么吧

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据