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

TP7_EJ8 #89

Open
MarrMalleville opened this issue Oct 6, 2024 · 3 comments
Open

TP7_EJ8 #89

MarrMalleville opened this issue Oct 6, 2024 · 3 comments

Comments

@MarrMalleville
Copy link

MarrMalleville commented Oct 6, 2024

Buenas noches! Esta es mi version del ejercicio BINGO. Mi problema esta en que deberia haber un ganador siempre y no sucede. Le puse un limite de 90 rondas pero nunca llega a un ganador antes de las 90. se que el error debe ser el tema de menter el mismo numero al bolillero pero no se como solucionarlo. GRACIAS POR LEER

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

#define MAX 89
#define MIN 0
#define DIM_BOL 90
#define LINES 5
#define DIM_CARTON 15

#define P1 1
#define P2 2
#define ANY 0

typedef int TipoLinea[5];
typedef TipoLinea TipoCarton[3];

void generarCarton(TipoCarton cartonRand, int bolillero[]);
int jugar(int bolillero[], TipoCarton jugador1, TipoCarton jugador2, unsigned int *cantBolillas);
int sacarBolilla(int bolillero[], unsigned int *Pcantbolillas);
int controlarCarton(TipoCarton carton, int bolilla);
int buscarBolilla(TipoCarton carton, int bolilla);
int controlarLineas(TipoLinea linea);
void imprimirCarton(TipoCarton carton);

int main(void) {
    randomize();

    TipoCarton player1;
    TipoCarton player2;
    int vecBolillero[DIM_BOL];
    int flag = ANY;
    int gamePlay;
    int ronda = 1;
    unsigned int cantBolillas = DIM_BOL;  // Cantidad de bolillas restantes

    // Inicializar el bolillero con numeros del 1 al 90
    for (int i = 0; i < DIM_BOL; i++) {
        vecBolillero[i] = i + 1;
    }

    generarCarton(player1, vecBolillero);
    generarCarton(player2, vecBolillero);

    // Bucle del juego hasta que haya un ganador
    while (flag == ANY && cantBolillas > 0) {
        printf("Ronda: %d\n", ronda++);

        gamePlay = jugar(vecBolillero, player1, player2, &cantBolillas);

        if (gamePlay == P1) {
            flag = P1;
            printf("Jugador 1 ha ganado!\n");
        } else if (gamePlay == P2) {
            flag = P2;
            printf("Jugador 2 ha ganado!\n");
        }
    }

    if (cantBolillas == 0 && flag == ANY) {
        printf("Se acabaron las bolillas y no hubo ganador!\n");
    }

    return 0;
}

void generarCarton(TipoCarton cartonRand, int bolillero[]) {
    int indice;

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 3; j++) {
            indice = randInt(MIN, MAX - i);  // Indice aleatorio
            cartonRand[i][j] = bolillero[indice];  // Asignar bolilla al carton
            bolillero[indice] = bolillero[MAX - i];  // Actualizar bolillero
        }
    }
}

int jugar(int bolillero[], TipoCarton jugador1, TipoCarton jugador2, unsigned int *cantBolillas) {
    int winner = ANY;
    int p1 = 0;
    int p2 = 0;

    int num = sacarBolilla(bolillero, cantBolillas);  // Extraer una bolilla
    printf("Bolilla extraida: %d\n", num);

    p1 = controlarCarton(jugador1, num);  // Controlar bolilla para jugador 1
    p2 = controlarCarton(jugador2, num);  // Controlar bolilla para jugador 2

    // Verificar si hay ganador
    if (p1 == LINES) {
        winner = P1;
    } else if (p2 == LINES) {
        winner = P2;
    }

    imprimirCarton(jugador1);
    putchar('\n');
    imprimirCarton(jugador2);

    return winner;
}

int sacarBolilla(int bolillero[], unsigned int *Pcantbolillas) {
    int bolitaExtraida = randInt(MIN, *Pcantbolillas - 1);  // Generar indice aleatorio
    int bolilla = bolillero[bolitaExtraida];  // Extraer la bolilla del bolillero

    bolillero[bolitaExtraida] = bolillero[*Pcantbolillas - 1];  // Intercambiar con la ultima bolilla disponible
    (*Pcantbolillas)--;  // Reducir la cantidad de bolillas disponibles

    return bolilla;  // Retornar la bolilla extraida
}


