五子棋 · 连成五子背后的平衡难题
五子棋 (gomoku / 连珠 renju) —— 15×15 棋盘, 黑先手, 双方轮流落子在交叉点上, 谁先把己方棋子连成横 / 竖 / 斜任意一条恰好五子的线即胜。规则一句话说完, 难点却不在规则, 而在一个不舒服的事实:先手太强了。
本系列从这件事拆开:先上手玩一局 (规则可切换 / 对战启发式 AI);看规则全景讲清自由规则为何先手必胜、连珠与 Swap2 两条平衡路线各自的取舍;再单独盯黑棋禁手的三三 / 四四 / 长连怎么判;最后用 WebRTC 搭一个无需自建后端也能两台设备真对战的联机版。与同被「完全解出」一类的 井字棋 互为对照:那里双方最优必和, 这里先手却必胜 —— 于是才需要从规则层面打补丁。
上手玩:规则可切换的对局
系列的入口体验。一个能下的 15×15 棋盘,在自由 / 连珠禁手 / Swap2 开局三套规则间切换感受差别;可本地双人轮流落子,或对战一个启发式 AI。胜负即时判定并高亮连成的那条五连线,连珠规则下还能标出黑的禁手点。
规则全景:为什么要给黑棋打补丁
难点不在规则在先手:1994 年 Allis 用威胁空间搜索证明了自由五子棋先手必胜。要让对局重新值得一玩,必须从规则层面削弱先手——连珠(只罚黑)、Swap2(对称化)、指定开局三套手段对照,并交互演示 Swap2 的选边流程。
黑棋禁手:三三 / 四四 / 长连
连珠规则只约束黑:走出两个活三(三三)、两个四(四四) 或六子以上的长连即判负,白棋无禁手。逐类摆出标准局面看判定边界,还有「成五优先于禁手」的特例,以及一个自由落黑子、实时标出全部禁手点的探索沙盒。
联机对战:无后端的 P2P 实现
playground 是纯静态站点、没有后端,联机却仍可行:用 WebRTC 在两个浏览器间直接建 RTCDataChannel,落子点对点传输。信令 (offer / answer) 不自建服务器,改为手动复制粘贴一段编码,房主选定规则后落子 / 重开实时同步。
延伸阅读
- Gomoku — Wikipedia en.wikipedia.org 五子棋的规则、变体 (free-style / standard / renju) 与「自由规则先手必胜」的结论。
- Renju — Wikipedia en.wikipedia.org 连珠规则的禁手定义 (三三 / 四四 / 长连只罚黑) 与现代赛事的开局平衡手段。
- Swap2 opening — Wikipedia en.wikipedia.org Swap2 (交换开局) 协议:先手摆三子后由对方选边或加子换手, 靠对称化抹平先手优势。
- RTCDataChannel — MDN developer.mozilla.org 浏览器间点对点数据通道的标准 API;联机页用它在两个 peer 之间直接传落子, 无需服务器中转。