生命游戏(Game of Life)

由 Rust + WebAssembly 驱动的康威生命游戏

🖱️ 单击 / 拖拽 绘制细胞  |  空格键 播放/暂停

📖 原理说明

康威生命游戏是一种元胞自动机:网格中的每个细胞只有「生」和「死」两种状态,下一代的状态完全由当前周围 8 个邻居决定。规则非常简单,却能演化出滑翔机、振荡器、繁殖器等复杂结构。

🧮算法原理

B3 / S233 个邻居诞生 · 2 或 3 个邻居存活
规则 B3/S23
活细胞周围有 2 或 3 个活邻居时继续存活,否则死亡(过少是孤独,过多是拥挤);死细胞周围恰好有 3 个活邻居时复活。
环形边界
网格左右、上下相连,像甜甜圈的表面一样,从右边出去的图案会从左边回来。代码用 rem_euclid 取模实现。
双缓冲
计算下一代时读取旧网格、写入新网格,保证所有细胞都基于同一代的状态同时更新。
初始化
用 xorshift 伪随机数生成器,按 25% 的密度随机撒下活细胞。

🔄Rust 与 JavaScript 的分工

  1. Rustinit_grid(260, 180, 25):Rust 创建 260×180 共 46,800 个细胞的网格,保存为全局状态。
  2. Rust播放时,JS 在 requestAnimationFrame 循环里按速度设置的间隔调用 step(),由 Rust 计算下一代。
  3. JSJS 调用 get_grid() 取回每个细胞的 0/1 状态,把每个细胞画成 3×3 像素,再用 putImageData() 绘制。
  4. Rust鼠标绘制时调用 brush(x, y, 1),直接修改 Rust 中的网格。

⚡性能要点

  • 每一代要检查 46,800 × 8 ≈ 37 万次邻居,数据是紧凑的 Vec<u8>,对 CPU 缓存很友好。
  • 速度滑块控制两代之间的间隔(16 ~ 190ms),渲染则始终跟随浏览器的刷新节奏。

源码crates/simulation/game-of-life/src/lib.rswww/game-of-life/index.js