EJERCICIO BINGO EN C

Iniciado por inmajimenez, 3 Noviembre 2018, 12:26 PM

0 Miembros y 2 Visitantes están viendo este tema.

inmajimenez

Hola a todxs, estoy haciendo un ejercicicio de programacion del bingo en c y el ejercicio es el siguiente:
juegan dos jugarores a la vez, y tienen un carton cada uno. Cada carton tiene 3 filas y 5 valores por fila. los numeros estan en el rango [1,90]. tambien se generara una bola de rango [1,90], nunca repetidos.

1-al iniciar partida se reparten los cartones generados aleatoriamente.

2-sacar bola-> el programa genreara aleatoriamente un numero [1,90] que no haya salido a lo largo de la partida. una vez generado el numero se comprobara si ha habido linea o bingo, si hubo un empate o nada en caso contrario.
la linea se cantara una vez. el bingo consiste en haber acertado todos los numeros del carton.

3- imrpimir cartones, el programa mostrara por pantalla los booletos de cada jugador formateados, indicando con una X los numeros ya elimandos. por ejemplo:
13 X 56 4 5
12 X X 4 57
15 X 72 X 7
-----------------------
EL PROGRAMA QUE TENGO ES EL SIGUIENTE, PERO ANTES OS DIGO QUE EL PROBLEMA LE TENGO A LA HORA DE SACAR LAS X YA QUE TENGO CASI TODO METIDO EN DIFERENTES FUNCIONES Y NO SE COMO SE HARIA.
-----------------------------------------------------------------


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

#define FILAS_CARTON 3
#define NUMEROS_FILA 5
#define MAX_BOLAS 90
int carton_1[FILAS_CARTON][NUMEROS_FILA];
int carton_2[FILAS_CARTON][NUMEROS_FILA];
int bolas_bingo[MAX_BOLAS];
int elegir_opcion();
void imprimir_menu();
void rellenar_carton();
void rellenar_carton2();
void imprimir_carton();
void imprimir_carton2();
bool esta_repetido(int numero);
void generar_bola();

int main()

{
char* nom1,nom2;
int opcion;





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

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

    switch (opcion)

    {
        case 1:
            rellenar_carton();
            rellenar_carton2();

            break;

        case 2:
           generar_bola();
            break;

        case 3:

            imprimir_carton2();
            imprimir_carton();


            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 i,j,num;
    srand(getpid());
    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_1[j]=num;
             } else {
                j--;
            }


        }

    }


}

void imprimir_carton(){

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

        for(j=0;j<NUMEROS_FILA;j++){
             printf(" %d",carton_1[j]);
        }

                printf("\n");
        }

        printf("\n");
    }



bool esta_repetido(int numero){
     int i,j;

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


        }
     }
    return false;
}

void generar_bola(){
int bola;
    srand(getpid());

    bola=rand() % (90-1+1)+1;
    printf("%d",bola);
}
void rellenar_carton2(){
    int i,j,num;
    srand(getpid());
    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_2[j]=num;
             } else {
                j--;
            }


        }

        }

    }



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

        for(j=0;j<NUMEROS_FILA;j++){
             printf(" %d",carton_2[j]);
        }

        printf("\n");
    }


}

AlbertoBSD

Hace tiempo publique un video al respecto.

[youtube=640,360]https://www.youtube.com/watch?v=tiTKdqvoWvk[/youtube]
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

inmajimenez

ya, si su video le he visto pero en mi caso, cuando sale una bola, si el numero de la bola coincide con un numero del carton, en el carton tiene que imprimir una X en el lugar del numero.

PalitroqueZ

pregunta:

¿dónde está la función que evita que al volver a generar un numero aleatorio, no sea un número repetido?


"La Economía planificada lleva de un modo gradual pero seguro a la economía dirigida, a la economía autoritaria y al totalitarismo" Ludwig Erhard

AlbertoBSD

Cita de: PalitroqueZ en  4 Noviembre 2018, 18:21 PM
pregunta:

¿dónde está la función que evita que al volver a generar un numero aleatorio, no sea un número repetido?


Segun veo su codigo la funcion se llama "esta_repetido"

Pero veo que bastante INEFICIENTE esa funcion, recorre todo el arreglo cada vez que va a validar un numero.

Cita de: inmajimenez en  4 Noviembre 2018, 18:04 PM
ya, si su video le he visto pero en mi caso, cuando sale una bola, si el numero de la bola coincide con un numero del carton, en el carton tiene que imprimir una X en el lugar del numero.

Segun recuerdo en uno de los 2 videos hablo un poco de eso, basicamentre se trata de tener 2 o tal vez mas arreglos auxiliares

Uno para los numero que estan en el carton.

Uno para marcar los que numeros que ya salieron y entonces cuando hacemos el for para imprimir los numeros, Validamos primero si el numero Indice actual ya salio si ya salio imprimimos X y si no ha salido imprimimos el numero como tal.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

AlbertoBSD

#5
Descargar codigo en Ejemplo de Bingo marcando con X el carton - Programación Trabajos Escolares


Te escribi un pequeño ejemplo que hace lo que pides, la unica diferencia es que aqui manejo el carton como un Arreglo LINEAL.

Salida de Ejemplo:


C:\codigos>bingo.exe
Llenamos carton
El numero 34, se encuentra en el carton en la posicion 3
El numero 89, se encuentra en el carton en la posicion 9
El numero 65, se encuentra en el carton en la posicion 11
El numero 52, se encuentra en el carton en la posicion 5
El numero 14, se encuentra en el carton en la posicion 12
El numero 88, se encuentra en el carton en la posicion 10
El numero 11, se encuentra en el carton en la posicion 13
El numero 38, se encuentra en el carton en la posicion 6
40      35      1       X       50
X       X       85      54      X
X       X       X       X       73




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


int main() {
int carton[15];

int numeros_bingo[30];

int no_duplicados[90] = {0};
int esta_en_carton[90] = {0};
int indice_en_carton[90] = {0};
int marcar_con_X[90] = {0};

srand(time(NULL));

int i = 0,j,k,r;
printf("Llenamos carton\n");
i = 0;
do {
r = rand() % 90;
if(no_duplicados[r] == 0){
carton[i] = r;
esta_en_carton[r] = 1; //Bandera en la posicion del numero que si esta en el carton seteada a 1
indice_en_carton[r] = i++; //Guardamos en la posicion del numero que si este en el carton el valor del indice donde este mismo numero se encuentra en el carton
}
}while(i < 15);

memset(no_duplicados,0,sizeof(int)*90);

//Sacamos 30 numeros;
i = 0;
while(i < 30) {
do {
r = rand() % 90;
}while(no_duplicados[r] == 1);
no_duplicados[r] = 1;
numeros_bingo[i] = r;
i++;
}

//Ahora ya que tenemos los 30 numeros del bingo evaluamos el carton
i = 0;
while(i < 30) {
if(esta_en_carton[numeros_bingo[i]] == 1) { //Este if nos dice que numeros del bingo estan actualmente en el carton
marcar_con_X[numeros_bingo[i]] = 1;
printf("El numero %i, se encuentra en el carton en la posicion %i\n",numeros_bingo[i],indice_en_carton[numeros_bingo[i]]);

}
i++;
}

//Ahora imprimimos el carton
i = 0;
k = 0;
while(i < 3) {
j = 0;
while(j < 5) {
if(marcar_con_X[carton[k]] == 1){
printf("X\t");
}
else {
printf("%i\t",carton[k]);
}
k++;
j++;
}
printf("\n");
i++;
}
}

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

inmajimenez