-
Notifications
You must be signed in to change notification settings - Fork 0
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
Comments
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 |
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] |
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);
} |
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. 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. 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 |
Genial! Ahora miro la estrategia del 75 para tenerla en cuenta y el cod para buscarbolilla, muchas gracias!! |
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!!
The text was updated successfully, but these errors were encountered: