Conways Spiel des Lebens
Conways Spiel des Lebens ist ein klassisches Beispiel dafuer, wie Komplexitaet aus wenigen einfachen Regeln entstehen kann. Stellen Sie sich ein unendliches Gitter von Zellen vor - jede kann 'ein' (lebendig) oder 'aus' (tot) sein. In jeder Runde (oder 'Generation') prueft jede Zelle, wie viele Nachbarn leben. Bei Ueberbeveolkerung stirbt sie. Bei zu wenigen Nachbarn stirbt sie ebenfalls. Aber bei genau drei Nachbarn erwacht eine tote Zelle zum Leben.
Dieses einfache Regelwerk fuehrt zu endlos faszinierendem Verhalten - von stabilen Formationen und wiederkehrenden Oszillatoren bis hin zu selbstfortbewegenden 'Raumschiffen', die das Gitter durchqueren. Es ist eine perfekte Demonstration dafuer, wie Komplexitaet aus Einfachheit entstehen kann, und es ist sogar Turing-vollstaendig, kann also theoretisch jede Berechnung simulieren.
Musterbeispiele
Diese klassischen Muster zeigen das emergente Verhalten des Spiels. Der 'Glider' demonstriert Bewegung ueber das Gitter, der 'Pulsar' erzeugt eine faszinierende Oszillation, und der 'Small Exploder' zeigt, wie einfache Formen sich zu komplexen entwickeln koennen.
Der Algorithmus
Im Kern besteht das Spiel des Lebens aus wenigen eleganten Funktionen, die ueber Leben und Tod in unserem zellulaeren Universum entscheiden:
// 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;
}
// 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;
}