← Blog

El Juego de la Vida de Conway

El Juego de la Vida de Conway es un ejemplo clásico de cómo la complejidad puede florecer a partir de unas pocas reglas simples. Imagina una cuadrícula infinita de celdas — cada una puede estar «encendida» (viva) o «apagada» (muerta). En cada turno (o «generación»), cada celda verifica cuántos vecinos están vivos. Si está demasiado poblada, muere. Si está demasiado aislada, también muere. Pero con exactamente tres vecinos, una celda muerta cobra vida.

Este simple conjunto de reglas lleva a comportamientos infinitamente fascinantes — desde formaciones estables y osciladores repetitivos, hasta «naves espaciales» autopropulsadas que atraviesan la cuadrícula. Es una demostración perfecta de cómo la complejidad puede surgir de la simplicidad, y es incluso Turing completo, lo que significa que puede, en teoría, simular cualquier computación.

Cómo funciona

Cargando tablero de juego...

Ejemplos de patrones

Estos patrones clásicos muestran el comportamiento emergente del juego. El «Glider» demuestra movimiento a través de la cuadrícula, el «Pulsar» crea una oscilación fascinante, y el «Small Exploder» muestra cómo formas simples pueden evolucionar hacia formas complejas.

El Algoritmo

En el corazón del Juego de la Vida hay unas pocas funciones elegantes que determinan la vida y la muerte en nuestro 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;
}
El algoritmo principal aplica las reglas de Conway a cada celda de la cuadrícula. En cada generación, verifica el estado de cada celda y su número de vecinos para determinar si vive, muere o cobra 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 la Regla 110 de Wolfram →
Cómo funciona

Seleccione cualquier área para crear grupos de células, o seleccione y arrastre para dibujar caminos vivos. Presione Reproducir para ver evolucionar su creación, o use Paso Adelante para avanzar una generación a la vez. Use Aleatorio para el caos, o Limpiar para empezar de nuevo.

Las Reglas

Cada célula sigue cuatro reglas simples en cada generación:

  • Subpoblación: Una célula viva con menos de 2 vecinos muere
  • Supervivencia: Una célula viva con 2 o 3 vecinos sobrevive
  • Superpoblación: Una célula viva con más de 3 vecinos muere
  • Reproducción: Una célula muerta con exactamente 3 vecinos cobra vida
Controles
  • Reproducir/Pausa: Iniciar o detener la simulación
  • Paso adelante: Avanzar una generación a la vez
  • Velocidad: Ajustar qué tan rápido pasan las generaciones
  • Zoom: Cambiar el tamaño de la cuadrícula (solo en pausa)
Ejemplos de patrones

Pruebe los patrones preestablecidos para ver diferentes comportamientos:

  • Planeador: Un patrón que se mueve diagonalmente por la cuadrícula
  • Pulsar: Un patrón grande que oscila con un período de 3 generaciones
  • Pequeño Explosivo: Un patrón que se expande hacia afuera caóticamente