He terminado ahora mismo una de las tantas versiones del juego de la vida. Soy un principiante en esto de la programacion, asi que seguro que habran cosas que se pueden mejorar.
Por el momento solo le he introducido un patro de todos los que hay.
Dejo aqui el codigo, y si ven alguna posible mejora, compartan ;)
Código C:
Ver original
//Se incluyen las librerias necesarias #include<stdio.h> #include<conio.h> #include<string.h> #include<stdlib.h> #include<time.h> /*Definimos las constantes, numero de filas y numero de columnas Gracias a ello, se puede montar una tabla de cualquier tamaño, manteniendo totalmente operativo el programa. Ademas definimos el porcentaje de poblacion como constante para modificarlo en cualquier momento*/ #define NFIL 20 #define NCOL 20 #define DISPERSA 10 #define NORMAL 25 #define DENSA 50 #define MASIFICADA 75 void Imprimir(int Matriz[NFIL][NCOL]){ //Declaración de variables int i,j; //Recorremos la matriz for(i=0;i<NFIL;i++){ for(j=0;j<NCOL;j++){ //Si es 0 la celula esta muerta, por lo que se imprime un punto if(Matriz[i][j]==0){ } //Si no, esta viva, por lo que se imprime un asterisco else{ } } //Salto de linea al llegar al final de la fila } } void Duplicar(int ori[NFIL][NCOL], int dest[NFIL][NCOL]){ //Recorremos la matriz for(int i=0;i<NFIL;i++) for(int j=0;j<NCOL;j++) //Copiamos la matriz origen en destino dest[i][j]=ori[i][j]; } void Refrescar(int Matriz[NFIL][NCOL]){ //Declaracion las variables int copiamatriz[NFIL][NCOL]; int NUMcelulasvivas=0,i,j; //Copiamos la matriz en una copia auxiliar Duplicar(Matriz, copiamatriz); for(i=0;i<NFIL;i++){ for(j=0;j<NCOL;j++){ //Control de las celulas vecinas vivas if(i>0 && j>0 && Matriz[i-1][j-1]==1){ NUMcelulasvivas++; } if(i>0 && Matriz[i-1][j]==1){ NUMcelulasvivas++; } if(i>0 && j<NCOL && Matriz[i-1][j+1]==1){ NUMcelulasvivas++; } if(j>0 && Matriz[i][j-1]==1){ NUMcelulasvivas++; } if(j<NCOL && Matriz[i][j+1]==1){ NUMcelulasvivas++; } if(i<NFIL && j>0 && Matriz[i+1][j-1]==1){ NUMcelulasvivas++; } if(i<NFIL && Matriz[i+1][j]==1){ NUMcelulasvivas++; } if(i<NFIL && j<NCOL && Matriz[i+1][j+1]==1){ NUMcelulasvivas++; } //Actuamos sobre las celulas en la copia de la matriz if(Matriz[i][j]==1){ //La celulas vivas con 2 o 3 celulas vivas pegadas, se mantiene vivas. if(NUMcelulasvivas==2 || NUMcelulasvivas==3){ copiamatriz[i][j]=1; } //Si no se cumple la condicion, mueren. else{ copiamatriz[i][j]=0; } } else{ //Las celulas muertas con 3 celulas vivas pegadas, resucitan. if(NUMcelulasvivas==3){ copiamatriz[i][j]=1; } } //Ponemos a 0 el contador NUMcelulasvivas=0; } } //Devolvemos los nuevos datos a la matriz original Duplicar(copiamatriz, Matriz); } void Resucitar(int Matriz[NFIL][NCOL]){ //Declaración de variables int i,j,a,b; do{ i=getche()-48; }while(i<1 || i>NFIL); do{ j=getche()-48; }while(j<1 || j>NCOL); //Copiamos la el valor de la celula, para poder revertir el cambio a=Matriz[i-1][j-1]; //Resucitamos la celula seleccionada Matriz[i-1][j-1]=1; Imprimir(Matriz); //Preguntamos si se desea mantener la seleccion //Limpiamos el buffer //Si no se mantiene, se devuelve el valor de la celula copiada anteriormente if(b=='n') Matriz[i-1][j-1]=a; } void Patron(int Matriz[NFIL][NCOL]){ //Se imprime el patron "Barco" (Boat) //Las posiciones se interpretan: Primer numero--> Fila, Segundo numero-->Columna Matriz[NFIL-(NFIL/2+1)][NCOL-(NCOL/2+1)]=1; //1 Posicion (1,1) del patron Matriz[NFIL-(NFIL/2+1)][NCOL-(NCOL/2)]=1; //2 Posicion (1,2) del patron Matriz[NFIL-(NFIL/2+1)][NCOL-(NCOL/2-1)]=0; //3 Posicion (1,3) del patron Matriz[NFIL-NFIL/2][NCOL-(NCOL/2+1)]=1; //4 Posicion (2,1) del patron Matriz[NFIL-(NFIL/2)][NCOL-(NCOL/2)]=0; //5 Posicion (2,2) del patron Matriz[NFIL-(NFIL/2)][NCOL-(NCOL/2-1)]=1; //6 Posicion (2,3) del patron Matriz[NFIL-(NFIL/2-1)][NCOL-(NCOL/2+1)]=0; //7 Posicion (3,1) del patron Matriz[NFIL-(NFIL/2-1)][NCOL-(NCOL/2)]=1; //8 Posicion (3,2) del patron Matriz[NFIL-(NFIL/2-1)][NCOL-(NCOL/2-1)]=0; //9 Posicion (3,3) del patron } void Juego(){ //Declaración de variables int poblacion,i,j,filas,columnas,repetir,confirmar; int Matriz [NFIL][NCOL]; //Menu inicial do{ do{ //Limpiamos el buffer //Limpiamos pantalla } //Solo son validos los valores correspondientes a las opciones del menu while(!(poblacion=='1' || poblacion=='2' || poblacion=='3' || poblacion=='4')); //Ponemos todas las celulas muertas inicialmente for(i=0;i<NFIL;i++){ for(j=0;j<NCOL;j++){ Matriz [i][j]=0; } } //Aplicamos los porcentajes de poblacion sobre el total de celulas if(poblacion=='1'){ poblacion=(((NFIL*NCOL)/100)*DISPERSA); } else if(poblacion=='2'){ poblacion=(((NFIL*NCOL)/100)*NORMAL); } else if(poblacion=='3'){ poblacion=(((NFIL*NCOL)/100)*DENSA); } else poblacion=(((NFIL*NCOL)/100)*MASIFICADA); //Modo aleatorio for(i=0;i<poblacion;i++){ //Si la celula esta muerta, la resucita if(Matriz [filas][columnas]==0){ Matriz[filas][columnas]=1; } /*Si ya estaba viva se mantiene, y no lo contamos como una posicion añadida, asi aseguramos que se impriman el numero de celulas vivas seleccionado. Por ello restamos uno al contador*/ else i--; } char letra; do{ do { Imprimir(Matriz); printf("\nPulse una tecla: \n[s] para salir \n[c] para revivir celula \n[f] para introducir forma"); //Opciones en el juego //Limpiamos el buffer if(letra=='s'){ Imprimir(Matriz); } else if(letra=='f'){ Patron(Matriz); } else if(letra=='c'){ Imprimir(Matriz); Resucitar(Matriz); } else{ Refrescar(Matriz); } }while(letra!='s'); //Confirmacion de salida, para prevenir equivocaciones }while(confirmar=='n'); //Opcion para volver a empezar, asi no hace falta salir del programa y volver a ejecutar //Limpiamos el buffer }while(repetir=='s'); } int main(){ //Iniciamos el juego Juego(); }
Un saludo