PI-ITBA / 2024_01

8 stars 0 forks source link

Practica 6 EJ 34 (juego de la vida) #124

Closed Alang04 closed 2 months ago

Alang04 commented 5 months ago

Buenas, tengo una duda porque no encuentro el error (ignoren los comentarios con printfs) de porque la matriz que devuelvo solo devuelve la primer fila cambiada bien y el resto de la matriz en 0


#include <stdio.h>
#include <assert.h>
#define FILS 4
#define COLS 4
#define DIRS 8
#define VIVA 1
#define MUERTA 0

int nextStep(char cells[FILS][COLS]);
int vivaOMuerta(char cells[FILS][COLS],int i,int j,char matrizAux[FILS][COLS]);

int main(void) {
    char cells[FILS][COLS] =
            { {0,1,0,0},
              {1,1,1,1},
              {0,1,1,0},
              {1,0,0,1} };

    assert(nextStep(cells)==1);

    char expected[FILS][COLS] =
            { {1,1,0,0},
              {1,0,0,1},
              {0,0,0,0},
              {0,1,1,0} };
    for (int i=0; i < 4; i++)
        for(int j=0; j < 4; j++)
            assert(cells[i][j] == expected[i][j]);

    char cells2[FILS][COLS] =
            {{0,1,1,0},
             {0,1,1,0},
             {0,0,0,0},
             {0,0,0,0} };
    assert(nextStep(cells2)==0);

    char expected2[FILS][COLS] =
            { {0,1,1,0},
              {0,1,1,0},
              {0,0,0,0},
              {0,0,0,0} };

    for (int i=0; i < 4; i++)
        for(int j=0; j < 4; j++)
            assert(cells2[i][j] == expected2[i][j]);

    puts("OK!");

    return 0;
}

int nextStep(char cells[FILS][COLS]){
    int change=0;
    char matrizAux[FILS][COLS];
    for(int i=0;i<FILS;i++){
        for(int j=0;j<COLS;j++){
            if(vivaOMuerta(cells,i,j,matrizAux)){
                change=1;
            }
        }
    }
    /*for(int i=0;i<FILS;i++){
        printf("\n");
        for(int j=0;j<COLS;j++){
            printf("%d\t", cells[i][j]);}}*/
    cells=matrizAux;
    /*for(int i=0;i<FILS;i++){
        printf("\n");
        for(int j=0;j<COLS;j++){
            printf("%d\t", cells[i][j]);}}*/
    return change;
}

int vivaOMuerta(char cells[FILS][COLS],int i,int j,char matrizAux[FILS][COLS]){
    int pi[DIRS]={0,1,1,1,0,-1,-1,-1};
    int pj[DIRS]={1,1,0,-1,-1,-1,0,1};
    int cont=0;
    //printf("auxij %d \n",matrizAux[i][j]);
    for(int a=0; a<DIRS;a++){
        if( (pi[a]+i) < FILS && (pi[a]+i)>=0 && (pj[a]+i)<COLS && (pj[a]+i)>=0 && cells[pi[a]+i][pj[a]+j]){
            cont++;
        }
    }
    if(cells[i][j]==1 && (cont>=4 || cont <=1)){
        matrizAux[i][j]=MUERTA;
        //printf("auxij2a %d \n",matrizAux[i][j]);
        return 1;
    }
    else if(cells[i][j]==0 && cont==3){
        matrizAux[i][j]=VIVA;
        //printf("auxij2b %d \n",matrizAux[i][j]);
        return 1;
    }
    else{
        //printf("cellij1 %c \n",1);
        matrizAux[i][j]=cells[i][j];
        //printf("cellij2 %d \n",cells[i][j]);
        //printf("auxij2c %d \n",matrizAux[i][j]);
        return 0;
    }//printf("no salto ningun if \n");
}
marcelogarberoglio commented 5 months ago

No sirve hacer cells=matrizAux; sólo estás cambiando una variable local, tenés que copiar toda la matriz Por otro lado, te complicaste demasiado, no es necesario un vector de movimientos, sólo tenés que contar los valores que hay alrededor.