首页 › games › 《WaveFunctionCollapse》抽的不是卡,是整张地图

《WaveFunctionCollapse》抽的不是卡,是整张地图

先说清楚一件事:今天这个仓库严格讲不是游戏,它没有一个“开始”按钮,没有排行榜,没有角色。但只要你在 GitHub 游戏圈泡过一阵,一定见过它的输出——那种像素风的村庄、港口、城市地图,一格格小瓦片严丝合缝地拼在一起,看起来像某个美术肝了三个通宵的成品。这些图全是算法自动生成的。仓库叫 WaveFunctionCollapse(波函数坍缩),作者 Maxim Gumin(GitHub ID:mxgmn),一个人,2016 年开源,MIT 协议,C# 写成。Star 数长年稳居程序化生成这个细分赛道的头部(两万以上量级,据仓库页面),底下挂着几百个移植版——Unity、Godot、JavaScript、Processing,几乎每种能画图的语言都有人搬过一遍。

对想做游戏变现的个人开发者来说,它解决的是所有小游戏作者的同一个噩梦:素材从哪来。而且它顺手示范了一件事——一个算法,也能被玩家“玩”得上头。

仓库档案

项目 信息
仓库 mxgmn/WaveFunctionCollapse
作者 Maxim Gumin(个人开发者,GitHub ID mxgmn)
语言 C#
协议 MIT
首发 2016 年(据仓库页面)
在线 Demo README 无官方在线版,效果以仓库样图为准;各语言移植版可自行搜索

补一句作者后续:五年后他在同一个方向上又开源了 MarkovJunior,把“约束+随机”的思路推到了更抽象的层面。今天只拆老祖宗。

这是什么:一个会自己长地图的算法

玩法一句话:你给它一小块样图(比如 5×5 像素的瓦片样本),它给你长出一张任意大的、局部风格和样图完全一致的大地图。 样图里像素 A 旁边总是像素 B,生成的大图里就绝不会出现 A 挨着 C 的违规拼接。

它的核心循环画出来是这样:

flowchart TD
    A[所有格子处于叠加态<br>每个格子 = 全部合法瓦片] --> B[挑出熵最低的格子<br>可选性最少、最确定的那格]
    B --> C[坍缩<br>掷骰子,敲定这一格的瓦片]
    C --> D[传播约束<br>邻居删掉所有非法选项]
    D --> E{有格子可选集空了?<br>即出现矛盾}
    E -- 是 --> H[回溯或换种子重来]
    H --> A
    E -- 否 --> F{还有格子没定?}
    F -- 是 --> B
    F -- 否 --> G[输出完整地图<br>保存种子号]
    G --> I[看图 / 换个种子再抽一张]
    I --> A

“波函数坍缩”这个名字不是包装。作者自己解释过,灵感来自量子力学的叠加态观测——所有格子同时是“所有可能性”,你每看一眼(选定一格),周围的可能性就被约束塌缩。去掉物理外衣,本质是带约束传播的随机填充:先随机、后修正,发现死路就回溯。这套思路的学术近亲是 Paul Merrell 的 Model Synthesis,但把它做成几百行代码、配上一堆美到能当壁纸的样图的,是 Gumin 这个人。

为什么上头:它把“抽卡”做成了地图

一个生成器凭什么和游戏抢时间?拆开看,它身上挂着四个钩子,每个都值得抄。

第一,种子彩票。 同一份样图,换个随机种子,输出完全不同的地图。你永远不知道下一颗种子会长出连片渔村还是断崖孤塔。这不就是开箱吗——成本低到零,奖池大到无限。生成器玩具(比如后来 Townscaper 那类随手一点长出小镇的玩法,据 Stålberg 本人在公开场合的多次致意,思路与 WFC 同宗)把这一招用到了极致:玩家按的不是“开始”,是“再抽一次”。

第二,永远差一点的强迫症。 约束传播保证每张图“局部都对”,但整体结构会经常出现你觉得“要是那儿断开就更好了”的遗憾。于是你会再抽一颗种子,试图抽到那张“完美地图”。目标模糊但奖励即时,这是最容易让人忘记时间的组合。

