中国象棋 · 联机对弈
一个人在美国、一个人在中国,点开一个链接就能一起下棋。
起因
想和一个在国内的朋友下象棋,但现成的 App 要么要注册、要么在两边的网络环境下都不好用。 所以自己写了一个:她只需要点开我发的链接,不注册、不安装。
做了什么
先做了一个纯前端的本地双人版本 —— 完整规则(含蹩马腿、塞象眼、将帅照面、困毙判负)、 中文记谱、悔棋回看、计时器,全部零第三方依赖。 然后在这个基础上加了联机:服务端用同一份规则引擎做权威校验, 浏览器和 Node 共用一个文件,规则不可能两边不一致。
几个有意思的地方
- 服务端永远广播完整状态,不发增量。 一局下满一百步的完整状态也就 1KB,代价可以忽略; 换来的是消息丢失、乱序、断线重连全都不需要单独处理。
- 落子是乐观更新。 跨太平洋一个来回两三百毫秒,等服务端确认再动棋子会明显发涩, 所以本地先走、再和服务端对账。
- 跨国网络是最大的约束。 Firebase 全线被墙,免费平台的默认域名在大陆也基本不通, 最后落在东京的 VPS + 自己的域名 + 443 端口上的 WSS。 另外做了「着法码手动交换」的保底方案 —— 万一服务器彻底连不上,用微信互发四个字符也能把棋下完。
- 走法生成用 perft 验证。 「开局红方恰好有 44 个合法着法」这一条用例,一次性覆盖了绝大部分走法逻辑。