El juego de la vida

Iniciado por Kenji-chan, 20 Noviembre 2016, 18:35 PM

0 Miembros y 1 Visitante están viendo este tema.

Kenji-chan

Hola disculpen alguin me podria ayudar con mi implementacion del juego de la vida de john conway, concretamente en la funcion comprobacion(), se agradece de ante mano.  ;D


//El juego de la vida

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

int columnas;

void gotoxy(int x,int y);
void dibujarrejilla(int fil, int col);
void dibujarCelula(int rejilla[][columnas], int filas, int col);
void llenarRejilla(int rejilla[][columnas], int filas, int col);
void comprobacion(int rejilla[][columnas], int filas, int col);

int main(){

   int filas, col;
   int i, j;

   printf("Coloque el numero de filas\n");
   scanf("%d", &filas);
   printf("Coloque el numero de columnas\n");
   scanf("%d", &col);

   columnas = col;

   int rejilla[filas][col];

   llenarRejilla(rejilla, filas, col);
   dibujarrejilla(filas, col);


   do{
   dibujarCelula(rejilla, filas, col);
   comprobacion(rejilla, filas, col);
   Sleep(1000);
   //getch();

   }while(1);

   getch();
   return 0;
}

void gotoxy(int x,int y){
     HANDLE hcon;
     hcon = GetStdHandle(STD_OUTPUT_HANDLE);
     COORD dwPos;
     dwPos.X = x;
     dwPos.Y= y;
     SetConsoleCursorPosition(hcon,dwPos);
}

void llenarRejilla(int rejilla[][columnas], int filas, int col){
   int i, j;

   srand(time(NULL));

    for(i=0; i<filas; i++){
       for(j=0; j<col; j++){
           rejilla[i][j]=rand()%2;
       }
    }

}

void dibujarrejilla(int fil, int col){
   int i, j;

   system("cls");

   for(i=0; i<fil; i++){
       for(j=0; j<col; j++){
           if(i==0){
               if(j==0){
                   gotoxy(i*2,j*2);
                   printf("%c%c",201,205);
               }else{
                   if((col-1) == j){
                      gotoxy(i*2,j*2);
                       printf("%c%c",200,205);
                       gotoxy(i*2,(j*2-1));
                       printf("%c",186);
                   }else{
                       gotoxy(i*2,j*2);
                       printf("%c%c",204,205);
                       gotoxy(i*2,(j*2-1));
                       printf("%c",186);
                   }
               }
           }else{
               if(j==0){
                   gotoxy(i*2,j*2);
                   printf("%c%c",203,205);
               }else{
                   if((col-1) == j){
                       gotoxy(i*2,j*2);
                       printf("%c%c",202,205);
                       gotoxy(i*2,(j*2-1));
                       printf("%c",186);
                   }else{
                       gotoxy(i*2,j*2);
                       printf("%c%c",206,205);
                       gotoxy(i*2,(j*2-1));
                       printf("%c",186);
                   }
               }
               if((fil-1) == i){
                       if(j==0){
                          gotoxy(i*2,j*2);
                           printf("%c ",187);
                       }else if((col-1) == j){
                           gotoxy(i*2,j*2);
                           printf("%c ",188);
                       }else{
                           gotoxy(i*2,j*2);
                           printf("%c ",185);
                       }
               }
           }
       }
   }



}

void dibujarCelula(int pos[][columnas], int filas, int col){
   int j, i;

   for(i=0; i<filas-1; i++){
       for(j=0; j<col-1; j++){
           if(pos[i][j] == 1){
               gotoxy((i*2)+1,(j*2)+1);
               printf("%c", 219);
           }else{
               gotoxy((i*2)+1,(j*2)+1);
               printf(" ");
           }
       }
   }

}

void comprobacion(int rejilla[][columnas], int filas, int col){
   int i, j, x, y, reja[filas][col], vivas;

   for(i=0; i<filas; i++){
       for(j=0; j<col; j++){
           if(rejilla[i][j] == 0){
               vivas = 0;
               for(x=0; x<3; x++){
                   for(y=0; y<3; y++){
                       if((i+1)-x == i && (j+1)-y == j){
                           reja[i][j] = rejilla[i][j];
                       }else if(rejilla[(i+1)-x][(j+1)-y] == 1){
                           vivas++;
                       }
                   }
               }
               if( vivas == 3){
                   reja[i][j] = 1;
               }
           }else if(rejilla[i][j] == 1){
               vivas = 0;
               for(x=0; x<3; x++){
                   for(y=0; y<3; y++){
                       if((i+1)-x == i && (j+1)-y == j){
                           reja[i][j] = rejilla[i][j];
                       }else if(rejilla[(i+1)-x][(j+1)-y] == 1){
                           vivas++;
                       }
                   }
               }
               if(vivas == 2 || vivas == 3){
                   reja[i][j] = 1;
               }else{
                   reja[i][j] = 0;
               }
           }
       }
   }

   for(i=0; i<filas; i++){
       for(j=0; j<col; j++){
           rejilla[i][j] = reja[i][j];
       }
   }

}

