← Blog

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.

Como funciona

Carregando tabuleiro do jogo...

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;
}
O algoritmo central aplica as regras de Conway a cada célula na grade. Para cada geração, ele verifica o estado de cada célula e sua contagem de vizinhos para determinar se ela vive, morre ou ganha vida.
// 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;
}
Ver Rule 110 de Wolfram →
Como funciona

Selecione qualquer área para criar grupos de células, ou selecione e arraste para desenhar caminhos vivos. Pressione Play para assistir sua criação evoluir, ou use Avançar para progredir uma geração por vez. Use Aleatório para caos, ou Limpar para começar do zero.

As Regras

Cada célula segue quatro regras simples em cada geração:

  • Subpopulação: Uma célula viva com menos de 2 vizinhos morre
  • Sobrevivência: Uma célula viva com 2 ou 3 vizinhos sobrevive
  • Superpopulação: Uma célula viva com mais de 3 vizinhos morre
  • Reprodução: Uma célula morta com exatamente 3 vizinhos se torna viva
Controles
  • Play/Pausar: Iniciar ou parar a simulação
  • Avançar: Avançar uma geração por vez
  • Velocidade: Ajustar a rapidez das gerações
  • Zoom: Alterar o tamanho da grade (apenas quando pausado)
Exemplos de Padrões

Experimente os padrões predefinidos para ver diferentes comportamentos:

  • Glider: Um padrão que se move diagonalmente pela grade
  • Pulsar: Um padrão grande que oscila com um período de 3 gerações
  • Pequeno Exploder: Um padrão que se expande caoticamente para fora