从四个格子到无限宇宙:康威生命游戏的技术实现与哲学沉思 作者wdracky | 2026年7月17日 | Conway’s Game of Life · 技术 哲学「给定的规则能产生什么样的复杂性」这个问题本身就是生命的隐喻。——Stephen Wolfram经常写代码加上现在AI发展这么快这么智能不禁感慨或许宇宙的起源真的就是跟编程世界一般由简单的规则衍生了大千世界的万物。一、引言最简单的规则最惊人的世界1970年英国数学家约翰·康威John Conway在《科学美国人》Scientific American的数学游戏专栏上向世界介绍了一个看似毫不起眼的游戏在一个无限网格的棋盘上每个格子要么是活的要么是死的。每一代根据邻居的数量每个格子决定自己是继续活着还是出生或者死去。规则简单到可以用一句话说完少于两个邻居——孤独而死多于三个邻居——拥挤而死恰好三个邻居——新的生命诞生。然而正是这三条最简规则催生了一个完整的数字生命宇宙——滑翔机在网格中穿梭高斯帕枪永不停歇地喷射出粒子播种机以二次方速度扩张领土脉冲星以精确的3/1周期闪烁……2026年的今天我们用纯HTMLJavaScript实现了这个游戏的第四个版本——一个900×460格的超大地图、包含10种无限增长图案库的作品。这篇文章既是一份完整的技术复盘也是一次关于简单规则如何涌现复杂性的哲学探索。我们先来看一下我的开发效果二、游戏规则数学之美的极致凝缩2.1 三条规则一个宇宙生命游戏的核心规则Standard Life简称S23/B3可以归结为一个简洁的状态转移函数下一代格子状态 f(当前状态, 邻居数量) 存活规则 (Survival): 邻居数 ∈ {2, 3} → 继续存活 诞生规则 (Birth): 邻居数 3 → 新生 死亡规则 (Death): 邻居数 ∈ {0, 1, ≥4} → 死去用数学语言描述这是一个**元胞自动机Cellular Automaton**系统由计算机科学家Stanislaw Ulam和John von Neumann在1950年代开创。整个系统具有以下数学特性局部性每个格子的状态只由其8个邻居决定齐性所有格子遵循完全相同的规则离散性空间网格和时间离散代数都是离散的2.2 为什么是这三条规则康威在设计时做了精心选择规则必须避免两种极端——陷阱一过于无聊的规则如果大多数格子总是趋向于全部死亡死寂或者全部存活死水一潭就没有任何有趣的行为。规则需要产生持续的运动。陷阱二过于疯狂的规则如果演化过于混沌随机性爆炸就失去了可观测的结构。好的规则应该让秩序和混沌之间保持张力的边缘——这就是复杂系统理论中的**“混沌边缘”Edge of Chaos**。S23/B3规则恰好落在这一临界点上。数学家Brandon Silica的证明和后来的计算实验表明在这个规则下生命既能存活又不会无限蔓延还能产生丰富的动态结构。这是偶然还是必然今天我们仍不完全知道。2.3 更广阔的规则空间生命游戏只是庞大规则宇宙中的一个点。如果我们改变规则比如B36/S23或者B1/S1就会得到完全不同的世界——有的永远冻结有的像雪花一样规则生长有的则爆炸式扩张。┌─────────────────────────┐ │ 规则空间 (Rule Space) │ │ │ 死寂区 ──────────┼─────────────────────────│ (全部归零) │ │ │ 边缘混沌区 ← S23/B3 我们 │ ← Conway的精妙选择 混乱区 ──────────┤ 所在的位置 │ (随机爆炸) │ │ └─────────────────────────┘理解这一点我们就已经触及了复杂系统理论的核心在秩序与混沌的交界处生命最有可能涌现。这不是生命的生物学定义而是生命作为信息模式的哲学起点。三、计算理论生命游戏是通用图灵机3.1 滑翔机穿越时空的信息载体在生命游戏的众多结构中最著名的或许是滑翔机Glider——一个由5个格子组成的飞船每4代完整移动一格对角线穿越整个网格。代0: .X.X. 代1: .... 代2: ..X.. 代3: .X... 代4: XXXXX X..X. .XX.. .X.X. .X.X. ....X X.... X...X X...X X...X ...X.但滑翔机的意义远不止好看在生命游戏社区中滑翔机是信号和能量的载体——相当于电子在电路中的流动。这为构建人工计算结构奠定了基础。3.2 生命游戏是图灵完备的1996年Paul Rendell在自己的博士论文中实现了生命游戏中的通用图灵机。之后DH研究团队在2006年构建了生命游戏中的生命游戏模拟器Life within Life。2010年HashLife算法的发明者Bill Gosper构建了可以模拟任意图灵机的结构。这意味着一个深刻的结论在康威生命游戏中只要你愿意投入无限的空间和时间理论上可以模拟任何可计算的过程——包括模拟另一个生命游戏实例包括运行一个人工编写的程序包括……模拟人类大脑。这是一个哲学炸弹用三条最简规则构建的系统在计算能力上等价于一台通用计算机。那么计算的本质究竟是什么生命游戏让我们看到计算不需要电子不需要硅片不需要任何物理基底——它只需要信息和规则。3.3 无限增长结构让数学自己生长在生命游戏的诸多成就中有几类结构特别引人注目 滑翔机枪Glider Gun每30代发射一个滑翔机 ┌──────────────────────────────────────┐ │ ╔══╗ │ │ ║ ║ ← 高斯帕滑翔机枪36格子 │ │ ╚══╝ 每30代向右发射一个滑翔机 │ └──────────────────────────────────────┘这是线性无限增长——速度恒定永不停止。 播种机Breeder749×338格4058活细胞这是真正的二次方增长怪物初始播种机由两条轨道rake拖着播种机每移动一格就在其轨迹上释放一个河豚puffer而每个河豚又会释放大量碎片。数学上这种结构的细胞总数随时间呈二次方增长面积比例。 耙子Rake耙子是一种特殊的移动滑翔机枪——一边移动一边向后发射滑翔机。在无限网格上耙子留下的是一条能量轨迹。四、技术实现从1到4的四次迭代4.1 v1 · 基础版最小可行的宇宙第一个版本的实现目标很明确让它跑起来。核心数据结构采用最直接的二维数组// 网格每个元素 0死或 1活vargridnewArray(ROWS*COLS).fill(0);// 每代演化计算每个格子的下一代状态functionstepGen(){varnextnewArray(ROWS*COLS).fill(0);for(varr0;rROWS;r){for(varc0;cCOLS;c){varlive0;// 统计8个邻居for(vardr-1;dr1;dr)for(vardc-1;dc1;dc)if(!(dr0dc0))livegrid[((rdrROWS)%ROWS)*COLS((cdcCOLS)%COLS)];varir*COLSc;next[i](live3)||(grid[i]live2)?1:0;}}gridnext;}关键技术决策有限网格 环绕边界Toroidal topology网格边缘和另一边相连形成一个甜甜圈拓扑。这个选择让实现简单同时避免了边界处理的各种麻烦。双缓冲数组Double Buffering上一代和下一代分别用两个独立数组存储避免边读边写导致的数据竞争。这是所有元胞自动机模拟的标准做法。用户交互鼠标按下 绘制活细胞鼠标拖动 连续绘制播放/暂停用setIntervalclearInterval控制4.2 v2 · 增强版修复与扩展v2解决了v1中一个关键的可用性问题调整格子大小时画面变黑。Bug分析当用户通过滑块改变cellSize格子像素大小时Canvas的绘制坐标需要同步更新。但如果只在重新调整canvas.width后直接清空并重绘在某些浏览器中会因为 Canvas 上下文状态不一致导致整屏黑屏。修复方案// 旧方法有问题fillRect清空后直接drawcanvas.widthnewWidth;draw();// ← 如果 cellSize 在 draw() 前没更新会黑屏// 新方法正确functionresizeCanvas(){// 先更新 cellSizecellSizedocument.getElementById(slZm).value;// 再更新 canvascanvas.widthMath.floor(canvasContainer.clientWidth);canvas.heightMath.floor(canvasContainer.clientHeight);// 重映射已有图案到新尺寸而非清空// ……}新增功能经典图案库滑翔机、脉冲星、高斯帕滑翔机枪、轻型飞船LWSS坐标系统修正修复鼠标点击位置和实际格子位置的偏移使用addEventListener替代内联onclick减少全局污染4.3 v3 · 进化版能量、基因与自然选择v3是最具野心的版本——它把生命游戏变成一个进化模拟器。引入生物学隐喻传统的生命游戏里所有活细胞完全等价。而v3为每个细胞引入了**基因Genome**属性// 每个细胞现在携带基因信息vargenome{surviveMin:2,// 存活所需最小邻居数surviveMax:3,// 存活所需最大邻居数birthMin:1,// 诞生所需最小邻居数birthMax:3,// 诞生所需最大邻居数metabolism:0.1,// 每代代谢消耗hue:0// 颜色色相};能量守恒定律// 细胞的能量 初始能量 - 代谢消耗 繁殖分摊functioncalcEnergy(cell){returncell.initEnergy-cell.gen.metabolism*agebornChildren.reduce((s,c)sc.energy*0.5,0);}if(cell.energy0)cell.alivefalse;// 能量耗尽 → 饿死基因突变与自然选择functionmutate(g){if(Math.random()mutationRate){// 参数微调g.surviveMinMath.floor(Math.random()*3)-1;g.birthMaxMath.floor(Math.random()*3)-1;g.metabolism(Math.random()-0.5)*0.05;// 色相漂移每代颜色微微变化g.hue(g.hue(Math.random()-0.5)*20)%360;}}涌现行为Emergent Behavior最令人惊叹的是——v3中不需要写任何适应度函数。只要设定代谢率和突变率能量效率更高的基因组自然会以指数速度扩张因为高能量效率的细胞活得更久留下更多后代。这正是达尔文进化论在代码中的最简体现没有中央设计者没有宏观目标只有局部规则的不断重复。4.4 v4 · 巨型地图版无限宇宙与无限增长v4的实现聚焦于一个问题如何在大尺度上优雅地展示无限增长的力量900×460网格≈41万格子这么大的网格在浏览器中实时演化对性能是一个真正的考验。我们采用了几项关键优化① 包围盒Bounding Box优化传统方法每代遍历全部41万个格子。优化方法只计算包围盒范围内的格子——即所有活细胞的最紧外接矩形。varbbox{minR,maxR,minC,maxC};// 只在 bbox 周围扩展1格即可for(varrbbox.minR-1;rbbox.maxR1;r)for(varcbbox.minC-1;cbbox.maxC1;c)// 计算邻居……效果初期几代只需计算几百个格子而非41万。当播种机等结构展开时bbox随之扩张始终只计算必要区域。② Uint8Array 双缓冲// 使用 TypedArray 而非普通数组vargridnewUint8Array(ROWS*COLS);// 当前代varnextGridnewUint8Array(ROWS*COLS);// 下一代的临时缓冲区// 用位运算索引functionidx(r,c){returnr*COLSc;}Uint8Array比普通Array节省约8倍内存且数组索引更快。在移动设备上效果尤为明显。③ 视口相机系统在41万格的超大地图上用户需要一个相机来探索varcamX0,camY0;// 相机在网格中的坐标varvColsMath.ceil(canvas.width/cellSize);// 可视列数varvRowsMath.ceil(canvas.height/cellSize);// 可视行数// 只渲染相机视野内的格子functiondraw(){for(varrcamY;rcamYvRows;r)for(varccamX;ccamXvCols;c)if(grid[idx(r,c)])drawCell(r-camY,c-camX);}④ 小地图导航右下角的缩略地图minimap提供全局视图点击即可瞬间跳转到任意位置mm.addEventListener(click,function(e){varrectmm.getBoundingClientRect();camXMath.floor((e.clientX-rect.left)/rect.width*COLS);camYMath.floor((e.clientY-rect.top)/rect.height*ROWS);draw();});⑤ RLE图案解析生命游戏的图案以RLERun-Length Encoding格式存储。例如高斯帕枪的RLE!Name: Gosper Glider Gun !Author: Bill Gosper x 36, y 9, rule B3/S23 24bo$22bobo$12b2o6b2o12b2o$11bo3bo4b2o12b2o$2o8bo5bo11bobo$2o8bo3bob2o 6b$12bo3bo4b2o$13b2o6b2o$24bo!我们的解析器读取这一格式动态构建图案数组支持旋转0°/90°/180°/270°和水平翻转。五、从代码到哲学简单规则如何产生复杂世界5.1 涌现从无序中诞生的秩序涌现Emergence是复杂系统科学中最迷人的概念之一当系统的组成部分遵循简单规则互动时整体会产生出任何单一规则都无法预测的新属性。生命游戏是涌现的最佳教学模型现象来源性质稳定结构方块、蜂巢邻居规则可预测振荡器脉冲星周期3规则空间涌现滑翔机规则时空高度涌现滑翔机枪规则多结构互动极度涌现计算结构与门、触发器规则工程设计人工涌现关键洞见涌现不是魔法而是信息在约束条件下的流动。当我们说滑翔机涌现了我们其实是在说规则的组合在特定初始条件下产生了可重复的时空模式。涌现的本质是计算——只不过这个计算是并行发生在宇宙的每一个格子上。5.2 生命游戏与真实生命的同构这里的生命不是隐喻而是一个精确的数学同构关系细胞 ≡ 状态机每个格子是一个有限状态机输入是8个邻居的状态输出是自己的下一状态。演化 ≡ 计算从初始状态到第N代的过程等价于运行了N步的计算过程。图案结构 ≡ 算法滑翔机 ≡ 空间中的信息包相当于光子或电子滑翔机枪 ≡ 永不停歇的时钟信号源与门/或门/触发器 ≡ 数字电路的基础组件播种机 ≡ 会自我复制的程序片段那么真正的生命是什么生物细胞中的DNA编码了蛋白质合成的规则。蛋白质根据DNA的规则折叠、互动、复制。这个过程和生命游戏中的演化本质上是同一类现象信息在物理载体上的运行。物理学家Wheeler曾提出It from Bit——存在源于信息。生命游戏完美地验证了这一假说当我们把存在简化为0和1把运动简化为状态转移函数一个完整的可计算宇宙就涌现了出来。5.3 图灵停机问题与生命的边界生命游戏是图灵完备的这意味着给定任意初始状态不存在一个通用算法能预测它最终是稳定、振荡还是无限增长。这与图灵停机问题Halting Problem等价是数学已知的不可判定问题之一。哲学推论如果我们把生命定义为在特定规则下持续运行的信息过程那么生命的边界是不可判定的——你无法用一个有限程序来判断任意一个生命游戏初始状态是否会长久存续生命不需要物理载体——图灵机不需要电子光子计算机不需要硅片生命游戏不需要任何物质意识的可能如果生命游戏可以模拟图灵机而图灵机可以模拟人类大脑……那么在足够大的生命游戏网格中是否可能涌现出自我意识的结构这些问题不是胡思乱想——它们是计算理论和复杂性科学正在严肃探索的前沿。5.4 自动驾驶悖论与朴素设计哲学生命游戏给工程实践带来了一个深刻教训最简单的规则往往能产生最复杂的行为。在软件开发中我们经常犯一个错误用过度复杂的规则去控制简单的现象。引入大量的if分支、特殊处理、边界case检测……结果规则本身变成了无法维护的泥团。生命游戏的设计哲学恰恰相反把规则简化到极限让执行环境承担复杂性。康威没有为滑翔机、脉冲星、机枪写任何特殊处理——它们全部是从基础规则中自动涌现出来的。这种思路在现代工程中有深刻的回响神经网络每个神经元只做最简单的加权求和sigmoid百万个神经元的组合却能识别图像、理解语言遗传算法没有中央控制器适者生存的简单选择压力在搜索空间中找到惊人的解区块链没有中央权威机构只有每个节点遵守的共识协议涌现出不可篡改的账本所有这些系统都体现了同一个原理让简单的局部规则产生复杂的全局行为比用复杂的全局规则控制局部行为更优雅、更健壮。5.5 我们做了什么我们不是创造者而是规则的设计者回到我们的代码实现v1到v4的迭代过程本身就是一个涌现的隐喻。v1中我们写了演化规则统计邻居、决定生死v2中我们加了环境交互鼠标、键盘、缩放v3中我们引入了基因与变异让系统自发地适应和进化v4中我们将尺度扩展到41万格子让涌现的视觉冲击力最大化但我们从未设计出一个滑翔机。我们只是设计了规则格子们自己长出了滑翔机。这或许就是人类在宇宙中的位置也许我们不是创造者而只是规则的设计者。宇宙中的物理定律是简单的量子场论的核心方程只有几行但它们运行在10⁸⁰个粒子上——由此涌现出了星系、生命、意识和文明。六、代码朴素逻辑的元思考编程作为认知工具6.1 生命游戏是一种计算望远镜天文学家使用望远镜观测遥远的星系——光在真空中传播了数十亿年最终落在我们的感光元件上。生命游戏的意义类似它是一个思想的望远镜让我们能够观测计算过程的本质结构。当你盯着一个脉冲星脉冲星周期3的振荡器闪烁时你实际上是在看一个在网格宇宙中振荡的数学函数。当你看到播种机缓慢扩张时你是在观察一个二次方函数的物理实现。代码在这里不只是工具它是通往理解的媒介。6.2 朴素代码的力量生命游戏4个版本的代码量v1: ~250行含HTML/CSSv2: ~400行v3: ~800行v4: ~550行所有代码都是纯HTMLCSSJavaScript没有框架、没有依赖、没有包管理器总文件大小不超过50KB可以在任何现代浏览器中直接打开。这种朴素不是简陋而是一种方法论立场可理解性你可以在一个下午读完所有代码理解它的每一个决策可移植性不需要Node.js环境不需要安装npm包不需要任何配置可演化性每一行代码都是透明的任何人都可以fork、修改、扩展在AI时代这种朴素代码的价值反而在回归当AI工具可以快速生成大量代码时真正稀缺的变成了能够理解一小段朴素代码的认知能力。6.3 从生命游戏到人工生命生命游戏是**人工生命Artificial Life**领域的奠基性工作之一。1991年Christopher Langton正式提出了这个领域核心议题是生命是一种过程而不是一种物质。我们能在计算机中合成生命吗生命游戏给出了肯定但有限制的答案——它展示了形式意义上的生命Pattern persistence, self-replication, information transport可以在最简单的规则中涌现。但它是否回答了生命的意义或意识的问题显然没有。然而生命游戏让我们看到了一个令人敬畏的可能性在规则和初始条件的海洋中复杂性是不可避免的。宇宙中只要存在足够的时间和空间简单规则就会产生智能——这或许解释了为什么我们在宇宙中并不孤独。七、结语四个格子一个宇宙一个问题我们从四个格子出发一行代码描述规则一个数组存储状态一组事件处理交互一个Canvas绘制宇宙最终我们到达了这里图灵完备性的证明、进化算法的隐喻、物理宇宙的计算论诠释以及一个令人不安的问题——如果复杂世界可以从朴素规则中涌现那么我们眼前这个真实的世界是否也只是某种底层规则的运行结果康威在1970年发明生命游戏时大概只是想展示一个有趣的数学玩具。他没有预料到这个玩具会成为一个哲学实验室让50多年后的程序员也就是我们用它来思考生命、计算和存在的本质。所以下一次当你打开game_of_life_v4.html看到一个滑翔机从屏幕的一角飞向另一角时请记住你看到的不是像素。你看到的是信息在空间中流动。你运行的不是一个程序。你运行的是一个宇宙。而你——作为观察者和参与者——是这个宇宙中唯一意识到这一切的那个涌现现象。附录四版文件速查版本文件主要特性v1game_of_life.html基础版播放/暂停/单步/随机/画笔v2game_of_life_v2.html增强版修复缩放4种经典图案v3game_of_life_v3.html进化版能量/基因/突变/自然选择v4game_of_life_v4.html巨型地图版900×46010种无限增长图案视口相机项目地址https://gitcode.com/wdracky/ConwaysGameofLife参考资源ConwayLife.com — 权威图案数据库Golly — 最完整的生命游戏模拟器开源Stephen Wolfram,A New Kind of Science(2002)Paul Rendell, “A Turing Machine in Conway’s Game of Life” (2000)