2016年,Jonathan Blow 花了七年多磨出《见证者》(The Witness):一座荒岛、六百多块画线谜题面板、零文字教程,发售后口碑一路封神。但这类游戏有个宿命——通关那天就是"绝粮"那天。所有粉丝都在问同一句话:还有没有更多的题?
有个叫 Matt 的程序员给出的答案不是等官方DLC,而是自己造了一台"出题机"。他把《见证者》整套谜题符号语言搬进浏览器,做成了一个既能玩题、又能自己出题、还能把题发布给全世界解的模拟器——The Windmill。README 里那句自述相当诚实:"这个项目,是为那些还不想拔掉输液管的粉丝做的。"代码开源在 GitHub 上,仓库名叫 windmill-client,至今 windmill.thefifthmatt.com 这个网站还活着,打开就是一行副标题:The Witness Puzzle Simulator。
98 颗星,放在动辄千星的仓库堆里毫不起眼,但这个仓库的价值不在星数,在于它演示了一件个人开发者最容易想反的事:别做一个游戏,做一个让别人产内容的东西。
先说原版。《见证者》的谜题语言极其优雅:每块面板是一张网格,你从圆点出发画一条线,走到马蹄形终点,线必须同时满足格子上所有符号的规则。符号就那么几类——黑白方块要求同色不能被划进同一块区域;俄罗斯方块形状要求路径切出的区域必须恰好放下这个形状;三角形要求"贴着线段的数量"等于数字;六边形豁免符能抵消同格另一个符号。规则五条,组合空间却是指数级的,这正是它"七周目仍有机巧"的原因。
Windmill 做的事,是把这套语言完整复刻成"纸和笔的交互式替代品"(README 原话):你可以刷社区出的题,卡关了换一题;也可以切到编辑器,自己往格子里摆符号,摆完引擎立刻告诉你"这道题有没有解、有几个解";觉得满意就发布,别人的题单里就多了一道你的题。一条线,同时是答题卡、是刀、也是裁判。
flowchart TD
A[打开谜题: 玩别人的题] --> B[从起点画一条线到终点]
B --> C{引擎即时判定}
C -- 不满足规则 --> D[线作废, 盯着符号重新想]
D --> B
C -- 全部满足 --> E[通关瞬间: 又悟出一条规则]
E --> F[下一题 / 挑更狠的社区谜题]
E --> G[切换编辑器: 自己摆符号当出题人]
G --> H{验证器: 有解吗? 唯一解吗?}
H -- 太简单/多解 --> G
H -- 合格 --> I[发布分享]
I --> A
注意这个循环里藏着两个飞轮:玩家侧是"画线→判定→领悟",创作者侧是"造题→验证→发布"。原版《见证者》只有第一个飞轮,Windmill 把第二个飞轮接上了——内容从此不再依赖官方。
1. 判定即反馈,松手见分晓。 画线谜题最怕的是"我不知道我错哪"。Witness 系的判定粗暴又迷人:线一收笔,引擎只给你"过"或"不过"。不过,回炉;过了,多巴胺立刻到账。这种毫秒级的是非反馈,跟俄罗斯方块消行、扫雷翻开安全格是同一套神经机制——成本低、频率高、永远差一点。
2. 没有教程,就是最好的教程。 《见证者》的精髓是"靠试错自己悟出规则",Windmill 完整保留了这一点。你不知道黑白方块是什么意思?画一条线,错了,再画一条,对了——规则是自己长进脑子里的。心理学上这叫"生成效应":自己推导出的东西比被告知的记得牢十倍。表现在留存上,就是"我再试一条线就睡"。
3. 出题比解题更上头。 这是 Windmill 相对所有"见证者like"最狠的一层。你玩了几百道题之后,会忍不住想:"我摆三个符号,能不能把别人骗进死胡同?"编辑器把这种冲动变成了产品:摆符号、跑验证、看解的数量,一个下午就能造出第一批题。解题消耗内容,出题生产内容——用户自己把两头都干了。
4. 攀比与署名欲。 你的题发布出去,陌生人解出来的那一刻,你就是"出题人"。这种署名感是小众社区里最硬的通货。Windmill 站点至今保留着账号系统和讨论区入口,就是给这个循环修的跑道。
别看只有 98 星,这个仓库的技术选型在 2016 年相当讲究,而且几处架构思路今天照样能直接抄。
栈:AngularJS 负责菜单、题单、账号这些 UI 外壳;谜题网格本体完全不用框架,纯 JS 实现,SVG 渲染,模板用 Closure Templates(Soy),工具链是 Closure Library + Closure Compiler;谜题数据结构定义在 grid.proto 里,用 protobuf 序列化。整个仓库压到 127KB——小到你可以一个下午读完核心逻辑。
最值得抄的三块:
"画线→区域→约束检查"的验证器。这是全仓库的灵魂。用户画的线把网格切成若干封闭区域,验证器先做区域划分,再对每个区域跑符号规则(同色分离?形状恰好嵌入?三角形计数?),最后汇总成对/错。本质上是一个小型约束满足问题(CSP)求解器,纯前端运行、零延迟。任何"网格+规则"类谜题(数织、非逻辑扫雷变体、点线游戏)都能套这个骨架。
谜题即数据。一道题不是代码,是一条 proto 记录:网格尺寸、符号、位置,序列化后就能存库、传输、分享。这让"出题"变成零成本的运营动作,也让"每日一题""题单精选"这类功能天然可行。做 UGC 游戏的一定要记住这个设计:内容与引擎分离。
前后端分家的克制。客户端仓库只管玩和造,发布、题单、账号留给一个姊妹仓库的服务端(PostgreSQL + API)。想 MVP 的话甚至可以砍掉服务端——本地验证+链接编码分享就能跑起来,先验证有没有人愿意出题,再决定要不要建社区。
老实说的部分:构建是一堆 Bash 脚本(proto.sh、soy.sh、compile.sh),README 自己承认"应该换个正经构建系统";开发依赖里还躺着 Java 8 和 Python 2.7;单元测试"计划中"。 AngularJS 也早已停维。所以这个仓库的正确打开方式不是拿来二开上线,而是把验证器思路和数据模型剥出来,用现代栈(哪怕就是 Vue + Canvas)重写一个周末版。
先说事实:windmill-client 本身没有任何变现痕迹——Apache-2.0 开源、网站免费、无广告无内购,作者纯粹为爱发电。它对变现的意义是示范了一条路径:为经典玩法造"编辑器+社区",让内容自我繁殖。
再看这类东西在市场上怎么赚钱:
风险也直说:纯开源画线验证器不构成壁垒,壁垒在题库质量与社区运营。Windmill 断更六年网站还活着,恰恰说明这类产品"运维成本趋近于零"——但也说明作者没把它当生意。谁来把它接过去加上运营,谁拿走增量。
点子一:中文符号版"画线谜题"。 把黑白方块分隔换成"阴阳分隔",把俄罗斯方块换成汉字部件或生肖图形,规则一篇讲完、文化亲近感拉满。技术上照搬 windmill 的验证器骨架(区域划分+约束检查),素材只要 SVG。MVP 两到三周:网格+五条规则+50 个手工关。变现走微信小游戏:激励视频给提示、关卡包内购。这是三条里最贴国内流量池的。
点子二:给任意小玩法加装"出题器"。 不限画线——数织、点格、推箱变体,任何有确定性判定的小游戏,套上"玩→造→分享链接"三件套,就从"消耗型小游戏"变成"自繁殖社区"。Windmill 证明这套飞轮一个人写得出来。MVP 约四周,关键是把谜题做成可编码的 URL 或短串(它用 proto,你用 base64 都行)。变现靠去广告会员和主题皮肤,UGC 内容本身是你的零成本买量素材。
点子三:AI 出题 + 确定性验证器兜底。 这是 2026 年最顺手的一招:用 LLM 批量生成谜题候选,再接一个 windmill 式的确定性求解器做"唯一解校验",不合格的直接扔。AI 负责量,验证器负责真,人工只做终审。产出的"每日谜题"可以铺公众号、小程序、日历周边三条渠道。MVP 一到两周:接个 API、写个校验管道,先跑通"一天出 30 道合格题"再说变现。
npm install → ./proto.sh && ./soy.sh && ./compile.sh local → python -m SimpleHTTPServer,浏览器开 localhost:8000/main.html(README 口径,需 Java 8 与 Python 2.7 环境,建议只读源码、用现代栈重写)《见证者》教会玩家一件事:答案一直就在面板上,只是你没换角度看。Windmill 教开发者同一件事:别人游戏里最值钱的不是美术和剧情,是那套能无限生成内容的规则语言——把它抄下来,装上编辑器,你就有了一台自己的出题机。
[!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 等场景全覆盖。
