裁判程序可以选用C(不推荐)、C++、Java(不推荐)、JavaScript、Python编写,评测机与裁判程序间使用JSON进行通信。
裁判程序首先需要输出内容给评测机,然后再接受评测机的输入,一个通常的示例如下:
1 | { |
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]
。
再看另一个例子:
1 | { |
这条输出意味着游戏已结束,bot0得分为1
,bot1得分为0
,向回放程序发送"{\”gamer\”:0,\”x\”:9,\”y\”:6,\”winner\”:0,\”error\”:\”\”,\”map\”:[[…]]}"
在向评测机发送request请求后,裁判程序即应立即等待下一次输入。一个输入的例子:
1 | { |
输出的content
有哪些bot,输入的内容就有哪些bot的输出。
verdict
为bot的状态,只有为"OK"
时其状态才正常,如果不是"OK"
,请将其判负。可能值包括:TLE
(超时)、MLE
(超内存)、NJ
(评测机未输出)、RE
(运行时错误)、CE
(编译错误)、SE
(评测机错误)、NR
(bot未输出)
raw
为bot的输出。
请注意以上的所有例子都进行了格式化,实际上传输的文本是没有这些空白字符的,例如:
1 | 输入> {"0":{"verdict":"OK","raw":"6 9"}} |
这两种语言提供了JSON解析的官方库,请参见MDN的官方文档与Python的官方文档。
使用了nlohmann/json用于JSON解析,下载最新版的json.hpp,将其放于裁判程序目录下的nlohmann子目录内即可使用。
没有用于 JSON 解析的官方库,也没有预装任何的第三方库,因此强烈不建议使用。
可以手动输入JSON进行调试:
1 | 输出> {"command":"request","display":"{\"gamer\":1,\"x\":-1,\"y\":-1}","content":{"0":"-1 -1"}} |
稍后我也许会上线一个自动化的调试模块,敬请期待!