int controlarCarton(TipoCarton carton, int bolilla) {
    int cantLineas = 0;

    buscarBolilla(carton, bolilla);  // Marcar si la bolilla esta en el carton

    // Controlar lineas completas
    for (int i = 0; i < 3; i++) {  // Controlar las 3 lineas del carton
        if (controlarLineas(carton[i])) {
            cantLineas++;
        }
    }

    return cantLineas;
}

int buscarBolilla(TipoCarton carton, int bolilla) {
    int esta = 0;

    // Buscar bolilla en el carton
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 3; j++) {
            if (carton[i][j] == bolilla) {
                carton[i][j] = -1;  // Marcar la bolilla encontrada
                esta = 1;
            }
        }
    }

    return esta;
}

int controlarLineas(TipoLinea linea) {
    int completa = 0;

    // Verificar si una linea esta completa
    for (int i = 0; i < 5; i++) {  // Controlar todas las posiciones de la linea
        if (linea[i] == -1) {
            completa++;
        }
    }

    return (completa == 5);  // Retorna verdadero si la linea esta completa
}

void imprimirCarton(TipoCarton carton) {
    // Imprimir el carton
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 3; j++) {
            if (carton[i][j] == -1) {
                printf(" X\t");
            } else {
                printf("%d\t", carton[i][j]);
            }
        }
        putchar('\n');
    }
}
@marcelogarberoglio
Copy link
Member

Lo edité con lo comentado en https://github.com/PI-ITBA/2024_02 para que se vea mejor el código
Estso está mal

for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 3; j++) {
            if (carton[i][j] == bolilla) {
                carton[i][j] = -1;  // Marcar la bolilla encontrada
                esta = 1;
            }
        }
    }

recorrés el cartón como si tuviera 5 filas de 3 columnas, y son 3 filas de 5 columnas, y en generaCarton hacés lo mismo.
Traten de usar los #define

Pero el error es que usás el bolillero para generar los cartones. Y una vez que asignaste las bolillas las sacás del bolillero, entonces nadie puede hacer siquiera una línea. En generarCarton tendrías que crear un bolillero auxiliar, cada vez que generás un cartón. Por eso en nuestro diseño no recibe el bolillero, sólo el cartón a llenar

@MarrMalleville
Copy link
Author

MarrMalleville commented Oct 6, 2024

codigo corregido y que funciona:

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

#define MAX 89
#define MIN 0
#define DIM_BOL 90
#define LINES 3
#define COLS 5
#define DIM_CARTON 15

#define P1 1
#define P2 2
#define ANY 0

typedef int TipoLinea[COLS];
typedef TipoLinea TipoCarton[LINES];

void generarCarton(TipoCarton cartonRand);
int jugar(int bolillero[], TipoCarton jugador1, TipoCarton jugador2, unsigned int *cantBolillas);
int sacarBolilla(int bolillero[], unsigned int *Pcantbolillas);
int controlarCarton(TipoCarton carton, int bolilla);
int buscarBolilla(TipoCarton carton, int bolilla);
int controlarLineas(TipoLinea linea);
void imprimirCarton(TipoCarton carton);

int main(void) {
    randomize();

    TipoCarton player1;
    TipoCarton player2;
    int vecBolillero[DIM_BOL];
    int flag = ANY;
    int gamePlay;
    int ronda = 1;
    unsigned int cantBolillas = DIM_BOL;  // Cantidad de bolillas restantes

    // Inicializar el bolillero con números del 1 al 90
    for (int i = 0; i < DIM_BOL; i++) {
        vecBolillero[i] = i + 1;
    }

    generarCarton(player1);
    generarCarton(player2);

    // Bucle del juego hasta que haya un ganador
    while (flag == ANY && cantBolillas > 0) {
        printf("Ronda: %d\n", ronda++);

        gamePlay = jugar(vecBolillero, player1, player2, &cantBolillas);

        if (gamePlay == P1) {
            flag = P1;
            printf("¡Jugador 1 ha ganado!\n");
        } else if (gamePlay == P2) {
            flag = P2;
            printf("¡Jugador 2 ha ganado!\n");
        }
    }

    if (cantBolillas == 0 && flag == ANY) {
        printf("¡Se acabaron las bolillas y no hubo ganador!\n");
    }

    return 0;
}

