裁判程序可以选用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"}} |
稍后我也许会上线一个自动化的调试模块,敬请期待!