{
  "lead": "康威生命游戏是一种元胞自动机：网格中的每个细胞只有「生」和「死」两种状态，下一代的状态完全由当前周围 8 个邻居决定。规则非常简单，却能演化出滑翔机、振荡器、繁殖器等复杂结构。",
  "formulas": [
    [
      "B3 / S23",
      "3 个邻居诞生 · 2 或 3 个邻居存活"
    ]
  ],
  "terms": [
    [
      "规则 B3/S23",
      "活细胞周围有 2 或 3 个活邻居时继续存活，否则死亡（过少是孤独，过多是拥挤）；死细胞周围恰好有 3 个活邻居时复活。"
    ],
    [
      "环形边界",
      "网格左右、上下相连，像甜甜圈的表面一样，从右边出去的图案会从左边回来。代码用 <code>rem_euclid</code> 取模实现。"
    ],
    [
      "双缓冲",
      "计算下一代时读取旧网格、写入新网格，保证所有细胞都基于同一代的状态同时更新。"
    ],
    [
      "初始化",
      "用 xorshift 伪随机数生成器，按 25% 的密度随机撒下活细胞。"
    ]
  ],
  "flow": [
    [
      "rust",
      "<code>init_grid(260, 180, 25)</code>：Rust 创建 260×180 共 46,800 个细胞的网格，保存为全局状态。"
    ],
    [
      "rust",
      "播放时，JS 在 <code>requestAnimationFrame</code> 循环里按速度设置的间隔调用 <code>step()</code>，由 Rust 计算下一代。"
    ],
    [
      "js",
      "JS 调用 <code>get_grid()</code> 取回每个细胞的 0/1 状态，把每个细胞画成 3×3 像素，再用 <code>putImageData()</code> 绘制。"
    ],
    [
      "rust",
      "鼠标绘制时调用 <code>brush(x, y, 1)</code>，直接修改 Rust 中的网格。"
    ]
  ],
  "perf": [
    "每一代要检查 46,800 × 8 ≈ 37 万次邻居，数据是紧凑的 <code>Vec&lt;u8&gt;</code>，对 CPU 缓存很友好。",
    "速度滑块控制两代之间的间隔（16 ~ 190ms），渲染则始终跟随浏览器的刷新节奏。"
  ],
  "src": [
    [
      "crates/simulation/game-of-life/src/lib.rs",
      ""
    ],
    [
      "www/game-of-life/index.js",
      ""
    ]
  ]
}
