Programma di poker C errore distribuzione delle carte

di il
4 risposte

Programma di poker C errore distribuzione delle carte

Salve a tutti perchè mi da sempre le stesse carte ai giocatori?

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

typedef struct{
    char *faccia;
    char *seme;
}Carta;

typedef struct {
    Carta carte[5]
}Mano;

typedef struct {
    Mano giocatore[5];
   
}Giocatore;


void riempiMazzo(Carta * const wMazzo, const char * wFaccia[], const char * wSeme[]);
void mischia(Carta *const wMazzo);
void distribuisci(const Carta * const wMazzo);

int main()
{
    Carta mazzo[52]; /*dichiara il vettore di elementi di tipo carta*/


    /*inizializza i vettori di puntatori*/
    const char *faccia[]={"Asso", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};

    const char *seme[]={"Cuori", "Quadri",  "Fiori", "Picche"};

    srand(time(NULL));

    riempiMazzo(mazzo, faccia, seme);
    mischia(mazzo);
    distribuisci(mazzo);

    return 0;
}

void riempiMazzo(Carta * const wMazzo, const char *wFaccia[], const char *wSeme[])
{
    int i;

    for(i=0; i<=51; i++)
    {
        wMazzo[i].faccia=wFaccia[i%13];
        wMazzo[i].seme=wSeme[i/13];
    }
}

void mischia(Carta *const wMazzo)
{
    int i;
    int j;

    Carta temp;

    for(i=0; i<=51; i++)
    {
        j=rand()%52;
        temp=wMazzo[i];
        wMazzo[j]=temp;
    }
}

void distribuisci(const Carta * const wMazzo )
{
    int i;
    int j;
    Mano L;
    Giocatore G;

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

        for(i=0; i<5; i++)
        {
            G.giocatore[j].carte[i].faccia=wMazzo[i].faccia;
            G.giocatore[j].carte[i].seme=wMazzo[i].seme;
            /**L.carte[i].faccia=wMazzo[i].faccia;
            L.carte[i].seme=wMazzo[i].seme;**/

        }

    }
    for(j=0; j<5; j++)
    {
        printf("giocatore %d\n\n", j+1);

        for(i=0; i<5; i++)
        {
            printf("%s di %s\n", G.giocatore[j].carte[i].faccia, G.giocatore[j].carte[i].seme);
        }

        printf("\n");
    }

}

4 Risposte

  • Re: Programma di poker C errore distribuzione delle carte

    Salve, Doctor
    
    void distribuisci(const Carta * const wMazzo )
    {
        int i;
        int j;
        Mano L;
        Giocatore G;
        for(j=0; j<5; j++)		//<--------------------------------
        {
            for(i=0; i<5; i++)
            {
                G.giocatore[j].carte[i].faccia=wMazzo[i].faccia;
                G.giocatore[j].carte[i].seme=wMazzo[i].seme;
            }
        }
        
        . . .
        
    }
    L'errore si trova, nel segmento di codice che ho riproposto, nel ciclo for che ho segnalato.
    Di fatto, ogni volta che viene distribuita la mano a un giocatore, poichè 'i' è resettato a 0 al giocatore successivo pesca nuovamente le prime 5 carte del mazzo.
    Per risolvere il problema, devi far sì che l'indice non venga resettato dopo la distribuzione delle carte. Ad esempio:
    
    void distribuisci(const Carta * const wMazzo )
    {
        int i = 0;			//La variabile è dichiarata con valore iniziale di 0
        int j;
        Mano L;
        Giocatore G;
        for(j=0; j<5; j++)
        {
            for( ; i<5; i++)		//E non viene azzerata all'inizio del for
            {
                G.giocatore[j].carte[i].faccia=wMazzo[i].faccia;
                G.giocatore[j].carte[i].seme=wMazzo[i].seme;
            }
        }
        
        . . .
        
    }
    In questo modo dovrebbe funzionare correttamente
  • Re: Programma di poker C errore distribuzione delle carte

    Salve a te Brunplunsu e grazie per avermi risposto
    
     int i=0;
        int j;
        Mano L;
        Giocatore G;
    
        for(j=0; j<5; j++)
        {
    
            for(; i<5; i++)
            {
                G.giocatore[j].carte[i].faccia=wMazzo[i].faccia;
                G.giocatore[j].carte[i].seme=wMazzo[i].seme;
                /**L.carte[i].faccia=wMazzo[i].faccia;
                L.carte[i].seme=wMazzo[i].seme;**/
    
            }
    
        }
        for(j=0; j<5; j++)
        {
            printf("giocatore %d\n\n", j+1);
    
            for(i=0; i<5; i++)
            {
                printf("%s di %s\n", G.giocatore[j].carte[i].faccia, G.giocatore[j].carte[i].seme);
            }
    
            printf("\n");
        }
    
    }
    
    
    ho fatto cosi però quando vado a compilare stampa il primo giocatore arriva al secondo ed esce la finestra con il messaggio che il programma ha smesso di funzionare
  • Re: Programma di poker C errore distribuzione delle carte

    Errore mio:
    
    int i = 0;
    int j;
    Mano L;
    Giocatore G;
    
    for(j=0; j<5; j++)
    {
    
        for( ; i < 5; i++)                 // <-------
        {
            G.giocatore[j].carte[i].faccia=wMazzo[i].faccia;
            G.giocatore[j].carte[i].seme=wMazzo[i].seme;
        }
    }
    
    Così facendo, dopo il primo giocatore, 'i' è già uguale a 5 e il ciclo si disattiva da solo.
    Allora potresti aggiungere una nuova variabile:
    
    int i = 0; //Indica il numero di carte già pescate
    int j;     //Indice dei giocatori
    int k;     //Contatore del numero di carte distribuite, quindi del numero della carta che ho in mano
    Mano L;
    Giocatore G;
    
    for(j=0; j<5; j++)
    {
    
        for(k = 0 ; k < 5; k++)                 //Vengono distribuite al massimo 5 carte...
        {
            G.giocatore[j].carte[k].faccia=wMazzo[i].faccia;     //Anche qui cambio 'i' in 'k'
            G.giocatore[j].carte[k].seme=wMazzo[i].seme;	    //E qui
            i++;                                      //E dopo che una carta è stata data, si incrementa l'indice i
        }
    }
    
    Ora sul mio PC distribuisce correttamente le carte
  • Re: Programma di poker C errore distribuzione delle carte

    Grazie mille stavo impazzendo per trovare la soluzione
Devi accedere o registrarti per scrivere nel forum
4 risposte