Roka:一个可以自己写 Bot 对战的实时领土战争游戏
游戏地址:https://roka.oim.moe:444/
开源仓库:https://github.com/oimasterkafuu/roka (AGPL-3.0)
本文在人类引导和审核的前提下,较大部分内容通过 AI 生成或编辑。
这是什么
Roka 是一个实时方格领土战争游戏,玩法上致敬 generals.io:你和若干名玩家(或 Bot)各自从一座主城起家,每 0.5 秒一个 Tick,主城持续产兵,你用 WASD 把兵力推向四面八方,占地、筑城、切断对手,最后活下来的队伍获胜。
但 Roka 不是 generals.io 的复刻。在熟悉的规则骨架之下,它有一套相当独特、也更有博弈深度的核心机制,外加一个对开发者极其友好的 Bot 生态——这也是我写这篇文章、向各位 OIer 安利它的原因。
核心机制:连通块就是生命线
Roka 最有意思的设计是 「连通与孤军」机制:
- 你的格子只要能通过连续的己方领土四方向连通到任意一座己方主城或指挥所,就是「正常领土」,正常产兵、正常行动。
- 一旦这条链被敌人拦腰切断,断开的部分立刻沦为「孤军」:兵力当场减半,停止生产,无法推兵、无法建造,宽限期一过还会每回合衰减 5%,直到归零变成中立荒地。
- 反过来,如果你能把孤军重新接回己方网络,每格兵力立即翻倍(也就是恢复。特殊地,如果原本是 1 兵力,那么它将会变成 2)。
这一条规则彻底改变了游戏的战略结构。在 generals.io 里,最优策略往往收敛于「攒兵堆一波流」;而在 Roka 里,切断比歼灭更致命——一支深入敌后的小分队,只要精确地切在对方领土的咽喉割点上,就能让对手大后方成片领土瞬间减半、瘫痪、腐烂,其破坏力远超同等兵力的正面硬推。防御方则必须时刻维护自己领土的连通性:什么时候补第二座主城做冗余锚点,哪个走廊是死都不能丢的咽喉,都是每 0.5 秒就要重新回答的问题。
围绕连通机制,Roka 还有一整套配套的规则设计:
- 建筑系统:消耗 50 兵在己方领土上建指挥所(X/Q 键),指挥所可升级为主城(C/E 键)成为新的产兵点和连通锚点。城市不由地图预置,全部由玩家亲手建造——你的经济布局就是你的防线布局。
- 爆发期:第 26~50 Tick 是全局爆发期,所有普通领土每 Tick 额外 +1 兵。开局 13 秒的这段窗口是扩张的黄金时间,地图边缘会泛起逐渐减弱的红边提醒你:窗口正在关闭。
- 三种推兵模式:WASD 全兵推、Z 半兵、Shift+WASD 智能分兵(自动留下恰好能防住其他方向偷袭的兵力)。操作精度直接决定战线质量。
- 最后主城决胜制:失去所有主城才出局;出局者的领土不转移、不折半,全部沦为孤军衰减消亡——不存在「吞并尸体滚雪球」,斩首的收益是让对方瘫痪而非让自己暴富。
- 迷雾远征模式(可选):视野外全是「山+问号」的未知格,敌方建筑身份不可见,把信息博弈拉回 generals.io 的硬核原味。
重点:这里是一个算法竞技场
如果只是一个对战游戏,我不会投稿到洛谷。Roka 真正让我想安利给大家的,是它的 Bot 开发生态——它本质上是一个披着游戏外衣的实时策略算法竞赛平台。
第一,协议完全开放,文档极其详尽。 https://roka.oim.moe:444/develop/bot(需要登录)是 Bot 协议的权威文档:握手鉴权、房间事件、回合事件、格子编码表(山脉 201、中立 200、主城 owner+100……)、可发送操作集、增量帧合并方法、常见坑,全部成文。你只需要一个 socket.io-client,几十行代码就能让自己的程序连进服务器、进房、准备、走子。
第二,官方提供了三个难度递进的 Bot 模板,本身就是很好的教学材料:
random-patch-bot:最小协议参考实现。进房、自动准备、维护 diff 地图、每回合随机走子。看懂它,你就掌握了全部协议。simple-strategy-bot:一个正经的综合策略 Bot,代码组织得非常教科书——strategy.js做管线编排,bot/目录下是一组纯函数决策模块:棋盘视图与距离场、Dijkstra 威胁推演、咽喉割点识别与双层危险场驻军、孤军走廊救援、皇冠经济建设、多源兵力汇集后勤、开局发育的逐 tick 模拟规划。你会发现这里面的每一个模块都是熟悉的算法在实时场景下的变体:BFS/最短路、割点分析、贪心、模拟、风险评估。anti-human-bot:我新制作的 AI,自带离线训练管线,演示了同一协议下完全不同的架构思路。
第三,服务端可以托管你的 Bot。 不需要自己挂机——管理员在后台就能把策略模板作为托管 Bot 跑在服务器进程里,自动进房、自动准备、打完自动再来一局,服务器重启后自动恢复。也就是说,你写好策略提交上来,它就会 24 小时坐在房间里接受所有人挑战。托管的 Bot 需要达到一定的 Rating,更多具体要求,请联系我。
这意味着你可以:写一个贪心 Bot 试试水;把威胁建模成最短路问题;给「切不切断这条走廊」写个代价评估;或者干脆上对抗搜索、MCTS、强化学习。游戏的规则文档就是你的题面,排行榜就是你的评测机。
顺便聊聊实现:这套代码本身也值得一看
Roka 全栈开源(TypeScript + Fastify + Socket.IO,前端是无构建的原生 JS),工程上有不少值得 OIer 玩味的细节:
- 高效的回放格式:一场几百 Tick 的完整对局,存储下来只有几百字节(只是理想情况下,Bot 操作的优化效果没有这么明显)。秘诀是服务端只记录 ops-v1 紧凑操作流(无操作时段用
w n累加压缩),观看时用一个哑引擎把操作流重新喂给同一份游戏引擎逐 Tick 重放,把整场对局确定性重建出来,再编码成 RPB4 双向差分二进制流式下发。回放、地图示例、对局观测全部走这一条重建管线,一份引擎代码三处复用。 - 确定性地图生成:四种地图模式(随机、峡谷回廊 DFS 迷宫、群岛要塞、地中海)都是纯函数生成器,由
SHA-256(token)驱动 mulberry32 伪随机——同一个 token 永远生成同一张图,配合并查集做连通性校验。 - 实时网络同步:对局按
500/speedms 走 Tick 循环,广播的是 diff 帧;断线有 10 秒宽限期,重连后服务端补发全量状态无缝恢复。 - Codeforces 风格 Rating:八档段位配色、新手显示分按
\frac{1200}{2^{\text{对局数}}} 从0 逼近真实分;组队结算时队伍分按人数立方加权400\log_{10}(n^3\cdot\sum 10^{\frac{r}{400}}) ——等分 1v2 的期望胜率被压到约\frac1{17} ,避免多打少被视为均势局。公式党可以直接去src/lobby-service.ts里看结算实现。
来打一局吧
- 游玩:https://roka.oim.moe:444/ ,注册即玩(有两步教程:文字版 + 互动版,互动版里内置了一个本地迷你引擎,15 步手把手教会你)。
- 写 Bot:从
bot-template/random-patch-bot起步,读develop-bot.html协议文档,一两个小时就能让你的第一个 Bot 上场挨打。 - 看源码/提 PR:https://github.com/oimasterkafuu/roka ,AGPL-3.0,仓库里还有一份 MAP.md「项目地图」,新人也能快速定位任何模块。
服务器上常年坐着官方策略 Bot 等你挑战。能稳赢 simple-strategy-bot 的策略,放到哪儿都拿得出手——欢迎来 Roka 排行榜上留下你的颜色。
私货
这年头都来 Vibe Coding 了,请给你的 Agent 丢下这么一段话:
你现在是一名负责开发 Roka 游戏机器人的 AI 工程师。
你的任务不是简单地给出一个 Bot 示例,而是完整地研究 Roka 的游戏规则、游戏引擎、Bot API、现有机器人实现和测试环境,然后独立设计、实现、测试并迭代一个具有实际竞争力的 Roka Bot。
项目地址:
https://roka.oim.moe:444/
代码仓库:
https://github.com/oimasterkafuu/roka
请先完整阅读仓库。不要在没有理解代码的情况下直接开始写 Bot。
/goal 最终目标是创建一个可以真正参与 Roka 对局的独立 Bot。
这个 Bot 应当:
1. 能够正确连接和运行于 Roka Bot 环境。
2. 能够理解完整的游戏状态。
3. 能够进行经济、扩张、进攻、防守、运输、切断、孤军救援和建筑决策。
4. 能够根据敌人的行动动态改变策略,而不是执行固定脚本。
5. 能够处理不同地图和不同出生位置。
6. 能够在实时 Tick 制约下做出合理决策。
7. 不依赖人工每局干预。
8. 能够通过离线模拟进行大量测试。
9. 不应该只是复制现有 Bot 的代码或策略。
10. 最终目标是形成一种具有自己战略思想的 Bot。
你可以参考仓库中的现有 Bot,但必须把它们视为研究对象,而不是模板。