viernes, 30 de agosto de 2013

Juego de la Vida

Juego de la Vida

Descripción

Diseñado en 1970 por John Conway, el juego de la vida es uno de los autómatas celulares más conocidos, que ha llamado la atención de los expertos, debido al comportamiento complejo de las células, derivado de unas sencillas reglas.
No tiene jugadores reales, el estado inicial determina los estados posteriores a partir de las siguientes reglas:
  1. De estar muerta, una célula con exactamente 3 células vecinas vivas, nace.
  2. Una célula viva con 2 o 3 células vecinas vivas se mantiene el siguiente estado, de lo contrario muere, por soledad o por superpoblación.

Código


#include<stdio.h> 
#include<time.h>

main(){
int maxi,maxj, i, j, vivas;
printf("Numero de columnas: "); scanf("%d",&maxj);
printf("Numero de filas: "); scanf("%d",&maxi);
int m[maxi][maxj],n[maxi][maxj]; //Declara los dos arreglos
srand(clock()); //semilla
for(i=0;i<maxi;i++){
 for(j=0;j<maxj;j++){
  m[i][j]=rand()%2; //valores random 
 }
}
while(1){ //ciclo de la vida
 system("cls"); //limpia la pantalla
 for(i=0;i<maxi;i++){ // ciclos for que imprimen la matriz
  for(j=0;j<maxj;j++){
   if(m[i][j]==1) printf("*"); //* si está vivo
   else printf(" "); //" " si está muerto
  }
  printf("\n");
 }
 usleep(50000); //detiene la ejecución
 for(i=0;i<maxi;i++){ // ciclos que recorren la matriz
  for(j=0;j<maxj;j++){ // para revisar los vecinos
  vivas=0; //se le sumará a vivas si el vecino está vivo
  if(i==0&&j==0){ //comparaciones para casos especiales
   if(m[i][j+1]==1)   vivas++;
   if(m[i+1][j]==1)   vivas++;
   if(m[i+1][j+1]==1) vivas++;
  }else{
   if(i==maxi&&j==maxj){ //esquina inf-der
    if(m[i-1][j-1]==1) vivas++;
    if(m[i-1][j]==1)   vivas++;
    if(m[i][j-1]==1)   vivas++;
   }else{
    if(i==maxi&&j==0){ //esquina
     if(m[i-1][j]==1)   vivas++;
     if(m[i-1][j+1]==1) vivas++;
     if(m[i][j+1]==1)   vivas++;
    }else{
     if(i==0&&j==maxj){
      if(m[i][j-1]==1)   vivas++;
      if(m[i+1][j-1]==1) vivas++;
      if(m[i+1][j]==1)   vivas++;
     }else{
      if(i==0){
       if(m[i][j-1]==1)   vivas++;
       if(m[i][j+1]==1)   vivas++;
       if(m[i+1][j-1]==1) vivas++;
       if(m[i+1][j]==1)   vivas++;
       if(m[i+1][j+1]==1) vivas++;
      }else{
       if(j==0){
        if(m[i-1][j]==1)   vivas++;
        if(m[i-1][j+1]==1) vivas++;
        if(m[i][j+1]==1)   vivas++;
        if(m[i+1][j]==1)   vivas++;
        if(m[i+1][j+1]==1) vivas++;
       }else{
        if(i==maxi){
         if(m[i-1][j-1]==1) vivas++;
         if(m[i-1][j]==1)   vivas++;
         if(m[i-1][j+1]==1) vivas++;
         if(m[i][j-1]==1)   vivas++;
         if(m[i][j+1]==1)   vivas++;
        }else{
         if(j==maxj){
          if(m[i-1][j-1]==1) vivas++;
          if(m[i-1][j]==1)   vivas++;
          if(m[i][j-1]==1)   vivas++;
          if(m[i+1][j-1]==1) vivas++;
          if(m[i+1][j]==1)   vivas++;
          }else{
          if(m[i-1][j-1]==1) vivas++;
          if(m[i-1][j]==1)   vivas++;
          if(m[i-1][j+1]==1) vivas++;
          if(m[i][j-1]==1)   vivas++;
          if(m[i][j+1]==1)   vivas++;
          if(m[i+1][j-1]==1) vivas++;
          if(m[i+1][j]==1)   vivas++;
          if(m[i+1][j+1]==1) vivas++;
          }
         }
        }
       }
      }
     }
    }
   } //fin del chequeo, aplica las reglas
   if(m[i][j]==0){  //si está muerta...
    if(vivas==3) n[i][j]=1; 
    else n[i][j]=0;
   }else{  //si está viva...
    if(vivas<2||vivas>3){ n[i][j]=0;}
    else {n[i][j]=1;}
   }
  }
 } //utilizó un buffer para modificar los datos, hay que depositarlos
 for(i=0;i<maxi;i++){
 for(j=0;j<maxj;j++){
  m[i][j]=n[i][j];
 }
 }
} 
}

Imágenes Juego de la Vida





Conclusión

La lógica del juego de la vida es simple, con unas pocas reglas se logran comportamientos interesantes para toda la matriz de células. Los resultados muestran comportamientos que logran hacer "eterna" la "vida" de las células. Muchos patrones se repiten y hacen vistoso y entretenido verlos.