Reglas del Juego de la Vida
El Juego de la Vida es un automata celular en una cuadricula 2D donde cada celda tiene estado s ∈ {0,1}. La evolucion depende solo del estado de sus 8 vecinos.
N(x,y) = Σ s(x+dx, y+dy)
donde (dx,dy) ∈ {-1,0,1}² \ {(0,0)}
R1 - Soledad
Si s(x,y)=1 y N(x,y) < 2, entonces s'(x,y)=0. Una celula viva con menos de 2 vecinos muere.
R2 - Supervivencia
Si s(x,y)=1 y N(x,y) ∈ {2,3}, entonces s'(x,y)=1. Una celula viva con 2 o 3 vecinos sobrevive.
R3 - Superpoblacion
Si s(x,y)=1 y N(x,y) > 3, entonces s'(x,y)=0. Una celula viva con mas de 3 vecinos muere.
R4 - Reproduccion
Si s(x,y)=0 y N(x,y)=3, entonces s'(x,y)=1. Una celula muerta con exactamente 3 vecinos nace.
En notacion B/S, Conway se expresa como B3/S23.
Conceptos matematicos
Funcion de transicion
La regla global es una funcion determinista T: {0,1}^(Z²) -> {0,1}^(Z²) que opera en paralelo sobre todo el espacio.
s'(x,y) = T(s(x,y), N(x,y))
T(1, n) = 1 si n ∈ {2,3}
T(0, n) = 1 si n = 3
T(*, n) = 0 en otro caso
Completitud de Turing
El Juego de la Vida es Turing-completo: puede simular cualquier maquina de Turing. Esto fue demostrado usando Glider Guns como compuertas logicas.
Entropia y densidad
La densidad optima inicial esta cerca de 37%. Densidades menores a 10% o mayores a 60% tienden a extinguirse rapidamente.
ρ(t) = |{(x,y) : s_t(x,y)=1}| / (W × H)
Tipos de patrones
- Still life: patrones estaticos que no cambian.
- Oscilador: patrones con periodo
P >= 2 que regresan a su estado inicial.
- Spaceship: patrones que se desplazan en la cuadricula.
Vecindad de Moore
Los 8 vecinos forman la vecindad de Moore de radio 1. Es el estandar en el Juego de la Vida, a diferencia de la vecindad de Von Neumann con 4 vecinos.
Stack tecnico
Canvas API 2D
El render usa ImageData para escribir pixeles directamente en el buffer, evitando miles de llamadas drawRect por celda.
Typed Arrays
El estado se guarda en Uint8Array con doble buffer current/next. Las celdas se indexan como:
i(x, y) = y × cols + x
requestAnimationFrame
El loop desacopla actualizacion y render. La simulacion avanza a la velocidad configurada con Gen/s y el canvas se mantiene responsivo.
Double buffering
Todos los cambios se calculan sobre un buffer secundario antes de reemplazar el principal. Esto garantiza que cada generacion use el estado t, no una mezcla parcial de t y t+1.