O Jogo da Vida de Conway
O Jogo da Vida de Conway é um exemplo clássico de como a complexidade pode florescer a partir de apenas algumas regras simples. Imagine uma grade infinita de células—cada uma pode estar "ligada" (viva) ou "desligada" (morta). A cada turno (ou "geração"), cada célula verifica quantos vizinhos estão vivos. Se estiver superlotada, ela morre. Se estiver muito isolada, também morre. Mas com exatamente três vizinhos, uma célula morta ganha vida.
Este conjunto simples de regras leva a comportamentos infinitamente fascinantes—desde formações estáveis e osciladores repetitivos, até "naves espaciais" autopropulsoras que atravessam a grade. É uma demonstração perfeita de como a complexidade pode surgir da simplicidade, e é até Turing completo, o que significa que pode, em teoria, simular qualquer computação.
Exemplos de Padrões
Estes padrões clássicos demonstram o comportamento emergente do Jogo. O "Glider" demonstra movimento através da grade, o "Pulsar" cria uma oscilação hipnotizante, e o "Small Exploder" mostra como formas simples podem evoluir para formas complexas.
O Algoritmo
Em sua essência, o Jogo da Vida funciona com apenas algumas funções elegantes que determinam a vida e a morte em nosso universo celular:
// 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;
}