engel lex

que problema tienes en esa función?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Kenji-chan

#2
no ebalua correcta mente algunas celdas como x ejemplo devez en cuando me crea una celula donde no hay nada de vida o en las celulas que estan solas ai ariba no mueren por soledad

MOD: Imagen adaptada a lo permitido.

Kenji-chan

no se si sedeva a  que mi funcion no evalua si la comparacion esta fuera de la matriz, solo evalua si es 0 o 1

engel lex

#4
me parece tu codigo excesivamente anidado y complicado para algo simple...

void comprobacion(int rejilla[][columnas], int filas, int col){
   int i, j, x, y, reja[filas][col], vivas;

   for(i=0; i<filas; i++){
       for(j=0; j<col; j++){
           if(rejilla[i][j] == 0){
               vivas = 0;
               for(x=0; x<3; x++){
                   for(y=0; y<3; y++){
                       if((i+1)-x == i && (j+1)-y == j){
                           reja[i][j] = rejilla[i][j];
                       }else if(rejilla[(i+1)-x][(j+1)-y] == 1){
                           vivas++;
                       }
                   }
               }
               if( vivas == 3){
                   reja[i][j] = 1;
               }
           }else if(rejilla[i][j] == 1){
               vivas = 0;
               for(x=0; x<3; x++){
                   for(y=0; y<3; y++){
                       if((i+1)-x == i && (j+1)-y == j){
                           reja[i][j] = rejilla[i][j];
                       }else if(rejilla[(i+1)-x][(j+1)-y] == 1){
                           vivas++;
                       }
                   }
               }
               if(vivas == 2 || vivas == 3){
                   reja[i][j] = 1;
               }else{
                   reja[i][j] = 0;
               }
           }
       }
   }

   for(i=0; i<filas; i++){
       for(j=0; j<col; j++){
           rejilla[i][j] = reja[i][j];
       }
   }

}


por cosas de legibilidad lo cambiaría a
por otro lado no estoy seguro si compruebas los si está en el borde

void comprobacion(int rejilla[][columnas], int filas, int col){
   int i, j, reja[filas][col], vivas;

   for(i=0; i<filas; i++){
       for(j=0; j<col; j++){

           vivas = rejilla[i+0][j+0];
           if(i > 0){
               if(j > 0)
                   vivas += rejilla[i-1][j-1];
               
               vivas += rejilla[i-1][j+0];
               
               if(j < col -1)
                   vivas += rejilla[i-1][j+1];
           }

           if(j > 0)
               vivas += rejilla[i+0][j-1];
           
           vivas += rejilla[i+0][j+0];
           
           if(j < col -1)
               vivas += rejilla[i+0][j+1];

           if(i < filas-1){
               if(j > 0)
                   vivas += rejilla[i+1][j-1];
               
               vivas += rejilla[i+1][j+0];
               
               if(j < col -1)
                   vivas += rejilla[i+1][j+1];
           }

           reja[i][j] = 0;

           if(vivas == 2 || vivas == 3){
               reja[i][j] = 1;
           }
       }
   }

   for(i=0; i<filas; i++){
       for(j=0; j<col; j++){
           rejilla[i][j] = reja[i][j];
       }
   }

}
}
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Kenji-chan

ya lo he heco funcionar gracias por la ayuda
dejo el code por si alguien lo quiere probar.  ;D

//El juego de la vida

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

int columnas;

void gotoxy(int x,int y);
void dibujarrejilla(int fil, int col);
void dibujarCelula(int rejilla[][columnas], int filas, int col);
void llenarRejilla(int rejilla[][columnas], int filas, int col);
void comprobacion(int rejilla[][columnas], int filas, int col);

int main(){

    int i, j, filas, col;

    do{
        printf("Coloque el numero de filas\n");
        scanf("%d", &filas);
        if(filas<10 || filas>40) printf("intodusca un numero mayor que 9 o menor que 41\n");
    }while(filas<10 || filas>40);

    do{
        printf("Coloque el numero de columnas\n");
        scanf("%d", &col);
        if(col<10 || col>29) printf("intodusca un numero mayor que 9 o menor que 30\n");
    }while(col<10 || col>29);


    columnas = col;

    int rejilla[filas][col];

    llenarRejilla(rejilla, filas, col);
    dibujarrejilla(filas, col);


    do{
    dibujarCelula(rejilla, filas, col);
    comprobacion(rejilla, filas, col);
    Sleep(1000);
    //getch();

    }while(1);

    getch();
    return 0;
}

