¿Qué es el juego de la vida?
El juego de la vida es un autómata celular creado en 1970 por el matemático británico John Horton Conway. Este juego es de cero personas esto quiere decir que para interactuar con el se crean configuraciones iniciales y se observa como avanzan en tiempos discretos.
Reglas del juego
El juego representa seres vivos que interactúan entre si, se representa por medio de una malla cuadrada de dos dimensiones, y cada célula puede tener dos estados, vivo o muerto. El sistema avanza en estados discretos y el estado siguiente de cada célula depende de la cantidad de vecinos en un estado anterior.
Las reglas del juego son las siguientes.
Cada célula viva con menos de dos vecinos vivos, muere por desolación.
Cada célula viva con dos o tres vecinos vivos sobrevive al siguiente estado.
Cada célula viva con mas de tres vecinos vivos muere por sobre población.
Cada célula muerta con exactos tres vecinos vivos se convierte en una célula viva, por que se reproducen.
Juego de la vida en un cubo
[Imagen obtenida de: "http://aeytimes.com/files/1fbccafac86894e5.jpg" ]
El juego de la vida cambia cuando se presenta en tres dimensiones debido a que la cantidad de vecinos posible por cada célula aumenta , por tanto es necesario cambiar los rangos de vida o muerte de la función, para eso en una página (El enlance en referencias) encontré un método para hacer mas estable el cubo poniendo los rangos de vida y muerte en un vector con cuatro valores.
En este método una célula vive en el siguiente estado si la cantidad de vecinos es mayor igual a R[0] y menor igual a R[1] y estará muerto al siguiente estado si la suma de vecinos es mayor que R[2] y menor que R[3].
Materiales:
- 27 Leds (En este caso tenemos leds verdes claros)
- Cautín
- Estaño
- 9 resistencias de 220 Ohms
- 3 resistencias de 330 Ohms
- 3 transistores 2N2222
- Un trozo de madera
- PIC16F628A
- 7805-CT Regulador Tension 5V
Diagrama conexiones
[Imagen obtenida de: "http://www.instructables.com/files/deriv/FGC/TB26/GIYWWDPB/FGCTB26GIYWWDPB.MEDIUM.jpg"]
Funcionamiento
El cubo de Leds se construye por capa, donde cada capa tiene nueve Leds soldados unos con otros utilizando los alambres de sus cátodos, en los Leds que están encima de otros todos se encuentran soldados por su ánodo. Poniendo corriente negativa a cada nivel y positiva a cada ánodo de la capa base de el cubo para encender un solo led en cualquier nivel.
Cada ánodo(nueve) y cada cátodo(tres) del cubo esta conectada a un pin del PIC configurado como salida del PIC. Para encender un led se debe dar salida positiva en el pin del PIC a la columna del led y a su nivel. Para cerrar el circuito al darle salida positiva a los pins de los ánodos no hay ningún problema pero para los cátodos utilizo un transistor 2N2222 como un operador "AND", conectando el emisor al cátodo del nivel del cubo, el colector a la salida positiva del PIC asociada a el nivel y la base a tierra.
Código
#include "pic16f628a.h"
#define __16f628a
unsigned int __at 0x2007 __CONFIG = _INTOSC_OSC_CLKOUT &// Internal oscillator
_WDT_OFF&// No Watchdog
_LVP_OFF&// No Low-Volt Program.
_DATA_CP_OFF&// No Code Protect
_PWRTE_ON;
#define len 3
unsigned short int cube[len][len][len] = {{
{0, 0, 0},
{0, 1, 0},
{0, 0, 0}
},
{{0, 0, 0},
{0, 1, 0},
{0, 0, 0}
},
{{0, 0, 0},
{0, 1, 0},
{0, 0, 0}
}};
unsigned short int vecinos[len][len][len] = {{{0, 0, 0},{0, 0, 0},{0, 0, 0}},{{0, 0, 0},{0, 0, 0},{0, 0, 0}},{{0, 0, 0},{0, 0, 0},{0, 0, 0}}};
static unsigned short int R[] = {6,6,5,3};
unsigned short int i,j,l, z, d;
short int i2,j2,l2;
void calcular_vecinos(){
vecinos[i][j][l] = 0;
for( i2 = i-1; i2<=i+1; i2++){
for( j2 = j-1; j2<=j+1; j2++){
for( l2 = l-1; l2<=l+1; l2++){
if( (i2>=0) && (j2>=0) && (l2>=0) && (i2<3) && (j2<3) && (l2<3) ){
if( ( cube[i2][j2][l2] == 1 ) && ( (i2 != i) || (j2 != j) || (l2 != l) ) )
vecinos[i][j][l]++;
}
}
}
}
}
void siguiente_estado(void){
for( i = 0; i<3; i++){
for( j = 0; j<3; j++){
for( l = 0; l<3; l++){
calcular_vecinos();
}
}
}
for( i = 0; i<3; i++){
for( j = 0; j<3; j++){
for( l = 0; l<3; l++){
if( cube[i][j][l] == 1 ){
if( (vecinos[i][j][l] > R[2]) || (vecinos[i][j][l] < R[3]) )
cube[i][j][l] = 0;
}else{
if( (vecinos[i][j][l] >= R[0]) || (vecinos[i][j][l] <= R[1]) )
cube[i][j][l] = 1;
}
}
}
}
}
int main(void){
TRISB = 0x00; // Set port B as all outputs
TRISA = 0x00; // Set port A as all outputs
while(1){
for( z=0; z<20; z++){
for( i = 0; i<3; i++){
for( j = 0; j<3; j++){
for( l = 0; l<3; l++){
if( cube[i][j][l] == 1 ){
if( l == 0) PORTA = 0b00000010;
if( l == 1) PORTA = 0b00000100;
if( l == 2) PORTA = 0b00001000;
if(( i == 0)&&(j == 0)) PORTB = 0b00000001;
if(( i == 0)&&(j == 1)) PORTB = 0b00000010;
if(( i == 0)&&(j == 2)) PORTB = 0b00000100;
if(( i == 1)&&(j == 0)) PORTB = 0b00001000;
if(( i == 1)&&(j == 1)) PORTB = 0b00010000;
if(( i == 1)&&(j == 2)) PORTB = 0b00100000;
if(( i == 2)&&(j == 0)) PORTB = 0b01000000;
if(( i == 2)&&(j == 1)) PORTB = 0b10000000;
if(( i == 2)&&(j == 2)) PORTA = PORTA + 0b00000001;
for( d = 0; d<500; d++);
PORTB = PORTA = 0;
}
}
}
}
}
siguiente_estado();
}
return 0;
}
Video demostrando el funcionamiento.
Referencias:
http://www.bitstorm.org/gameoflife/
http://www.ibiblio.org/e-notes/Life/Game.htm
http://es.wikipedia.org/wiki/Juego_de_la_vida



Felicitaciones por tu diseño, podrías por favor subir un vídeo del funcionamiento del cubo y ampliar un poco mas la construcción del mismo,muchas gracias
ResponderBorrarmares.250@hotmail.com
electrosistemas.jimdo.com