Skip to content
linjunhalida edited this page Dec 1, 2011 · 3 revisions

整体架构

一个图示:

game server --zeromq---- web_server ---http-- 基于http的ai
                     |               |
                     |               --websocket---- snakechallenge.org website
                     |                           |
                     |                           --- 基于websocket的ai
                     --- 基于zeromq的ai
                     |
                     --- pygame本地显示
                     |
                     --- 录像功能
  • 游戏引擎(game_server), web服务器(web_server), 参与者的AI都分开做不同的进程.
  • 如果在本机运行, 所有的跨进程操作都利用zeromq.
  • 如果接入web, 需要执行一个web_server, 来给利用web接口的ai做服务.
  • snakechallenge网站是用rails, 页面内嵌websocket, 其实也是调用web_server的功能.

zeromq接口

game_server提供/tmp/game_puber.ipc, /tmp/game_oper.ipc 2个队列(采用zeromq), oper队列是REP类型的, 接收来自客户端的请求, puber队列是PUB类型的, 当游戏进行了一轮之后, 会在这个队列发布当前地图的信息.

通讯方式

AI可以通过2种方式接入, 本地机器的话, 可以用zeromq队列接入, 或者通过web server中转, 通讯方式虽然不同, 具体API还是一致的.

zeromq方式

  • ipc:///tmp/game_puber.ipc 发布队列
  • ipc:///tmp/game_oper.ipc 操作请求队列

oper用来做操作(add/turn/map), game server会立刻返回结果,

ai发送命令的时候, 需要在数据结构里面加上"room": 房间号.

puber用来监听服务器当前状态, 一轮结束后, game server会在该队列发布info信息.

发布的info信息头部会加上 "room:0(空格)", 用来标识哪个房间的信息. ai需要自己过滤出自己的房间.

如果房间号错误, 会返回 ::

{"status": "room number error: 错误的房间号"}

web方式

访问 http://localhost/room/0/(map/info/add/turn) 就可以了.

要注意, add/turn返回的数据除了上面API部分列出来的返回数据以外, 还会附带有info数据, 示例 ::

[{"status": "ok"}, {...}]

这个过程是阻塞的, 游戏更新之后, 才会返回数据. 这样的话, 客户端就变成一问一答的方式, 比较好实现.

Clone this wiki locally