Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ej Bingo #84

Open
ssommerr opened this issue Oct 4, 2024 · 5 comments
Open

Ej Bingo #84

ssommerr opened this issue Oct 4, 2024 · 5 comments

Comments

@ssommerr
Copy link

ssommerr commented Oct 4, 2024

Hola! Quería consultarles por el ejercicio del bingo, porque estoy pensando en una forma de hacerlo y no sé si sería conveniente y hay otra forma mejor que no se me ha ocurrido y me podrían decir:)
Les cuento mi idea: por cada bolilla encontrada en un tablero cambiar el número por un -1; los pros para este método son que no voy a tener que chequear cuando busque si es bingo o si hay lineas a ver si aparecen los numeros en el vector de bolillas sacadas. Pero a la vez se que cuando quede un solo número que falta sacar voy a estar recorriendo un vector entero que está lleno de -1s y no se que tan bueno está eso. Imprimiría solo en el caso que el num sea dif a -1 para mostrar las bolillas restantes. No se me ocurre por el momento otra forma más eficiente de hacerlo, me podrían orientar?
Graciaas!!

@marcelogarberoglio
Copy link
Member

No me queda claro a qué te referís cuando hablás del "tablero". Si es el cartón, está bien ir marcando con -1 los números que salieron. Si es el bolillero entonces no, porque cuando hayan salido más de la mitad lo más probable al elegir alguno al azar es que ya haya salido. Para el bolillero tendrías que aplicar alguna de las estrategias que comentamos en #75

@ImNotGone
Copy link
Contributor

Nada que ver pero en el ejercicio que hicimos hoy en la consulta virtual en el if del for donde haciamos

v[i] == v[j]

Va

aux == v[j]

@ssommerr
Copy link
Author

ssommerr commented Oct 5, 2024

Hola! Quería consultar si me podrían decir que opinan de este ejercicio; en una parte la de jugar, no supe bien como separar el back del front end y después no utilice el typedef dado porque me mareaba y me costaba pensarlo pero más allá de eso lo probé y me funcionó (no sé si se podría romper pero probé todas las partes que se podían aislar y funcionaban y despueés probé todo unido). Más allá de esto no sé que onda por la parte del estilo y de la eficiencia; por ejemplo cuando genero el tablero hago una función con varios fors anidados pero no cosnidero que de vueltas de más asique no estaría segura. Los dejo el cod por debajo:

#include <stdio.h>
#include <stdlib.h>

#include "random.h"
#define CANTBOLAS 90
#define FILAS 5
#define COLS 3



