-
Notifications
You must be signed in to change notification settings - Fork 9
Api调用方法
halida edited this page Dec 11, 2011
·
11 revisions
所有指令都用POST方式发送到 snakechallenge.org:9999/cmd, 发送的数据都采用arguments的方式, 比如:
curl -d "room=0&op=map" http://game.snakechallenge.org:9999/cmd
里面room是指房间号, op是操作的类型. 就是下面说的API方法名称
得到json类型数据:
{"walls": [ ... ], "op": "map", "size": [100, 60]}
具体的示例, 见: https://github.com/halida/snake-challenge/blob/master/examples/random_snake.py
因为http方式需要轮询, 为了保持实时通讯, 提供websocket方法. 我们网站也是利用这个接口.
如果你觉得这种方式比较难编程的话, 可以只用上面的http接口就好了.
python/ruby都有对应的websocket接口库. 具体请自行寻找...
websocket的通讯方式和http方式差不多, 唯一的不同点就是, websocket连接上, 以及设置监控房间号之后, 会自动在房间信息更新的时候, 发送info信息过来. 这样客户端就不需要轮询了.
示例(coffeescript代码, 对不起, 用了coffee再也不写javascript了):
ws = new window.WS("http://snakechallenge.org:9999/info") // 这是我们网站的接口
ws.onmessage = (e)->
data = $.parseJSON(e.data) //返回来的数据是json结构, 需要解析
switch data.op // op是下面API方法名称, 这里面是对应操作的返回结果
when "info" ...
ws.onopen = ->
// 开启时, 需要设置监控什么房间, 这样服务器会自动发送对应房间的info信息.
ws.send JSON.stringify(op: 'setroom', room: room)
// 最好获取一下当前地图以供分析
ws.send JSON.stringify(op: 'map', room: room)
ws.send JSON.stringify(op: 'info', room: room)
API分为多个方法: map/add/turn/sprint/info, 发送数据和接收数据都采用json格式(除了上面http方式发送采用argument).
添加新的蛇, 发送数据:
{"name": 蛇的名称(你自己取一个), "type": "python" 或者 "ruby"}
接受到的数据:
{
"seq": 0, // 当前蛇的顺序(下面info里面snakes的位置)
"id": "???" // 蛇的ID, 用来在发送控制命令的时候做验证.
}
如果出现错误, 会返回:
{
"status": 错误信息,
}
错误信息有:
- 蛇type错误: snake type error
- 数量已满: no place for new snake.
控制蛇方向, 发送数据:
{
"id": 蛇ID(add的时候获取到的),
"direction": 蛇头的方向(0-4分别对应: 左上右下),
"round": 对应的回合数, 如果和当前回合不一致, server会丢弃该命令, 防止超时. 如果-1的话不做检查. 建议返回-1, 因为http通讯可能会有延迟...
}
返回:
{
"status": 结果,
}
结果:
- ok: 操作成功
- id错误: noid
- 超时了, 当前轮数不正确: round error, current round: %d
- 蛇不能往后面退: noturnback
让蛇冲刺, 不发送其他数据. 返回:
{
"status": "ok"
}
获取游戏的地图, 不发送其他数据, 返回:
{
"walls": [ [10, 5], ...], // 墙的位置
"size": [ 50, 30 ], //地图大小
"portals": [ [1, 1], [2, 2], ....], // 当前游戏中的portal位置 [[进x, 进y], [出x, 出y], .....]
}
获取游戏实时数据, 数据格式 :
{u'eggs': [ [9, 8], ...], // 当前游戏中的egg位置
u'gems': [ [7, 37], ...], // 当前游戏中的gem位置
u'round': 192, // 当前游戏的轮数, 600轮的时候游戏结束
u'snakes': // 当前游戏中所有蛇的信息
[{u'alive': True, // 蛇是否还活着?
u'sprint': -1 // 冲刺的状况, 0标识没有冲刺, 正数表示正在冲刺, 剩余的轮数, 负数表示休息中
u'body': [ [16, 16], // 蛇身体的位置, 第一个是蛇的头部
[16, 17],
[16, 18],
[16, 19],
[16, 20] ],
u'direction': 1, // 蛇头的方向(0-4分别对应: 左上右下)
u'length': 5, // 蛇的长度
u'name': u'simple ai2', // 蛇的名称
u'type': u'python'}, // 蛇的类型(ruby/python)
...
],
u'status': u'running'} // 当前游戏的状态(waitforplayer/running/finished)