← 部落格

康威生命遊戲

Conway的生命遊戲是複雜性如何從簡單規則中湧現的經典示例。想像一個無限的單元格網格——每個單元格可以是「開」(存活)或「關」(死亡)。每一輪(或「代」),每個單元格都會檢查有多少鄰居存活。如果過於擁擠,它會死亡。如果過於孤立,它也會死亡。但如果恰好有三個鄰居,死亡的單元格就會重獲生命。

這套簡單的規則帶來了無盡迷人的行為——從穩定的結構和重複的振盪器,到穿越網格的自推進「宇宙飛船」。這完美展示了複雜性如何從簡單中產生,而且它是圖靈完備的,意味著理論上可以模擬任何計算。

運作原理

正在載入遊戲板...

圖案範例

這些經典模式展示了遊戲的湧現行為。「Glider」展示了網格上的移動,「Pulsar」創造了迷人的振盪,「Small Exploder」展示了簡單形狀如何演化成複雜形式。

演算法

生命遊戲的核心是幾個優雅的函數,它們決定了我們這個細胞宇宙中的生與死:

// The core algorithm that determines life and death
function computeNextGeneration(currentGrid) {
  const newGrid = createEmptyGrid(rows, cols);

  for (let r = 0; r < rows; r++) {
    for (let c = 0; c < cols; c++) {
      const neighbors = countNeighbors(currentGrid, r, c);
      const cellState = currentGrid[r][c];

      // Apply Conway's rules of life
      if (cellState === 1) {
        // Live cell survives if it has 2 or 3 neighbors
        newGrid[r][c] = (neighbors === 2 || neighbors === 3) ? 1 : 0;
      } else {
        // Dead cell springs to life if it has exactly 3 neighbors
        newGrid[r][c] = (neighbors === 3) ? 1 : 0;
      }
    }
  }
  return newGrid;
}
核心演算法將Conway的規則應用於網格中的每個單元格。每一代,它檢查每個單元格的狀態和鄰居數量,以確定它是存活、死亡還是重獲新生。
// Count live neighbors for each cell
function countNeighbors(g, row, col) {
  let count = 0;
  for (let i = 0; i < 8; i++) {
    const nr = row + NEIGHBOR_OFFSETS[i * 2];
    const nc = col + NEIGHBOR_OFFSETS[i * 2 + 1];
    if (nr >= 0 && nr < rows && nc >= 0 && nc < cols) {
      count += g[nr][nc];
    }
  }
  return count;
}
查看沃爾夫勒姆規則110 →
運作原理

選擇任意區域創建細胞群,或選擇並拖動繪製生命路徑。按播放觀看您的創作演化,或使用步進一次推進一代。使用隨機製造混沌,或清除重新開始。

規則

每一代中每個細胞遵循四條簡單規則:

  • 人口不足: 鄰居少於2個的活細胞死亡
  • 存活: 有2或3個鄰居的活細胞存活
  • 過度擁擠: 鄰居超過3個的活細胞死亡
  • 繁殖: 正好有3個鄰居的死細胞復活
控制
  • 播放/暫停: 開始或停止模擬
  • 步進: 一次推進一代
  • 速度: 調整世代更迭的速度
  • 縮放: 更改網格大小(僅在暫停時)
圖案範例

嘗試預設圖案以查看不同的行為:

  • 滑翔機: 在網格上對角移動的圖案
  • 脈衝星: 以3代為週期振盪的大型圖案
  • 小型爆炸器: 向外混亂擴展的圖案