“创建游戏”的版本间的差异
(→一 裁判程序) |
(→如何提交) |
||
(未显示同一用户的15个中间版本) | |||
第9行: | 第9行: | ||
Bot收到输入后在限制时间内思考并给出输出,然后退出。 | Bot收到输入后在限制时间内思考并给出输出,然后退出。 | ||
− | 当控制器收到所有这些被通知的Bot和/或人类玩家的输出后,它将这些信息汇总并交给裁判,裁判根据游戏规则分析后给出第二回合的输出,如此往复。 | + | 当控制器收到所有这些被通知的Bot和/或人类玩家的输出后,它将这些信息汇总并交给裁判,裁判根据游戏规则分析后给出第二回合的输出,如此往复。 |
+ | |||
+ | 见[https://wiki.botzone.org.cn/index.php?title=Botzone Botzone] | ||
= 交互内容 = | = 交互内容 = | ||
第21行: | 第23行: | ||
== 一 裁判程序 == | == 一 裁判程序 == | ||
− | + | 用来接受Bot或者玩家给出的输出并根据游戏规则给出下一回合相应玩家需要的输入,以及提供播放器可视化所需的信息 | |
更为详细的介绍可参考[https://wiki.botzone.org.cn/index.php?title=%E8%A3%81%E5%88%A4 裁判] | 更为详细的介绍可参考[https://wiki.botzone.org.cn/index.php?title=%E8%A3%81%E5%88%A4 裁判] | ||
第82行: | 第84行: | ||
==== initdata ==== | ==== initdata ==== | ||
− | "initdata"域 | + | "initdata"域 为游戏的全局初始化信息(可选),如麻将游戏中初始的牌堆信息 |
+ | |||
+ | === 裁判应该给出的输出 === | ||
+ | |||
+ | 如果游戏继续,应给出: | ||
+ | |||
+ | <syntaxhighlight lang="javascript"> | ||
+ | { | ||
+ | "command": "request", | ||
+ | "content": { | ||
+ | "0": ... // 要运行的玩家和给它的request | ||
+ | }, | ||
+ | "display": ... // 给播放器的信息,可以是JSON对象 | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | 如果游戏结束,应给出: | ||
+ | |||
+ | <syntaxhighlight lang="javascript"> | ||
+ | { | ||
+ | "command": "finish", | ||
+ | "content": { | ||
+ | "0": 1, // 每个玩家的分数 | ||
+ | "1": 2 | ||
+ | }, | ||
+ | "display": ... // 给播放器的信息,可以是JSON对象 | ||
+ | } | ||
+ | </syntaxhighlight> | ||
== 二 网页播放器 == | == 二 网页播放器 == | ||
第88行: | 第118行: | ||
根据裁判程序提供的信息将游戏进程进行可视化,其输入对应裁判程序输出的 “display”域 | 根据裁判程序提供的信息将游戏进程进行可视化,其输入对应裁判程序输出的 “display”域 | ||
− | Botzone通过[https://botzone.org.cn/gameplayers/player_api.js?v2! API] | + | Botzone通过[https://botzone.org.cn/gameplayers/player_api.js?v2! API]提供播放器与网页交互的接口,包括原有版本和新的v2版本, |
这里推荐使用交互更加简洁的v2版本。 | 这里推荐使用交互更加简洁的v2版本。 | ||
− | === | + | === 需要实现的接口 === |
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
第111行: | 第141行: | ||
requestCallback(log)函数的参数log为裁判给人类玩家的request, | requestCallback(log)函数的参数log为裁判给人类玩家的request, | ||
− | 你需要在这里实现在实时对局中轮到自己(人类玩家)的时候的处理逻辑:读取上一回合玩家/ | + | 你需要在这里实现在实时对局中轮到自己(人类玩家)的时候的处理逻辑:读取上一回合玩家/Bot的行为(log)并接受人类玩家通过鼠标/键盘的输入(这里不要进行任何可视化),将之转换为JSON格式的response,最后调用infoProvider.notifyPlayerMove(response)函数通知裁判人类玩家的行为(response) |
==== setMinsize ==== | ==== setMinsize ==== | ||
第118行: | 第148行: | ||
==== notifyInitComplete ==== | ==== notifyInitComplete ==== | ||
− | 放在$(document).ready(function() | + | 放在$(document).ready(function()函数的末尾,用以通知控制器网页播放器已经初始化完成 |
=== 动画 === | === 动画 === | ||
− | + | 为支持游戏过程的进度条回放功能,在可视化时需要用[https://greensock.com/docs/v2/TimelineMax TimeLineMax]库将游戏过程(动画)的每一个阶段保存起来。tl对象可通过 | |
− | |||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
第131行: | 第160行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 创建,然后使用tl.set, tl.to, tl.call等函数构建动画 | |
== 三 样例程序/wiki == | == 三 样例程序/wiki == | ||
第139行: | 第168行: | ||
= 如何提交 = | = 如何提交 = | ||
− | 通过讨论区/私信/ | + | 通过讨论区/私信/QQ群联系Bot管理员,管理员为你创建好游戏后可在游戏管理页面选择该游戏,然后提交准备好的三个材料。 |
− | + | 当调试完成游戏可正常使用后,勾选“公开”可使游戏出现在Botzone的游戏列表里,其他用户就可以看到该游戏并创建自己的bot | |
= 参考材料 = | = 参考材料 = | ||
− | + | Botzone现有游戏的裁判程序可以在游戏详情页看到,网页播放器在 https://botzone.org.cn/gameplayers/ 目录下,如Gomoku游戏的播放器为 https://botzone.org.cn/gameplayers/Gomoku.html | |
− | |||
− |
2022年2月2日 (三) 21:28的最新版本
目录
准备
为在Botzone上创建新的游戏,你需要了解基本的C++11(以上)/python和javascript/css编程知识,并明确你所要创建的游戏的全部规则
Botzone的运行逻辑
Botzone上对局进行时,网站控制器会首先运行裁判程序,裁判给出第一回合的输出,然后退出,接下来控制器根据裁判的输出决定运行哪个Bot或通知哪个人类玩家,给出其相应的输入。
Bot收到输入后在限制时间内思考并给出输出,然后退出。
当控制器收到所有这些被通知的Bot和/或人类玩家的输出后,它将这些信息汇总并交给裁判,裁判根据游戏规则分析后给出第二回合的输出,如此往复。
交互内容
裁判程序-播放器-Bot之间使用JSON交互格式的字符串进行交互
在每次对局开始时,Botzone会对所有参与游戏的Bot/人类玩家从0开始进行编号,给出每个参与者的id
你需要准备三个部分
一 裁判程序
用来接受Bot或者玩家给出的输出并根据游戏规则给出下一回合相应玩家需要的输入,以及提供播放器可视化所需的信息
更为详细的介绍可参考裁判
裁判得到的输入
裁判每次得到的输入为一个JSON对象,包含 “log” 和 “initdata” 两个域
{
"log" :
[
{
"output": {
"content": {
"0": {
"x0": -1,
"x1": -1,
"x2": -1,
"y0": -1,
"y1": -1,
"y2": -1
}
},
"display": {
"blackCount": 1232,
"whiteCount": 1232
},
...
},
...
},
{
"0": {
"debug": "",
"response": {
"x0": 5,
"y0": 0,
"x1": 5,
"y1": 6,
"x2": 2,
"y2": 3
},
...
}
},
...
],
"initdata" : ""
}
log
“log”域 为一个字典列表,代表游戏过程中裁判和bot的历史输出内容
其中偶数下标[0,2,4...]对应裁判提供给Bot/玩家和播放器的输入,其中 “content”域 为给Bot/玩家的输入,id为应得到输入玩家/Bot的编号;“display”域 为提供给播放器的输入
奇数下标[1,3,5...]对应玩家给出的输出,其中 “id” 为给出输出的玩家的编号
initdata
"initdata"域 为游戏的全局初始化信息(可选),如麻将游戏中初始的牌堆信息
裁判应该给出的输出
如果游戏继续,应给出:
{
"command": "request",
"content": {
"0": ... // 要运行的玩家和给它的request
},
"display": ... // 给播放器的信息,可以是JSON对象
}
如果游戏结束,应给出:
{
"command": "finish",
"content": {
"0": 1, // 每个玩家的分数
"1": 2
},
"display": ... // 给播放器的信息,可以是JSON对象
}
二 网页播放器
根据裁判程序提供的信息将游戏进程进行可视化,其输入对应裁判程序输出的 “display”域
Botzone通过API提供播放器与网页交互的接口,包括原有版本和新的v2版本, 这里推荐使用交互更加简洁的v2版本。
需要实现的接口
$(document).ready(function() {
infoProvider.v2.setDisplayCallback(displayCallback);
infoProvider.v2.setRequestCallback(requestCallback);
infoProvider.v2.setMinSize(600, 0);
infoProvider.v2.notifyInitComplete();
});
displayCallback
displayCallback(log)函数的参数log为裁判程序输出的 “display”域,控制器在得到裁判给播放器的输入后会调用这个函数,你需要在这个函数中将log的信息(即玩家/Bot的行为)可视化出来
requestCallback
requestCallback(log)函数的参数log为裁判给人类玩家的request, 你需要在这里实现在实时对局中轮到自己(人类玩家)的时候的处理逻辑:读取上一回合玩家/Bot的行为(log)并接受人类玩家通过鼠标/键盘的输入(这里不要进行任何可视化),将之转换为JSON格式的response,最后调用infoProvider.notifyPlayerMove(response)函数通知裁判人类玩家的行为(response)
setMinsize
设置展示区域最小宽度和高度
notifyInitComplete
放在$(document).ready(function()函数的末尾,用以通知控制器网页播放器已经初始化完成
动画
为支持游戏过程的进度条回放功能,在可视化时需要用TimeLineMax库将游戏过程(动画)的每一个阶段保存起来。tl对象可通过
tl = new infoProvider.v2.TimelineMax()
创建,然后使用tl.set, tl.to, tl.call等函数构建动画
三 样例程序/wiki
介绍游戏规则并给出一个简单的样例Bot,建议在Botzone-Wiki创建相应的游戏词条,然后在游戏详情页提供对应的链接
如何提交
通过讨论区/私信/QQ群联系Bot管理员,管理员为你创建好游戏后可在游戏管理页面选择该游戏,然后提交准备好的三个材料。 当调试完成游戏可正常使用后,勾选“公开”可使游戏出现在Botzone的游戏列表里,其他用户就可以看到该游戏并创建自己的bot
参考材料
Botzone现有游戏的裁判程序可以在游戏详情页看到,网页播放器在 https://botzone.org.cn/gameplayers/ 目录下,如Gomoku游戏的播放器为 https://botzone.org.cn/gameplayers/Gomoku.html