使用flask编写的主辅棋服务器。目前实现对接的客户端有:
- 商弦Minecraft服务器棋牌室:支持人人对战、棋谱回放
- 安装依赖
flask和ulid-py; - 使用
python app.py在http://localhost:2010启动服务器; - 使用
GET请求访问服务器。
初始化棋局:/api?act=start
局面存储在服务端game/<id>.json中。返回值示例:
{
"id": "01JS0S6XEPB87GPXVVSPFD1WJV", //棋局编号,ULID格式
"board": [
[2,1,0,0,0,1],
[1,0,0,0,0,0],
[0,0,0,0,0,0],
[0,0,0,0,0,0],
[0,0,0,0,0,1],
[1,0,0,0,1,3]
], //棋盘,0:空格,1:辅子,2:黑主,3:白主
"hand": [11, 11], //[黑方持子, 白方持子]
"turn": 2, //是谁的回合,2:黑,3:白
"legal": [ [0,2], [2,0] ], //主子可移动到的坐标
"hist": [], //历史行动,棋谱字符串形式
"res": 0 //对局结果,0:进行中,2:黑胜,3:白胜
}放置辅子于a3:/api?id=<id>&act=move&move=+a3
- 若行动非法,返回
not empty or none left。
移动主子至c1:/api?id=<id>&act=move&move=-c1或/api?id=<id>&act=move&move==c1
move=-c1(移动到c1空格)与move==c1(移动到c1并吃子)效果相同;返回值会自动修正为正确棋谱;- 若行动非法,返回
illegal move; - 若胜利,体现在返回值
res中; - 返回值示例:
{"id": "01JS0S6XEPB87GPXVVSPFD1WJV", "board": [[0, 1, 2, 0, 0, 1], [1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 3]], "hand": [11, 11], "turn": 3, "legal": [[5, 3], [3, 5]], "hist": ["-c1"], "res": 0}以字符画形式画出当前局面:/api?id=<id>&act=draw
- 显示效果(实际为
<br>换行):
⬜⬛⚫⬜⬜⬛
⬛⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬛⚪
以字符画形式画出合法移动:/api?id=<id>&act=showlegal
- 显示效果(实际为
<br>换行):
⬜⬛⚫⬜⬜⬛
⬛⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜🟩
⬜⬜⬜⬜⬜⬛
⬛⬜⬜🟩⬛⚪
根据存储的棋谱,以JSON形式返回每一手的局面:/api?id=<id>&act=replay
- 返回值示例:
{
"hist": ["-c1"],
"res": 0,
//数组,每个元素为一手的局面
"states": [
{
"board": [
[2, 1, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 3]],
"hand": [11, 11]
},
{
"board": [
[0, 1, 2, 0, 0, 1],
[1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 3]],
"hand": [11, 11]
}
]
}以字符画形式画出棋局回放:/api?id=<id>&act=replay&draw=1
- 显示效果(实际为
<br>换行):
⚫⬛⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬛⚪
⬜⬛⚫⬜⬜⬛
⬛⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬛⚪
- 未实现无子可动判和的规则;
- 不支持人机对战。