PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

ejercicio 4b (poker). Hola me corre bien y hace lo que quiero me gustaria ver si esta bien en terminos de eficiencia y estilo. #108

Open juanhumphreys opened 1 month ago

juanhumphreys commented 1 month ago
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "random.h"
#include "getnum.h"
//idea juli, hacer un random que elija un carta del mazo la copie en el final del vector y dsp reduzca la dimension del mismo;
#define COLORES 4
#define NUMEROS 13
#define MAXLEN 8
#define CANTIDADCARTAS 52
#define MANO 5

typedef struct carta{
    char Palos;
    int Numeros;
};

void Cremazo(struct carta mazo[CANTIDADCARTAS]) {
    int i, j, k = 0;
    char palos[COLORES] = {'d', 'c', 'p', 't'}; 
    struct carta aux;

    for (i = 0; i < COLORES && k < CANTIDADCARTAS; i++) {
        for (j = 1; j <= NUMEROS && k < CANTIDADCARTAS; j++) {
            aux.Palos = palos[i];
            aux.Numeros = j; 
            mazo[k++] = aux;
        }
    }
}

struct carta reparte(struct carta mazo[], int dimension) {
    int random;
    struct carta aux;

    // Generate a random index
    random = rand() % dimension;

    // Store the card to return
    aux = mazo[random];

    // Swap the random card with the last card in the deck
    mazo[random] = mazo[dimension - 1]; // Use dimension - 1 to get the last card
    mazo[dimension - 1] = aux; 

    return aux;
}

void mano(struct carta mazo[], struct carta manojugador[], int *dimension) {
    int i;

    for (i = 0; i < MANO; i++) {
        // Deal a card from the mazo
        struct carta carta = reparte(mazo, *dimension);

        // Add the card to the player's hand
        manojugador[i] = carta;

        // Decrease the dimension since one card has been dealt
        (*dimension)--;
    }
}

void imprimemanos(struct carta mano[]){
   printf("\n");
    for(int i=0; i<MANO; i++){

        printf("% d%c", mano[i].Numeros, mano[i].Palos);
    }
    printf("\n");
}

int leewinners( struct carta mano[],int *aux){
    int i,j;
    int count = 0;

    for(i=0; i<5; i++){
        for(j=i+1; j<5; j++){
            if((mano[i].Numeros) == (mano[j].Numeros)){
              count ++;
              *aux += mano[i].Numeros;
            }
        }
    }

    return count;

}

int main(void){
    srand(time(NULL));
    struct carta mazo[CANTIDADCARTAS];
    Cremazo(mazo);
    struct carta manojugador[MANO];
    struct carta manocompu[MANO]; 

    int flag =1;
    int puntosjugador =0;
    int puntoscompu =0;

    int auxjugador;
    int auxcompu;
    int dimension =52;
    do{
        int aux1 =0;
        int aux2 =0;

        if(dimension>= 10 ){
            mano(mazo, manocompu, &dimension);
            mano(mazo,manojugador, &dimension);

            printf("\nmano compu:");
            imprimemanos(manocompu);
            printf("\nmano jugador:");
            imprimemanos(manojugador);
        }
        else{
            flag=0;
        }        

        if(flag){
            auxjugador= leewinners(manojugador, &aux1);
            auxcompu = leewinners(manocompu, &aux2);   

            if(auxcompu > auxjugador){
            puntoscompu++;
            }
            else if(auxcompu < auxjugador){
                puntosjugador++;
            } 
            else if(aux1>aux2){
                puntosjugador++;
            }
            else{
                puntoscompu++;
            }

        }
    printf( "\njugador 1 tiene %d puntos\n", puntosjugador);
        printf("\nla compu tiene %d puntos\n",puntoscompu);

    }while(getint("ingrese 0 si no quiere seguir jugando\n") && flag);

    return 0;
}
juanhumphreys commented 1 month ago

perdon que se subio tan raro es el primero que subo :)

marcelogarberoglio commented 1 month ago

Lo edité para que se vea bien, sólo tenés que encerrarlo entre las comillas, como explica en https://github.com/PI-ITBA/2024_02

Es medio raro lo que hace la función reparte, sacando una carta al azar. Podrías mezclar el mazo y repartir las primeras cartas, por ejemplo. Aunque a efectos del resultado (no repartir cartas repetidas) funciona igual

Los palos no son 'c', 'd', etc sino "Corazón", "Diamante" , etc.

leeWinners: el nombre del parámetro aux no es claro, hay que mirar el resto del código para entender para qué sirve

La convención para los nombres de los campos de un struct es la misma que para variables, en vez de "Palos" y "Numeros" se podrían llamar "palo" y "numero". Un nombre en plural da a entender que se trata de un conjunto de datos, no uno solo.

Definís bien las constantes pero no siempre las usás, aparecen magic numbers como 5 y 10

En cuanto a eficiencia, está bien.

juanhumphreys commented 1 month ago

muchas gracias perdon por como lo subi!!