void generarcarton(int carton[][COLS])
{
    int repetido;
    for (int i=0 ; i<FILAS ; i++)
    {
        for (int j=0 ; j<COLS ; j++)
        {   do{
            repetido=0;
            carton[i][j]=randInt(1,90);
               for (int i2=0 ; i2<=i && repetido==0 ; i2++)
                {
                    for (int j2=0 ; j2<=j && repetido==0 ; j2++)
                    {  if (carton[i][j]==carton[i2][j2] && (i!=i2 || j!=j2))
                          repetido=1;
                        
                         }
                }
        }
            while(repetido==1);
        }
    }
    
}
int sacarbolilla( int bolillero[])
{
    int num, sacado;
    do
    {
        sacado=0;
        num=randInt(1,CANTBOLAS);
        if (bolillero[num]==1)
         sacado=1;
    }while(sacado==1);
    bolillero[num]=1;
    
    /*esta funcion va sacando de a una bolilla */
    return num; /*devuelve la bolilla sacada*/

}
int buscarbolilla(int numsacado, int carton[][COLS], int *posicioni)
{
    int  posicionj, encontrado=0;
    for (int i=0 ; i<FILAS && encontrado==0 ; i++)
    {
        for (int j=0 ; j<COLS && encontrado==0 ; j++)
        {
           if (numsacado==carton[i][j])
           {

            encontrado=1;
            *posicioni=i;
             posicionj=j;
           }
           
        }
    }
    if (encontrado==1)
    {
        carton[*posicioni][posicionj]=-1;
        return 1;

    }
    return 0;
}
int controlarlinea( int carton[],  int cols)
{
    int nocumple=0;
    for (int i=0 ; i<cols && nocumple==0 ; i++)
    {
        if (carton[i]!=-1)
         nocumple=1;
    }
    return (nocumple==0);
    

}
int controlarcarton(int numsacado,int carton[][COLS], int lineas)
{
    int posicioni=-1, *pposicioni=&posicioni ;
    if (buscarbolilla(numsacado, carton, pposicioni))
    {
     if(controlarlinea( carton[*pposicioni], COLS)) /* si encntro linea devuelve 0 por lo que entra*/
      /*controlaremos si fue bingo*/
      {
        (lineas)++;
      }


    }
    return lineas;
 
}
void imprimircarton( int carton[][COLS])
{
    for (int i=0 ; i<FILAS ; i++)
    {
        for (int j=0 ; j<COLS ; j++)
        {
            if(carton[i][j]!=-1)
             printf("%d"  , carton[i][j]);

        }
    }
}
void jugar(int bolillero[], int carton1[][COLS], int carton2[][COLS])
{
    int ganador=0,firstline=0, bolilla,cantbolillasrestantes=90,lineascompletas1=0, lineascompletas2=0;
    do
    {
        bolilla=sacarbolilla( bolillero);
        cantbolillasrestantes--;
       
        lineascompletas1=controlarcarton(bolilla,  carton1, lineascompletas1);
        lineascompletas2=controlarcarton(bolilla,   carton2, lineascompletas2);
        if (lineascompletas1==FILAS || lineascompletas2==FILAS)
        {
            ganador=1;
            if(lineascompletas1==FILAS)
             printf("El jugaor 1 gano");
            if(lineascompletas2==FILAS)
               printf("El jugaor 2 gano");
        }
        else 
        {
        if (firstline==0)
        {
        
            if (lineascompletas1==1)
             printf("Jugador 1 has conseguido la primer fila");
            if (lineascompletas2==1)
             printf("Jugador 1 has conseguido la primer fila");
            firstline=1;
        }
        
         imprimircarton(carton1);
         imprimircarton(carton2);
            
        }
        

    }
    while(ganador==0);



}
int main()
{
       srand(time(NULL));
    int *bolillero=calloc(90, sizeof(int));
    int carton1[5][3];
    int  carton2[5][3];
    generarcarton( carton1);
    generarcarton( carton2);
    jugar(bolillero,carton1,carton2);



}

@marcelogarberoglio
Copy link
Member

Para generar el cartón podés seguir lo que sugerimos en #75, que es una estrategia efectiva para generar en forma eficiente números aleatorios sin repetir en un rango acotado.
Deberías usar los typedef que están en el enunciado: TipoLine y TipoCarton

La función jugar está bien diseñada, es de front y llama a funciones del back para que armen los cartones, extraiga bolilla, controle líneas, etc.

En buscarBolilla te complicaste un poco creando un puntero de salida innecesario, y podrías marcarlo directamente cuando lo encontrás. Entiendo que el puntero lo hacés para decirle a quien la invocó cuál era la fila en la que salió la bolilla, y así recorra sólo esa fila y no todo el cartón, pero teniendo en cuenta que el cartón sólo tiene 15 números, yo no se si vale la pena.
Y en vez de hacer

if (numsacado==carton[i][j])
           {

            encontrado=1;
            *posicioni=i;
             posicionj=j;
           }

podrías hacer

if (numsacado==carton[i][j])       {
            carton[i][j] = -1;   // o usar un #define en vez de -1
            *posicioni=i;
             return 1;
           }

La separación entre front y back la veo bien

@ssommerr
Copy link
Author

ssommerr commented Oct 6, 2024

Genial! Ahora miro la estrategia del 75 para tenerla en cuenta y el cod para buscarbolilla, muchas gracias!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants