bingo resuelto

Iniciado por inmajimenez, 19 Noviembre 2018, 12:37 PM

0 Miembros y 1 Visitante están viendo este tema.

inmajimenez

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define FILAS_CARTON 3
#define NUMEROS_FILA 5
#define MAX_BOLAS 90

void rellenar_carton(int carton [FILAS_CARTON][NUMEROS_FILA]);
bool esta_repetido(int numero,int carton[FILAS_CARTON][NUMEROS_FILA]);
int elegir_opcion();
void imprimir_menu();
void imprimir_carton(int carton[FILAS_CARTON][NUMEROS_FILA]);
int generar_bola(int bolas_bingo[MAX_BOLAS]);
bool esta_bola_reptida(int bola, int bolas_bingo[MAX_BOLAS]);
void tachar_bola_carton(int carton[FILAS_CARTON][NUMEROS_FILA],int bola);
bool comprobar_bingo(int carton[FILAS_CARTON][NUMEROS_FILA]);
bool comprobar_linea(int carton[FILAS_CARTON][NUMEROS_FILA]);
void guardar_carton(char numero_carton[1], int carton[FILAS_CARTON][NUMEROS_FILA]);
void guardar_bolas(int bolas_bingo[MAX_BOLAS]);
void cargar_partida(int carton_1[FILAS_CARTON][NUMEROS_FILA], int carton_2[FILAS_CARTON][NUMEROS_FILA],int bolas_bingo[MAX_BOLAS]);


int main()

{

    int carton_1[FILAS_CARTON][NUMEROS_FILA];
    int carton_2[FILAS_CARTON][NUMEROS_FILA];
    int bolas_bingo[MAX_BOLAS];
     char* nom1,nom2;
     int opcion,bola;

srand(getpid());


cargar_partida(carton_1,carton_2,bolas_bingo);

printf(" nombre jugador 1\t");
scanf("%s",&nom1);
printf("\n nombre jugador 2\t");
scanf("%s",&nom2);
opcion=1;



while(opcion!=0)  {
        imprimir_menu();
        opcion=elegir_opcion();

    switch (opcion)

    {
        case 1:
            rellenar_carton(carton_1);
            guardar_carton("1",carton_1);
            rellenar_carton(carton_2);
            guardar_carton("2",carton_2);

            break;

        case 2:

            bola=generar_bola(bolas_bingo);
            tachar_bola_carton(carton_1,bola);
            tachar_bola_carton(carton_2,bola);
            guardar_bolas(bolas_bingo);
            guardar_carton("1",carton_1);
            guardar_carton("2",carton_2);
            comprobar_linea(carton_1);
            comprobar_linea(carton_2);

            if(comprobar_bingo(carton_1)){
                printf(" \t el jugador 1 ha ganado");

                if (comprobar_bingo(carton_2)){
                    printf("\t el jugador 2 ha ganado");
                }
            } else
                {printf("\t empate");
                }

            break;

        case 3:
            imprimir_carton(carton_1);
            imprimir_carton(carton_2);

            break;

        case 4:

            break;

    }

}

    return 0;
}


void imprimir_menu(){
    printf("\n--------JUEGO DEL BINGO-----");
    printf("\n\t 1. generar cartones");
    printf("\n\t 2. generar bola");
    printf("\n\t 3. imrpimir cartones");
    printf("\n\t 0. salir de la aplicacion");
    printf("\n----------------------------");

}

int elegir_opcion(){
    int opcion;
    printf("\n elegir opcion");
    scanf("%d",&opcion);

    return opcion;
}

void rellenar_carton(int carton [FILAS_CARTON][NUMEROS_FILA]){
    int i,j,num;

    for(i=0;i<FILAS_CARTON;i++){

        for(j=0;j<NUMEROS_FILA;j++){

             num=rand() % (90-1+1)+1;
             if (!esta_repetido(num,carton)){
                 carton[i][j]=num;
             } else {
                j--;
            }


        }

    }


}

void imprimir_carton(int carton[FILAS_CARTON][NUMEROS_FILA]){

    int i,j;
    for(i=0;i<FILAS_CARTON;i++){

        for(j=0;j<NUMEROS_FILA;j++){
             if (carton[i][j]==-1){
                printf(" X ");
             }
             else {
                 printf(" %d",carton[i][j]);
             }

        }

                printf("\n");
    }

        printf("\n");
    }



bool esta_repetido(int numero,int carton[FILAS_CARTON][NUMEROS_FILA]){
     int i,j;

     for(i=0;i<FILAS_CARTON;i++){
        for(j=0;j<NUMEROS_FILA;j++){
            if(carton[i][j]==numero){
                return true;
            }

        }
     }
    return false;
}

int generar_bola(int bolas_bingo[MAX_BOLAS]){
int bola;
bola=rand() % (90-1+1)+1;
  while (esta_bola_reptida( bola,  bolas_bingo)){

         printf("\n desechamos %d",bola);
         bola=rand() % (90-1+1)+1;
    }
    printf("\n cinfirmamos %d",bola);
    bolas_bingo[bola-1]=-5;
return bola;
}

bool esta_bola_reptida(int bola, int bolas_bingo[MAX_BOLAS]){
    int i;

        if (bolas_bingo[bola-1]==-5){
            return true;
        }

    return false;

}

void tachar_bola_carton(int carton[FILAS_CARTON][NUMEROS_FILA],int bola){
    int i,j;
    for(i=0;i<FILAS_CARTON;i++){
        for(j=0;j<NUMEROS_FILA;j++){
            if(carton[i][j]==bola){
                carton[i][j]=-1;
            }


        }
     }



}
bool comprobar_bingo(int carton[FILAS_CARTON][NUMEROS_FILA]){

    int i,j;
    for(i=0;i<FILAS_CARTON;i++){
        for(j=0;j<NUMEROS_FILA;j++){
            if(carton[i][j]!=-1){

                return false;
            }


        }
     }
     printf("\n hay bingo");
return true;



}
bool comprobar_linea(int carton[FILAS_CARTON][NUMEROS_FILA]){
bool hay_linea=true;
int i,j;
    for(i=0;i<FILAS_CARTON;i++){

            hay_linea=true;

        for(j=0;j<NUMEROS_FILA;j++){
            if(carton[i][j]!=-1){
                hay_linea=false;

            }


        }
        if(hay_linea==true){
            printf("\n hay linea");
            return true;
        }

     }
     printf("\n no hay linea");
return false;

}

void guardar_carton(char numero_carton[1], int carton[FILAS_CARTON][NUMEROS_FILA]){
    int i,j,cont;


    char nom_fichero[8]="carton";

    FILE *fp;



    strcat(nom_fichero,numero_carton);

    fp=fopen(nom_fichero,"w+");
     for(i=0;i<FILAS_CARTON;i++){
        for(j=0;j<NUMEROS_FILA;j++){
           fprintf(fp,"%d\n",carton[i][j]);



        }
     }


    fclose(fp);
}
void guardar_bolas(int bolas_bingo[MAX_BOLAS]){
    int i,j,cont;


    char nom_fichero[8]="bolas";

    FILE *fp;





    fp=fopen(nom_fichero,"w+");
     for(i=0;i<MAX_BOLAS;i++){
        if (bolas_bingo[i]!=-5)
            fprintf(fp,"%d ",i+1);
        else
           fprintf(fp,"%d\n",bolas_bingo[i]);

     }


    fclose(fp);
}
void cargar_partida(int carton_1[FILAS_CARTON][NUMEROS_FILA], int carton_2[FILAS_CARTON][NUMEROS_FILA],int bolas_bingo[MAX_BOLAS] ){
FILE *fp;
char numero[6];
int i=0,j=0;

  fp=fopen("carton1","r");

  if(fp==NULL){
    printf("no hay datos, genere cartones\n\n");
  }
  else {
    while (feof(fp)==0){

        fgets(numero,6,fp);
        carton_1[i][j]=atoi(numero);
        j++;
        if(j==5){
            j=0;
            i++;
        }
    }
  }
  fclose(fp);

i=0;
j=0;

fp=fopen("carton2","r");

  if(fp==NULL){
    printf("no hay datos, genere cartones\n\n");
  }
  else {
    while (feof(fp)==0){

        fgets(numero,6,fp);
        carton_2[i][j]=atoi(numero);
        j++;
        if(j==5){
            j=0;
            i++;
        }
    }
  }
  fclose(fp);

}




Aqui os dejo el ejercicio de bingo resuelto hecho a mi manera que seguramente haya maneras mejores. pero esta es mi manera, espero que os sea util.

MOD: Etiquetas GeSHi. Texto a minusculas.

MAFUS

Siempre que subas un código mételo entre las etiquetas generadas por el desplegable 'Código GeSHi' que tienes en las herramientas de edición, encima del recuadro donde escribes.

Si el código es un snippet basta que uses el botón #.

Serapis

Para cumplir la tarea, vale... pero lamentablemente rellenar un cartón es un poco más complicado.

Verás, para un bingo, cuando emite cartones, emite como mínimo 6 cartones de 15 bolas (para el bingo de 90 bolas). Eso queire decir que las 90 bolas deben repartirse entre los 6 cartones, si no se cumple tal condición, los cartones estarían 'trucados'.
Además para cada cartón debe haber bolas de todas las decenas (9 bolas), y las otras 6 bolas son de 6 decenas distintas. Es decir ningún cartón puede tener más de dos bolas de una misma decena, y debe tener bolas de cada decena, esto garantiza lo dicho anteriormente, pués es otra forma de decir lo mismo.

Por tanto para hacer el reparto, justo, primero debe crearse un array de 90 bolas (1 al 90, ó 0 al 89)y ser barajado, por decenas (1-10, 11-19, etc..), es entonces cuando puedes hacer el reparto... de las 90 bolas entre los 6 cartones, eliges al azar para cada decena una bola de las que queden en esa decena, con cada elección bajas las bolas de encima (de esa misma decena) y restas una bola a dicha decena. Así ya has elegido las 9 primeras, las otras 6 lo harás eleigiendo al azar la decena (estas 6 no pueden repetirse entre sí), antes de elegir una bola en esa decena entre las que resten. Luego se complica porque para algunas decenas ya se han elegido suficientes, y el reparto debe ser equitativo, etc ...al repartir para 5 cartones, las que quedan son el 6º cartón...
En fin, que es algo más complicado que simplemente elegir al azar 15 bolas, si se pretende que no haya parcialidad.