<!-- title: 《WaveFunctionCollapse》抽的不是卡，是整张地图 -->
<!-- domain: games -->
<!-- repo: mxgmn/WaveFunctionCollapse -->

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

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

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

## 仓库档案

| 项目 | 信息 |
| --- | --- |
| 仓库 | [mxgmn/WaveFunctionCollapse](https://github.com/mxgmn/WaveFunctionCollapse) |
| 作者 | Maxim Gumin（个人开发者，GitHub ID mxgmn） |
| 语言 | C# |
| 协议 | MIT |
| 首发 | 2016 年（据仓库页面） |
| 在线 Demo | README 无官方在线版，效果以仓库样图为准；各语言移植版可自行搜索 |

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

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

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

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

```mermaid
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》们反复验证过的轻变现地基，加上它，你的广告位和内购位才有流量可分。

## 上手

- 仓库：<https://github.com/mxgmn/WaveFunctionCollapse>
- 起步姿势：clone 下来先跑 Overlapping 模型的样图，换十颗种子感受“抽卡”；然后照着 Tiling 模型手写一遍邻接表，你会发现约束传播那一百行代码，就是它全部的魔法。

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

> [!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学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
