你大概率在小时候玩过那种游戏:屏幕上只有几行字,你敲 go north,它告诉你前面有一扇锁着的门;你敲 look at door,它说门上有个钥匙孔。没有画面,没有音效,但你愣是在被窝里玩了一晚上。这类游戏叫文字冒险(Text Adventure),上世纪七十年代起源于大型机,80 年代跟着软盘进过千家万户,后来被 3D 画面拍死在沙滩上。
但有个叫 Benji Kay 的独立开发者不这么想。据他自己的说法,现在的浏览器已经强大到能模拟当年游戏赖以生存的整个操作系统——那为什么不把文字冒险装回去?于是有了今天要拆的这个仓库:okaybenji/text-engine。
index.js,零依赖;game-disks 文件夹里放"游戏盘";436 个 commit,最近一次更新在 2025 年 6 月注意它的定位:引擎 + 游戏盘,而不是一个孤立的游戏。仓库里附带的 demo 游戏本身就是完整可玩的冒险,而任何人拿它做自己的游戏,本质上就是"写一张新软盘"。
一句话:你负责打字,引擎负责让世界回应你。
打开 Demo,屏幕是一个复古终端:橙色文字,光标闪烁。你处在一个房间里,引擎会打印房间描述和里面的东西。你输入 look at desk,它描述桌子;你输入 take key,钥匙进背包;你输入 talk to waiter,他给你一堆可以聊的话题,每个话题前面标着大写关键词,你敲关键词就把天聊下去。走到锁门前敲 use key,门开了——就这一个瞬间,多巴胺跟四十多年前一模一样。
核心循环长这样:
flowchart LR
A[读一段文字描述] --> B[输入指令<br>look take go talk]
B --> C{引擎解析}
C -->|认识这个词| D[世界变了<br>拿到道具 开门 剧情推进]
C -->|不认识| E[无效反馈<br>好奇心加一]
D --> F[冒出新线索或新出口]
E --> B
F --> A
F --> G{结局}
G -->|卡关| B
G -->|通关| H[换一张新盘 再来一局]
整个游戏的数据被作者叫做"disk"(软盘),其实就是一个返回 JSON 的函数:顶层必须有 roomId(玩家当前在哪)和 rooms(所有房间)。每个房间有描述 desc、出口 exits、可捡的 items、可对话的 characters。也就是说,做一张新盘 = 写一份 JSON,几乎不用编程;想加戏,才需要在 onEnter、onUse 这些钩子里写几行 JS。仓库里的 newDiskTemplate 就是为这个准备的模板。
文字冒险这个品类被验证了五十年,它的“上头机制”其实非常现代,拆开看全是今天手游在用的东西:
1. 解析器就是老虎机。 你永远不知道哪个词能触发反应。look、take、use、talk 是基本功,但 unlock、flip、push 这些隐藏动词全靠猜。每猜对一个,等于拉动一次拉杆中奖——这是典型的“猜测-奖励”循环,跟 Wordle 让你猜五字母单词是同一种快感。text-engine 还专门做了命令自动补全(2.0 版加入的,作者在致谢里专门感谢了帮他设计这个功能的朋友),把“打错词的挫败”压到最低,让猜词的快乐留在原地。
2. 物品栏就是进度条。 你的 inventory 从空到满,每捡起一样东西,都是系统在告诉你“你变强了”。而钥匙开门这类设计,本质是“先给锁、再给钥匙”的经典钩子——玩家先看见目标(上锁的门),动力就自动产生了。
3. 对话系统是收集玩法。 text-engine 的角色对话用 topics 实现:每个话题有 option(显示的选项)和 line(选中后说的话),还能设置 prereqs——必须先聊过某话题,新话题才会解锁,removeOnRead 控制聊过即消失。这不就是对话形式的收集图鉴吗?玩家会下意识把每个 NPC 的话茬聊干。
4. ASCII 画是彩蛋奖励。 房间可以配 img 字段放 ASCII 艺术图,进入就打印。在没有美术成本的前提下,这反而是最便宜的“哇”时刻。
5. 单局成本趋近于零。 打开网页就能玩,一条指令一秒钟,卡关了随时 save。这种低摩擦恰恰是网页小游戏最值钱的特质——留存靠的不是大坝,是水龙头。
这个仓库对开发者的价值,一半在“能抄的架构”,一半在“能复用的组件”。
零依赖单文件架构。 全部引擎逻辑在 index.js 里,通过 <script> 引入后往全局命名空间挂一堆函数,HTML 里只需要一个 id="output" 的 div 和一个 id="input" 的输入框。没有构建工具、没有框架、没有 npm install。对于一个想两周做出 MVP 的个人开发者,这种“反现代”的选择反而是最短路径。
存档系统的骚操作:命令重放。 这是全仓库最值得学的设计。text-engine 3.0 的 save/load 不序列化游戏状态,而是记录玩家输入过的全部指令,读档时把游戏重置后按顺序重放一遍——像游戏自己快进玩到你的进度。为此作者把 disk 从“对象”改成了“返回对象的函数”:每次重放前调用函数拿到全新状态,全程不需要刷新浏览器。代价是非确定性代码会出问题——README 里专门举了个例子:demo 里那枚抛硬币的十美分,存档再读档,硬币可能正面变反面,因为重放的只是 use dime 这条指令,硬币被重新抛了一次。这个权衡写得坦坦荡荡,还给了出路:不想要就覆盖掉 save 命令,或者自己写存档。对做回合制、命令驱动游戏的开发者,这套模式比状态快照省太多事。
命令系统按参数个数分桶。 所有命令存在全局数组 commands 里,commands[0] 收纳零参数命令(go 不带参数会列出所有出口),commands[1] 收纳带一个参数的。想加自定义命令两行代码;想换掉默认行为,直接覆盖同名函数,README 连 delete commands[0].save 这种删命令的写法都教了。
一套现成的工具函数。 getRoom、getExit、getItem、getCharacter、pickOne(从数组随机取一个,用于随机台词)、println(支持传 CSS 类名染色)——内容向游戏需要的查询原语基本齐了。物品还支持多个别名(['basketball', 'ball']),玩家叫它球还是叫它篮球都能命中,这是文字游戏体验的隐形分水岭。
跨环境运行。 1.1.1 版之后引擎不绑定 DOM,有人做了 text-engine-node 的示例——同一张盘可以跑在终端里。这意味着你的游戏内容层和展示层是分离的,换皮成本很低。
先把丑话说在前面:GPL-3.0 意味着你不能拿这个引擎的代码改吧改吧就闭源收费——衍生作品必须同样开源。所以围绕它的变现路径要么“卖内容不卖引擎”,要么联系作者谈商业授权。开源文字游戏内容本身怎么赚钱?路上有现成的车辙:
这个仓库本身没有变现痕迹——它是作者的开源作品集项目。但它证明了最重要的一件事:这条路的物料成本是一份 JSON。
1. 中文“每日一谜”文字冒险(MVP:1-2 周)。 Wordle 把猜词做成了每日限定,文字冒险完全可以照搬:每天一张小盘,三五个房间一条谜,通关后生成一个 emoji 战绩图让玩家晒到群里。text-engine 的盘就是 JSON,你甚至可以做一个题库表每天轮换。变现走微信小游戏的激励视频(卡关看广告拿提示)+ 会员解锁往期题库。引擎核也可以不抄它的 GPL 代码,自己照“解析器+房间图”的思路重写一个——思路免费,代码清洁。
2. 聊天界面皮的文字怪谈(MVP:2-3 周)。 把终端 UI 换成聊天 App 的样子:NPC 是聊天列表里的联系人,topics 是消息气泡,talk to mary 变成点开对话框。悬疑/怪谈题材天然适合这个皮,内购解锁章节是成熟路径。技术上只需重写 println 一层,引擎的房间-物品-话题模型原样保留。
3. 把“盘”卖给不会写代码的人(MVP:2 周 + 持续销售)。 最反直觉的一步棋:这个引擎最值钱的功能是“内容即 JSON”。做一个套壳产品——教师做互动课文、博物馆做导览、HR 做入职培训剧情、品牌做互动H5——用户填表单生成盘,你收订阅费。你不是在卖游戏,是在卖“让任何岗位的人做出文字冒险”的能力,B 端客单价远高于 C 端广告。
顺带一提,作者自己的 Monkey Trap 就是这条技术路线的活广告:同一套终端美学,做一款完全免费的网页游戏,换来的是口碑和约稿——对个人开发者,这本身也是一种变现。
建议的入手顺序:先玩十分钟 demo,把每个命令都敲一遍;然后打开 game-disks/demo-disk.js,对照着玩到的内容读 JSON——你会发现屏幕上每句话都对应一个字段;最后拷贝 newDiskTemplate,把第一个房间改成你家。到这一步,你距离发布自己的文字冒险,大概只剩一个周末和一个好故事。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
