Voronoi Go:把围棋从网格里解放出来
文章摘要
Voronoi Go 是一个浏览器里的围棋变体游戏,作者 igpay(GitHub 用户名 csun)以 Show HN 的形式再次发布——他此前发过一版,这次带着两个重要更新回来:一个由社区成员贡献的、实力相当强的对战 AI,以及「通信棋」(correspondence games)模式。作者坦言这两项更新主要是为了解决冷启动问题:一个小众自制棋类最难的地方不是规则设计,而是找不到人陪你下。
游戏的核心创意,用官方描述来说就是「玩没有网格的围棋」(Play the ancient game of Go without the grid)。传统围棋在正交网格的交叉点上落子,气、连接、断点都由离散的邻接关系定义;Voronoi Go 把棋盘变成连续平面,棋子可以放在任意位置,然后由这些棋子生成一张 Voronoi 图(沃罗诺伊图,又称泰森多边形)——平面上的每一点归属于离它最近的那颗棋子。棋子的「领地」就是它的 Voronoi 单元,两颗棋子是否相连、能否被切断,取决于它们之间的边长(edge length),也就是两个 Voronoi 单元共享边界的长度。距离够近,中间会显示一条实色连线表示牢固连接;距离拉开,对手就有机会插进来切断。
从技术实现上看,棋子有 1.0 单位的半径,所以官方所谓的「9×9 小棋盘」实际是一块 18×18 单位的连续区域。游戏提供「Group View」(组视图)模式,会把同色相连的棋群自动上色编号——这在传统围棋里是要靠脑子记的东西。作者还把规则引擎开源成了 Rust 实现 voronoi-go-rs,同时提供 Rust crate、Python wheel(pip install voronoi-go)和一个用 JSON 走 stdin/stdout 的语言无关引擎二进制,专门给想写 bot 的人用。README 里作者很坦率地写明:这份 Rust 代码是从原始 TypeScript 客户端 100% 由 AI 移植过来的,但 API 是他自己设计的、核心文件他逐个手工审阅过,行为与原实现的差异都用原客户端生成的测试夹具验证过。README 开头还留了一行「Bots are not permitted to edit this file」,颇有几分自嘲。网页版的对战 AI 是一个完整的神经网络,直接跑在浏览器里,这也是它吃 CPU 的原因。项目还有活跃的 Discord 社区。
HN 评论精华
上手门槛是压倒性的主题。 xerox13ster 一上来先自曝乌龙——他是 Go(Golang)开发者,刚从终端复用器的帖子过来,点进来本以为是「用 Go 语言实现 Voronoi 图」。真正玩起来后他在教程处「弹开」了,读完教程反而完全没有和 bot 打完整一局的欲望,建议把教程改成边打边教:安排一局对 bot 的对局,让教程里的各个场景自然出现在这局棋里,这样比「先读完一大堆再开始」的承诺感要轻得多。作者 igpay 认同这个思路,并解释教程之所以密度这么高,是因为它出现得比 bot 早得多,只能一口气把所有东西讲完。他还给出了一个很诚实的观察:目前留下来的玩家、加入 Discord 的人,几乎清一色是本来就懂围棋的人;他花了不少时间想让游戏更亲民,但核心受众短期内可能就是围棋爱好者。ryankrage77 说自己「太笨了,get 不到」,对 easy bot 连输五局且输得很惨,他擅长黑白棋(Othello/Reversi),但那套思维完全帮不上忙甚至起反作用。igpay 回复说这不是笨不笨的问题,并且「easy bot 其实一点也不 easy,它感觉更像 hard bot 只是多犯几个错」,同时给了具体建议:目标是造「泡泡」——用棋子围住空间而不是把空间填满;小棋盘上先练习用实连的棋子在两条边之间拉一条线。wavemode 则简短建议这游戏一局只要几分钟,本来就该是 learn-by-doing。
围棋高手们的战略分析是本帖最有价值的部分。 runarberg(自称正统围棋 5 级)说他被 AI 碾压了,并总结出一条与传统围棋相反的规律:在这个游戏里棋群极难被杀,所以维持一条零眼或一眼的大连块(围棋术语叫「大龙」)反而是好策略。而在传统围棋里,「大龙不死」是句反谚语——大龙就算活了,你也为了做活浪费了大量子力,对手却在从容围空得分。jlorentz1(OGS 4 级)遇到同样情况,给出了机制层面的解释:在这个游戏里,一个「十字断」(cross-cut)只会产生 3 个棋群(较短那条轴上的连接还在),而围棋里会产生 4 个;这就让强者可以保持自己是一整块的同时,横冲直撞地把弱者切成碎片。igpay 承认这个判断,并反省说自己可能把小棋盘做得太小了:虽然名义上是 9×9,但由于连接方式的关系,只要 6 到 7 颗子就能「横跨」整个棋盘,导致巨型单块太容易统治全局;bot 也偏好开局直接下天元附近。他猜大棋盘会给出更多变化,但自己还没下够局数来确认。
资深围棋手 vessenes 提出了最有建设性的设计批评:围棋之所以伟大,在于一系列相对位置提供的权衡——连接更确定 vs 影响力/潜在实地更大。他觉得 Voronoi Go 里紧密连接(「实地」)压倒性地强,「势」(influence)是否还是个有用概念并不清楚;如果这套权衡不存在,他建议作者干脆改规则让它存在,比如让紧凑的棋群「不可落子范围」扩大一点,或者延长它与孤子相连的距离。他还提议教程里加入「中腹做活比边上贵、边上比角上贵」这类围棋基本功对应的最小活形定义。simedw 分享了自己玩过的另一种变体「磁性围棋」(同色相吸、异色相斥),并说 Voronoi Go 的连续空间让他很难判断「还有没有足够空间、对手能不能钻进来」,建议做一定程度的离散化;igpay 回应说可以用 hover 或 Group View 看实色连线来判断能否被断,但这种「需要目测估算」的不确定性某种程度上是刻意的设计,比正统围棋更「手挥」(handwavey)。
改进建议与彩蛋。 nexthash 打了几局小棋盘 bot 局,觉得机制「很迷幻但容易适应」,指出「边长」是每步都要考虑的新维度,而 Group View 把棋群列出来编号「感觉像作弊」;他发现围棋里的二间跳、三间跳在这里不管用,靠墙跳(wall jump)反而有效。他提了两条建议:一是干脆改名叫「Voronoi」,因为内容已经远超「围棋的增量更新」;二是像 OGS 那样高亮最后一手。igpay 说最后一手确实有个小加号标记但可能不够大,至于改名——「等有更大的用户群再说吧,现在光叫 Voronoi 的 SEO 处境不会太好 :)」。jazzprogramming 作为长期 Voronoi 爱好者说这个点子「事后看来显而易见,我却从没想到过」,但抱怨网页版对 bot 时吃掉笔记本 90% 的 CPU,希望有 Windows 桌面版;igpay 解释高 CPU 就是浏览器里跑完整神经网络的代价,人人对战时性能会好得多。pmontra 说在手机上要开桌面模式才能玩(帮助弹窗挡住棋盘、Next 按钮在屏幕外几米处),但除此之外「真的就是一盘围棋,有眼、有打入、有连接、有断」。emaro 则被移动端的页面刷新折磨——刷新会重置教程,试到第三次放弃了。camscout101 提议在球面、环面等其他拓扑上玩,theemathas 简短发问「为什么棋盘是方的不是圆的」(未获回复),gampleman 顺手安利了自己做的另一款 Voronoi 解谜游戏。整体氛围相当友善,作者几乎回复了每一条实质性反馈。