void gotoxy(int x,int y){
      HANDLE hcon;
      hcon = GetStdHandle(STD_OUTPUT_HANDLE);
      COORD dwPos;
      dwPos.X = x;
      dwPos.Y= y;
      SetConsoleCursorPosition(hcon,dwPos);
}

void llenarRejilla(int rejilla[][columnas], int filas, int col){
    int i, j;

    srand(time(NULL));

     for(i=0; i<filas; i++){
        for(j=0; j<col; j++){
            rejilla[i][j]=rand()%2;
        }
     }

}

void dibujarrejilla(int fil, int col){
    int i, j;

    system("cls");

    for(i=0; i<fil; i++){
        for(j=0; j<col; j++){
            if(i==0){
                if(j==0){
                    gotoxy(i*2,j*2);
                    printf("%c%c",201,205);
                }else{
                    if((col-1) == j){
                       gotoxy(i*2,j*2);
                        printf("%c%c",200,205);
                        gotoxy(i*2,(j*2-1));
                        printf("%c",186);
                    }else{
                        gotoxy(i*2,j*2);
                        printf("%c%c",204,205);
                        gotoxy(i*2,(j*2-1));
                        printf("%c",186);
                    }
                }
            }else{
                if(j==0){
                    gotoxy(i*2,j*2);
                    printf("%c%c",203,205);
                }else{
                    if((col-1) == j){
                        gotoxy(i*2,j*2);
                        printf("%c%c",202,205);
                        gotoxy(i*2,(j*2-1));
                        printf("%c",186);
                    }else{
                        gotoxy(i*2,j*2);
                        printf("%c%c",206,205);
                        gotoxy(i*2,(j*2-1));
                        printf("%c",186);
                    }
                }
                if((fil-1) == i){
                        if(j==0){
                           gotoxy(i*2,j*2);
                            printf("%c ",187);
                        }else if((col-1) == j){
                            gotoxy(i*2,j*2);
                            printf("%c ",188);
                        }else{
                            gotoxy(i*2,j*2);
                            printf("%c ",185);
                        }
                }
            }
        }
    }



}

void dibujarCelula(int pos[][columnas], int filas, int col){
    int j, i;

    for(i=0; i<filas-1; i++){
        for(j=0; j<col-1; j++){
            if(pos[i][j] == 1){
                gotoxy((i*2)+1,(j*2)+1);
                printf("%c", 219);
            }else{
                gotoxy((i*2)+1,(j*2)+1);
                printf(" ");
            }
        }
    }

}

void comprobacion(int rejilla[][columnas], int filas, int col){
    int i, j, x, y, reja[filas][col], vivas;

    for(i=0; i<filas-1; i++){
        for(j=0; j<col-1; j++){
            if(rejilla[i][j] == 0){
                vivas = 0;
                for(x=0; x<3; x++){
                    for(y=0; y<3; y++){
                        if((i+1)-x == -1 || (j+1)-y == -1 || (i+1)-x > filas-1 || (j+1)-y > col-1){
                            continue;
                        }else if((i+1)-x == i && (j+1)-y == j){
                            reja[i][j] = rejilla[i][j];
                        }else if(rejilla[(i+1)-x][(j+1)-y] == 1){
                            vivas++;
                        }
                    }
                }
                if( vivas == 3){
                    reja[i][j] = 1;
                }
            }else if(rejilla[i][j] == 1){
                vivas = 0;
                for(x=0; x<3; x++){
                    for(y=0; y<3; y++){
                        if((i+1)-x == -1 || (j+1)-y == -1 || (i+1)-x > filas-1 || (j+1)-y > col-1){
                            continue;
                        }else if((i+1)-x == i && (j+1)-y == j){
                            reja[i][j] = rejilla[i][j];
                        }else if(rejilla[(i+1)-x][(j+1)-y] == 1){
                            vivas++;
                        }
                    }
                }
                if(vivas == 2 || vivas == 3){
                    reja[i][j] = 1;
                }else{
                    reja[i][j] = 0;
                }
            }
        }
    }

    for(i=0; i<filas; i++){
        for(j=0; j<col; j++){
            rejilla[i][j] = reja[i][j];
        }
    }

}