void generarCarton(TipoCarton cartonRand) {
    int indice;

    int bolilleroAux[DIM_BOL];
    for (int i = 0; i < DIM_BOL; i++) {
        bolilleroAux[i] = i + 1;
    }

    for (int i = 0; i < LINES; i++) {
        for (int j = 0; j < COLS; j++) {
            indice = randInt(MIN, MAX - i);  // Índice aleatorio
            cartonRand[i][j] = bolilleroAux[indice];  // Asignar bolilla al cartón
            bolilleroAux[indice] = bolilleroAux[MAX - i];  // Actualizar bolillero
        }
    }
}

int jugar(int bolillero[], TipoCarton jugador1, TipoCarton jugador2, unsigned int *cantBolillas) {
    int winner = ANY;
    int p1 = 0;
    int p2 = 0;

    int num = sacarBolilla(bolillero, cantBolillas);  // Extraer una bolilla
    printf("Bolilla extraída: %d\n", num);

    p1 = controlarCarton(jugador1, num);  // Controlar bolilla para jugador 1
    p2 = controlarCarton(jugador2, num);  // Controlar bolilla para jugador 2

    // Verificar si hay ganador
    if (p1 == LINES) {
        winner = P1;
    } else if (p2 == LINES) {
        winner = P2;
    }

    imprimirCarton(jugador1);
    putchar('\n');
    imprimirCarton(jugador2);

    return winner;
}

int sacarBolilla(int bolillero[], unsigned int *Pcantbolillas) {
    int bolitaExtraida = randInt(MIN, *Pcantbolillas - 1);  // Generar índice aleatorio
    int bolilla = bolillero[bolitaExtraida];  // Extraer la bolilla del bolillero

    bolillero[bolitaExtraida] = bolillero[*Pcantbolillas - 1];  // Intercambiar con la última bolilla disponible
    (*Pcantbolillas)--;  // Reducir la cantidad de bolillas disponibles

    return bolilla;  // Retornar la bolilla extraída
}


int controlarCarton(TipoCarton carton, int bolilla) {
    int cantLineas = 0;

    buscarBolilla(carton, bolilla);  // Marcar si la bolilla está en el cartón

    // Controlar líneas completas
    for (int i = 0; i < LINES; i++) {  // Controlar las 3 líneas del cartón
        if (controlarLineas(carton[i])) {
            cantLineas++;
        }
    }

    return cantLineas;
}

int buscarBolilla(TipoCarton carton, int bolilla) {
    int esta = 0;

    // Buscar bolilla en el cartón
    for (int i = 0; i < LINES; i++) {
        for (int j = 0; j < COLS; j++) {
            if (carton[i][j] == bolilla) {
                carton[i][j] = -1;  // Marcar la bolilla encontrada
                esta = 1;
            }
        }
    }

    return esta;
}

int controlarLineas(TipoLinea linea) {
    int completa = 0;

    // Verificar si una línea está completa
    for (int i = 0; i < COLS; i++) {  // Controlar todas las posiciones de la línea
        if (linea[i] == -1) {
            completa++;
        }
    }

    return (completa == COLS);  // Retorna verdadero si la línea está completa
}

void imprimirCarton(TipoCarton carton) {
    // Imprimir el cartón
    for (int i = 0; i < LINES; i++) {
        for (int j = 0; j < COLS; j++) {
            if (carton[i][j] == -1) {
                printf(" X\t");
            } else {
                printf("%d\t", carton[i][j]);
            }
        }
        putchar('\n');
    }
}

@marcelogarberoglio
Copy link
Member

Sí, ahora está bien.

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

2 participants