PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

Bingo #91

Open pilarserrats opened 4 weeks ago

pilarserrats commented 4 weeks ago

Buen día, quería consultar si la forma en que generé el cartón y saqué las bolillas es correcta. Sobre el resto del código no tengo ninguna duda en particular, lo probé varias veces y no encontré nada raro, pero si ven algún error agradezco la corrección.

#define CANT_BOLILLAS 90
#define COL 5
#define FIL 3

typedef  int TipoLinea[COL]; //vec de 5 int
typedef  TipoLinea TipoCarton[FIL]; //mat de 3x5

void generaCarton(TipoCarton carton); 
void imprimeCarton(TipoCarton carton); 
int jugar(int bolillero[], TipoCarton jug1, TipoCarton jug2); 
int sacarBolilla (int bolillero[], int * cantBolillas);
int controlaCarton(TipoCarton carton, int bolilla);
int buscarBolilla(TipoCarton carton, int bolilla);
int controlaLinea(TipoLinea fila);

int main(void) {
    srand(time(NULL));
    //primero armo los cartones
    TipoCarton Jug1, Jug2; 
    generaCarton(Jug1); 
    printf("Cartón 1: \n"); 
    imprimeCarton(Jug1); 
    generaCarton(Jug2); 
    printf("Cartón 2: \n");
    imprimeCarton(Jug2); 

    //Ahora ya puedo jugar
    int bolillero[CANT_BOLILLAS]; 
    for(int i = 0; i < CANT_BOLILLAS; ++i) {
        bolillero[i] = i + 1; 
    }
    int ganador = jugar(bolillero, Jug1, Jug2); 

    if(ganador == 3) {
        printf("Ha sido un empate\n"); 
    }
    else if(ganador == 1)
    printf("El ganador es el jugador 1\n"); 
    else 
    printf("El ganador es el jugador 2\n");
}

void generaCarton(TipoCarton carton) {
    int numeros[CANT_BOLILLAS]; //numeros entre 1 y 90
    for(int i = 0; i < CANT_BOLILLAS; ++i) {
        numeros[i] = i + 1;
    }

    int aux, nuevapos, cant = 0; 
    for(int i = 0; i < FIL; ++i) {
        for(int j = 0; j < COL; ++j) {
            nuevapos = randInt(0, CANT_BOLILLAS - 1 - cant);
            carton[i][j] = numeros[nuevapos];

            //Mando al final el numero que ya use para no usarlo mas
            aux = numeros[nuevapos]; 
            numeros[nuevapos] = numeros[CANT_BOLILLAS - 1 - cant]; 
            numeros[CANT_BOLILLAS - 1 - cant] = aux; 
            ++cant;
        }
    }
}

void imprimeCarton(TipoCarton carton) {
    for(int i = 0; i < FIL; ++i) {
        for(int j = 0; j < COL; ++j) {
            printf("%.2d ", carton[i][j]); 
        }
        printf("\n"); 
    }
    printf("\n");
}

int jugar(int bolillero[], TipoCarton jug1, TipoCarton jug2) {
    int gano1 = 0, gano2 = 0, cantBolillas = CANT_BOLILLAS; 
    int bolilla, fil_1, fil_2; 
    while(!gano1 && !gano2) {
        bolilla = sacarBolilla(bolillero, &cantBolillas); 
        printf("bolilla: %d\n", bolilla);
        fil_1 = controlaCarton(jug1, bolilla); 
        fil_2 = controlaCarton(jug2, bolilla); 
        if(fil_1 == 3) {
            gano1 = 1; 
        }
        if (fil_2 == 3) {
            gano2 = 1; 
        }
        printf("Carton 1: \n"); 
        imprimeCarton(jug1);
        printf("Carton 2: \n"); 
        imprimeCarton(jug2); 
    }

    if(gano1 && gano2) {
        return 3; 
    }
    else if(gano2) {
        return 2; 
    }
    return 1;
}

int sacarBolilla (int bolillero[], int * cantBolillas) {
    int lugarBolilla, aux, bolilla; 

    lugarBolilla = randInt(1, (*cantBolillas)); 
    bolilla = bolillero[lugarBolilla - 1]; 

    //lo mando al final para no usarlo mas
    aux = bolillero[(*cantBolillas) - 1];
    bolillero[(*cantBolillas) - 1] = bolillero[lugarBolilla - 1]; 
    bolillero[lugarBolilla - 1] = aux;

    --(*cantBolillas);
    return bolilla; 
}

int controlaCarton(TipoCarton carton, int bolilla) {
    int filasCompletadas = 0, aparece; 
    aparece = buscarBolilla(carton, bolilla);
    for(int i = 0; i < FIL; ++i) {
        if(controlaLinea (carton[i])) {
          ++filasCompletadas;
        }
    }
    return filasCompletadas; 
}

int buscarBolilla(TipoCarton carton, int bolilla) {
    int found = 0;
        for(int i = 0; i < FIL && !found; ++i) {
            for(int j = 0; j < COL && !found; ++j) {
                if(carton[i][j] == bolilla) {
                    carton[i][j] = 0; 
                    found = 1; 
                }
            }
        }
    return found; 
}

int controlaLinea(TipoLinea fila) {
    int completados = 0; 
    for(int j = 0; j < COL; ++j) {
        if(fila[j] == 0) {
                ++completados;
        }
    }
    return (completados == COL); 
}
marcelogarberoglio commented 4 weeks ago

Sí, está bien. Esta línea la podés sacar numeros[CANT_BOLILLAS - 1 - cant] = aux; lo mismo cuando extraés una bolilla del bolillero. Está de más.