第三,确定性带来的收集欲。 因为种子决定一切,好图可以分享——“种子 3312,去抽”。一张地图从私有品变成了社交货币。你的小游戏的每日挑战、每日关卡,底层逻辑和这个一模一样:把随机性锁进一个可分享的数字里。

第四,对开发者来说是素材自由。 前三个钩子钩玩家,这一个钩你。独立做游戏,美术是最贵的成本;一个能从样图无限扩张素材的算法,等于把美术预算砍到一顿饭钱。这就是它为什么在游戏圈经久不衰——它上头的用户里,一半是玩家心态的工程师。

技术拆解:一个下午能读完的核心

整个仓库小得令人发指。没有依赖、没有框架,几个 C# 文件,核心逻辑数百行的量级,一个下午可以通读。拆成四块看:

1. 邻接规则(约束从哪来)。 仓库里有两个模型。Overlapping 模型最省事:直接扫样图,每个 N×N 小块的所有出现方式就是合法图块,样图本身定义了“谁挨着谁”。Tiling 模型则允许你手工定义瓦片和边界规则,适合正儿八经的游戏地图。这一步是全部“游戏性”的来源——规则即内容,样图即策划案。

2. 熵与坍缩(随机怎么用)。 每轮先找“熵最低”的格子——可选项最少的那个,先钉死它,避免随机乱填导致后患。然后从剩余合法选项里随机挑一个。这里的工程直觉值得记住:随机要花在最不容易出错的地方,无脑全随机和无脑顺序填都会让生成质量崩掉。

3. 约束传播(质量从哪来)。 一格敲定后,它的四个邻居立刻按邻接规则删除非法选项,删除又可能让邻居的邻居失去选项——连锁传导,直到稳定。这是整个算法的灵魂,也是它和你手写“随机拼图”的差距所在。

4. 矛盾与回溯(兜底怎么做)。 某格选项被删空就是矛盾。原版处理很朴素:重来一颗种子。工程上加一个栈做局部回溯即可(多数移植版都这么干),成本极低。

可直接复用的部分更多:种子化的随机数、邻接表数据结构、“观察-传播”循环骨架,都可以原样搬进任何语言。Unity 上流传最广的移植出自 marian42 之手,JS 圈也有多个成熟实现,这意味着你能找到带注释的参考答案——写不出的时候,看别人的坍缩顺序就能开窍。

变现观察

仓库本身是纯公益形态:MIT 协议,没有广告位,没有付费墙,README 里连赞助链接的痕迹都很淡。它不是变现样本,它是变现燃料——真正赚钱的是拿着它造工具的人。

给这条路径画个像:WFC 这样的算法不适合直接做成“游戏”卖,适合做成生产力玩具——玩家心态的用户来玩,专业心态的用户来买。工具类商品还有个游戏没有的好处:没有“通关”,就没有流失。

给我的灵感

三个可以直接动手的点子,按工作量从小到大排。

点子一:跑团 GM 的种子抽图器(1-2 周)。 把 WFC 移植成纯前端网页(JS 移植版改一改就行),输入一个种子号,输出可缩放的像素地图,支持一键导出 PNG。变现走 itch.io 付费版(多主题瓦片包)+ 爱发电/Ko-fi 打赏。跑团主持人群体小而黏,付费习惯成熟,而且他们会主动替你传播好种子——还记得“种子即社交货币”吗。

点子三:给你的小游戏装一个“无限关卡”钩子(约 1 周)。 如果你在做一个 roguelike、塔防或消除类小游戏,把 WFC 塞进关卡生成层,开放“每日种子”。所有玩家同一张图、同一排行榜——开发成本一天,留存钩子终身。这是《Hello Wordl》《Monkeytype》们反复验证过的轻变现地基,加上它,你的广告位和内购位才有流量可分。

上手

一个算法火到第九年,靠的不是新奇,是它把“随机”驯服成了“惊喜”。你下次给自己的小游戏加随机内容时,值得先想想它——先传播,后坍缩,矛盾了就回溯。写代码如此,做独立游戏变现,也如此。

[!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 等场景全覆盖。

51学通信知识星球海报-扫码加入