PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

TP7_ej8 #80

Open mipipet opened 2 hours ago

mipipet commented 2 hours ago

Hola! Hice el ejercicio 8 (el bingo) y quería consultar si está bien y es eficiente. Muchas gracias!


#include <stdio.h>
#include <stdlib.h>
#include "getnum.h"
#include "random.h"

#define BOLILLAS 90
#define LONG_LINEA 5
#define LINEAS 3

typedef int tipoLinea[5]; 
typedef tipoLinea tipoCarton[3];

void generarCarton(tipoCarton carton);
int jugar(int * bolillero, tipoCarton  j1, tipoCarton j2); 
int sacarBolilla(int bolillero[], int * cantBolillas); 
int controlarCarton(tipoCarton  carton, int bolilla); 
void imprimirCarton(tipoCarton carton); 
int buscarBolilla(tipoCarton  carton, int bolilla); 
int controlarLineas(tipoLinea linea); 

int main(){

    int win;

    randomize();

    tipoCarton  j1 , j2; 

    generarCarton(j1); 
    generarCarton(j2);

    int bolillero[90]; 

    for(int i=0; i<90; i++){
        bolillero[i]=i+1; 
    }

    win=jugar(bolillero, j1, j2);

    if(win==3){
        printf("Ganaron ambos jugadores\n");
    }else if(win==2){
        printf("Ganó el jugador 2\n");
    }else{
        printf("Ganó el jugador 1\n");
    }

    return 0; 

}

void generarCarton(tipoCarton carton){
    int n; 
    int nums[BOLILLAS]; 
    int aux=BOLILLAS-1;

    for(int i=0; i<BOLILLAS; i++){
        nums[i]=i+1; 
    }

    for(int i=0; i<LINEAS; i++){
        for(int j=0; j<LONG_LINEA; j++){
            n=randInt(0,aux);
            carton[i][j]=nums[n];
            nums[n]=nums[aux--];
        }
    }

} 

int jugar(int * bolillero, tipoCarton  j1, tipoCarton j2){
    int bingo=0, lineas1=0, lineas2=0, bolilla, cantBolillas=90, huboLinea=0; 
    do
    {
        bolilla=sacarBolilla(bolillero, &cantBolillas); 

        lineas1=controlarCarton(j1, bolilla); 
        lineas2=controlarCarton(j2, bolilla); 

        if (!huboLinea)
        {
            if (lineas1 > 0)
                printf("El jugador 1 hizo linea\n");
            if (lineas2 > 0)
                printf("El jugador 2 hizo linea\n");
            huboLinea += lineas1 + lineas2;
        }

        imprimirCarton(j1); 
        putchar('\n');
        imprimirCarton(j2); 
        putchar('\n');
        printf("La bolilla extraída fue: %d\n", bolilla); 

        bingo = (lineas1 == 3) | 2 * (lineas2 == 3);

        while ((getchar()) != '\n') 
            ;  

    } while (bingo==0);

    return bingo; 
}

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

    int n=randInt(0, (*cantBolillas)-1); 
    bolilla=bolillero[n]; 
    bolillero[n]=bolillero[(*cantBolillas)-1]; 
    *cantBolillas=*cantBolillas-1 ; 
    return bolilla; 
}

int controlarCarton(tipoCarton  carton, int bolilla){
    int lineas=0; 

    if(buscarBolilla(carton, bolilla)){
        for(int i=0; i<LINEAS; i++){
            lineas+=controlarLineas(carton[i]); 
        }
    }

    return lineas; 
}

void imprimirCarton(tipoCarton carton){
    for(int i=0; i<LINEAS; i++){

        for(int j=0; j<LONG_LINEA; j++){
            if(carton[i][j]!=0){
                printf("%d\t", carton[i][j]); 
            }else{
                printf("%c\t", 'X'); 
            }
        }

        putchar('\n'); 
    }
    return; 
}

int buscarBolilla(tipoCarton  carton, int bolilla){
    int rta=0; 

    for(int i=0; i<LINEAS && !rta; i++){
        for(int j=0; j<LONG_LINEA && !rta; j++){
            if(carton[i][j]==bolilla){
                carton[i][j]=0; 
                rta=1; 
            }
        }
    }

    return rta; 
} 

int controlarLineas(tipoLinea linea){
    int ans=1; 
    for(int i=0; i<LONG_LINEA && ans; i++){
        if(linea[i]!=0){
            ans=0;
        }
    }
    return ans;
} 
marcelogarberoglio commented 2 hours ago

Está muy birn.

En vez de repetir este código

   for(int i=0; i<LINEAS; i++){
        for(int j=0; j<LONG_LINEA; j++){
            n=randInt(0,aux);
            carton[i][j]=nums[n];
            nums[n]=nums[aux--];
        }
    }

podrías reutilizar la función para mezclar que hicieron en el TP 6