康威生命遊戲
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;
}