Skip to content
halida edited this page Dec 11, 2011 · 11 revisions

接口类型

http接口

所有指令都用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

websocket接口

因为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) 

可以看 https://github.com/halida/snake-challenge/blob/master/rubyweb/app/assets/javascripts/room.coffee

API接口

API分为多个方法: map/add/turn/sprint/info, 发送数据和接收数据都采用json格式(除了上面http方式发送采用argument).

add

添加新的蛇, 发送数据:

{"name": 蛇的名称(你自己取一个), "type": "python" 或者 "ruby"}

接受到的数据:

{
  "seq": 0,   // 当前蛇的顺序(下面info里面snakes的位置)
  "id": "???" // 蛇的ID, 用来在发送控制命令的时候做验证.
}

如果出现错误, 会返回:

{
  "status": 错误信息,
}

错误信息有:

  • 蛇type错误: snake type error
  • 数量已满: no place for new snake.

turn

控制蛇方向, 发送数据:

{
  "id": 蛇ID(add的时候获取到的),
  "direction": 蛇头的方向(0-4分别对应: 左上右下),
  "round": 对应的回合数, 如果和当前回合不一致, server会丢弃该命令, 防止超时. 如果-1的话不做检查. 建议返回-1, 因为http通讯可能会有延迟...
}

返回:

{
  "status": 结果,
}

结果:

  • ok: 操作成功
  • id错误: noid
  • 超时了, 当前轮数不正确: round error, current round: %d
  • 蛇不能往后面退: noturnback

sprint

让蛇冲刺, 不发送其他数据. 返回:

{
  "status": "ok"
}

map

获取游戏的地图, 不发送其他数据, 返回:

{
  "walls": [ [10, 5], ...], // 墙的位置
  "size": [ 50, 30 ], //地图大小
  "portals": [ [1, 1], [2, 2], ....], // 当前游戏中的portal位置 [[进x, 进y], [出x, 出y], .....]
}

info

获取游戏实时数据, 数据格式 :

{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)
Clone this wiki locally