我小时候玩过一个东西,叫「落沙」。就是一堆彩色的点在屏幕上一粒一粒往下掉,堆成小山。那会儿是 Windows 上的一个小程序,我能在上面耗一下午。
今天要讲的这个项目,就是那个东西的现代版。比我记忆里好看太多了。
项目叫 sandspiel,作者 Max Bittker,GitHub 上 3.2 千星。打开就是一块空画布,左边一排元素让你选。把沙子倒下来,它就往下流,堆成沙堆;放一滴水,它顺着沙缝往底下渗。开头就这么简单,往下玩就刹不住了。

它不是动画,是算出来的
这类游戏有个学名,叫 落沙游戏,也有叫细胞自动机的。原理说穿了特别朴素:整块画布切成几十万个格子,每一格装一样东西——可能是沙、可能是水、可能是空的。程序一秒钟跑几十遍,每一遍让所有格子看一圈邻居,按自己的规则决定下一步去哪。
沙子的规则最简单:底下是空的就往下掉,底下有东西就往斜下去,斜下也不通就待着不动。水稍微复杂一点:除了往下,还得考虑旁边有没有空间可以流过去。
你看到的每一粒沙,都是程序当场算出来的,不是播的动画。 这不是预制好的动画——每一粒沙、每一滴水,都是实时计算的结果。

元素之间会互相反应
单看每一种元素,规则都不复杂。但它们凑一块,事情就有意思了。
先说种子。你撒一把种子到土里,别管它,过一会儿它自己就往上窜,窜得比你想的高。一棵树是你种出来的,但你从头到尾没画过一笔。
火会顺着燃料爬。 你点一把火放在木头旁边,它会一路烧过去,烧完之后木头没了,留下一片灰。熔岩比火更狠,走到哪烧到哪,往沙堆里倒一勺,它会一边往下陷一边把周围点着。
酸滴到沙子上,沙子就没了;可碰到石头,它啃不动。你拿石头垒一圈当容器,里面倒酸也不怕。
油浮在水上。 往水里倒油,油会浮上去。这时候你丢一根火柴进去,水面会烧成一片。
克隆器会复制邻居。 这个元素是整盒沙子里最不讲道理的一个。它旁边挨着什么,它就把自己变成什么。你拿它对着水,它就疯狂产水,一会儿就能把整个画布泡了。
我玩的时候发现一个事:你根本不用「摆」出一个世界,你只要起个头。倒一堆沙、撒几颗种子、点一把火,剩下的它自己会发展。这种感觉很像养东西,不像玩游戏。
它凭什么不卡
玩到后面你肯定会想一个问题:几十万个格子,每秒算几十遍,还要画出来,浏览器凭什么扛得住?

最重的活在 Rust 里:格子怎么动、邻居怎么算、谁跟谁反应,全交给它。Rust 快,内存管得死,算得再猛也不会把自己拖崩。
最关键的一步在这儿:把 Rust 写的核心编译成 WebAssembly。有了 wasm,浏览器就能跑这套内核,速度接近原生。没这一步,同一个内核在网页里会慢到没法玩。
画的部分不走 DOM,走 WebGL。每粒沙就是一个像素,显卡直接刷屏,不是靠 DOM 一个个节点画。格子多到几十万,看着还是顺的。水的光影还借了个现成的算法,参考的是一个公开的 WebGL 流体模拟项目。
一个被重写了三次的东西
这个项目不是一拍脑袋做出来的。
在它之前,作者已经用 JavaScript 写过一版,又用 Lua 写过一版。两版都能跑,也都卡。格子一多,就动不了。他没放弃这个念头,换到 Rust 加 wasm 又来了一遍,这才真正跑顺。
README 里他自己写着,这一版是「前两次尝试的继任者」。
我看了眼提交记录,这个项目 2018 年就有了,到今天还在更新。八年。一个偶尔想起来玩两把的小游戏,他断断续续维护了八年。
这一点挺让人服气。一个东西能被人惦记八年,还愿意回去改,说明它对自己是有意义的。不是为了涨星,也不是为了简历好看。
他自己在文档里写了个目标:最终想让这个平台支持一种可编程的细胞自动机接口,谁都能写自己的元素传上来。听起来还是个大饼,但方向很清楚。
说点实在的
第一,有在线版,直接玩。官网 sandspiel.club,打开就能玩,不用装。这个站是作者自己托管的,偶尔会慢,页面上还有个分享和 fork 的功能,能看到别人做的东西。
第二,想本地跑得先装工具链。它跟前面那个塔防游戏不一样,这个得自己编译。步骤是先装 Rust 和 wasm-pack,进 crate 目录跑一次 wasm-pack build,再回根目录装依赖、起服务。文档里说得很清楚,开发时还可以开一个 cargo watch 让它改一次编一次。
第三,画布大小是有上限的。它不是无限的,格子数量在那儿摆着。你玩得越久、元素铺得越满,运算压力就越大。别指望用它在上面种一片森林。
还有一件事,这玩意儿真的不用教。你鼠标点两下就知道规则了,我头一回玩也没看任何说明,倒了一勺沙下去,那种往下淌的感觉一下就把人抓住了。
收尾
我为什么想讲它?现在大家看开源的眼光都挺功利,先问能解决什么问题、能不能用到项目里。这个项目一个都不占,它就是好玩。
但它代表了一类特别珍贵的东西:一个人为了把一件小事做到自己满意,反复推倒重来,真的做成了一件漂亮的作品。
你打开它,倒一勺沙,看它慢慢堆起来。就这么一下,别的什么都不用想。
像这样的有趣项目,在云栈社区里还有不少,有空可以翻翻看。