Programma in C: Poker

di il
12 risposte

Programma in C: Poker

Ciao a tutti
In Facoltà ci hanno dato un gioco da sviluppare, in questo caso il Poker (quello da 5 carte, non Texas Hold'Em).
Ad ogni modo, ho implementato l'algoritmo che mischia le carte, ora devo implementare la funzione per distribuirle... E ci riesco, ma capita che alcune carte estratte siano uguali! Mi spiego meglio.
Inserisco i nomi di 4 giocatori, poi distribuisco loro le carte.
Giocatore1:
2 di picche
3 di cuori
10 di fiori
1 di rombi

Giocatore2:
3 di cuori
4 di picche
13 di rombi
2 di fiori

ecc...

Come potete vedere, il 3 di cuori è in comune, di conseguenza non si può giocare... Ora vi posto il codice, la funzione che distribuisce è in fondo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define VALMAX 13
#define NCARTE 52
#define NGIOC 4
#define CLS system("cls")


typedef struct {
	char seme[20];
	int numero;
} carta;

carta mazzo[NCARTE];

typedef struct {
	char nome[20];
	carta mano[5];
} persona;

persona giocatore[NGIOC];

void inserimentoGiocatori();
void assegnamentoValori();
void mescolaCarte();
void assegnamentoCarte();

int main()
{
	int i = 0;
	
	assegnamentoValori();

	inserimentoGiocatori();


	/*for(i = 0; i < NCARTE; i++)	//CONTROLLO SULL'EFFETTIVO FUNZIONAMENTO DELLA FUNZIONE DI ASSEGNAMENTO DEI VALORI ALLE CARTE
	{
		printf("%d\n", mazzo[i].numero);
	}*/
	
	
	mescolaCarte();
	
	/*for(i = 0; i < NCARTE; i++)
	{
		printf("%d %s\n", mazzo[i].numero, mazzo[i].seme);
	}*/

	assegnamentoCarte();

	system("pause");
	return 0;



}



void assegnamentoValori()
{
	int i = 0, k = 0, var = 0, j = 0;
	
	for(i = 0; i < NCARTE; i++)
	{
		mazzo[i].numero = 0;
	}
	
	for(i = 0; i < 13; i++)
	{
		strcpy(mazzo[i].seme, "Cuori");
	}
	for(i = 13; i < 26; i++)
	{
		strcpy(mazzo[i].seme, "Picche");
	}
	for(i = 26; i < 39; i++)
	{
		strcpy(mazzo[i].seme, "Rombi");
	}
	for(i = 39; i < 52; i++)
	{
		strcpy(mazzo[i].seme, "Fiori");
	}
	
	for(i = 0, k = 1; i < NCARTE && k <= VALMAX; i++, k++)
	{
		mazzo[i].numero = k;
		if(k == VALMAX)
		{
			k = 0;
		}
		
	}
	
}

void inserimentoGiocatori()
{
	int i;
	char nome;
	for(i = 0; i < 4; i++)
	{
		printf("Inserire il nome del giocatore numero %d: ", i + 1);
		scanf("%s", &giocatore[i].nome);
	}
}


void mescolaCarte()
{
	typedef struct {
		char temp_seme[20];
		int temp_numero;	
	} struttura;
	
	struttura temp_struct;
	
	typedef struct {
		char seme_2[20];
		int numero_2;
	} appoggio;
	
	appoggio vettoreStruct[NCARTE];
	
	int j = 0, i = 0, p = 0;
	int u;
	
	u = 51;
	
	while(u >= 0)
	{
		i = rand() % 52;
		do{
			j = rand() % 52;
		} while(j == i);
		
		temp_struct.temp_numero = mazzo[i].numero;
		strcpy(temp_struct.temp_seme, mazzo[i].seme);
		
		mazzo[i].numero = mazzo[j].numero;
		strcpy(mazzo[i].seme, mazzo[j].seme);
		
		mazzo[j].numero = temp_struct.temp_numero;
		strcpy(mazzo[j].seme, temp_struct.temp_seme);
		
		u--;
		
	}
	/*puts("STAMPA");
	for(i = 0; i < 52; i++)
	{
		printf("%d - %d %s\n", i + 1,mazzo[i].numero, mazzo[i].seme);
	}*/
	
	/*for(p = 0; p < NCARTE; p++)
	{
		vettoreStruct[p].numero = mazzo[j].numero;
		strcpy(vettoreStruct[p].seme, mazzo[j].seme);
	}*/
}


void assegnamentoCarte()
{
	int i = 0, f = 0;
	int k = 0, p = 0, y = 0, flag_1 = 0;

	CLS;
	
	for(i = 0; i < NGIOC; i++)
	{
		for(k = 0; k <  5; k++)
		{
			do{
				p = rand() % 51;
				for(f = 0; f < 5; f++)
				{
					if(giocatore[i].mano[k].numero == mazzo[p].numero)
					{
						flag_1 = 1;
					}
				}
				if(flag_1 == 0)
				{
					giocatore[i].mano[k].numero = mazzo[p].numero;
					strcpy(giocatore[i].mano[k].seme, mazzo[p].seme);
				}
			} while(flag_1 == 1);
		}
	}
	
	for(i = 0; i < NGIOC; i++)
	{
		puts("");
		printf("Giocatore: %s\n", giocatore[i].nome);
		puts("");
		printf("Carte in mano: \n");
		for(k = 0; k < 5; k++)
		{
			printf("%d di %s", giocatore[i].mano[k].numero,giocatore[i].mano[k].seme);
			puts("");
		}
	}
}


Ovviamente devo ancora finirlo, migliorarlo, ecc... Per ora la mia difficoltà riguarda la distribuzione delle carte.
Ringrazio anticipatamente chiunque mi aiuti

12 Risposte

  • Re: Programma in C: Poker

    A posto, ho sistemato.
  • Re: Programma in C: Poker

    A mio avviso dovresti sistemare un pò il tuo codice,sopratutto in qulle orrende chiamate al sistema quali sono le system("").

    un esempio potrebbe essere:
    
    #include <time.h>
    #define NPLAYER 4
    #define NCARTE 52
    #define CARTE_FOR_SEME 13
    #define MESCOLATE 10000
    
    typedef struct _CARTA
    {
        int n;
        int seme;
    }CARTA;
    
    typedef struct _PLAYER
    {
        CARTA carte[5];
    }PLAYER;
    
    typedef struct _POKERGAME
    {
        char semename[4][7];
        CARTA mazzo[NCARTE];
        PLAYER player[NPLAYER];
    }POKERGAME;
    
    void mth_initrandom()
    {
        srand((unsigned)time(NULL));
    }
    int mth_random(int n)
    {
        return rand() % (n+1);
    }
    
    void pkg_mazzo_swap(CARTA* a,CARTA* b)
    {
        CARTA t;
        t.n = a->n;
        t.seme = a->seme;
        a->n = b->n;
        a->seme = b->seme;
        b->n = t.n;
        b->seme = t.seme;
    }
    
    void pkg_mazzo_reset(CARTA* mazzo)
    {
        int i;
    
        for (i = 0; i < CARTE_FOR_SEME ; i++)
        {
            mazzo[i].n = i + 1;
            mazzo[i].seme = 0;
            mazzo[i + CARTE_FOR_SEME].n = i + 1;
            mazzo[i + CARTE_FOR_SEME].seme = 1;
            mazzo[i + CARTE_FOR_SEME * 2].n = i + 1;
            mazzo[i + CARTE_FOR_SEME * 2].seme = 2;
            mazzo[i + CARTE_FOR_SEME * 3].n = i + 1;
            mazzo[i + CARTE_FOR_SEME * 3].seme = 3;
        }
    }
    
    void pkg_mazzo_mescola(CARTA* mazzo)
    {
        int i;
        for (i = 0; i < MESCOLATE ; i++)
            pkg_mazzo_swap(&mazzo[mth_random(NCARTE - 1)],&mazzo[mth_random(NCARTE - 1)]);
    }
    
    void pkg_init(POKERGAME* pkg)
    {
        mth_initrandom();
        strcpy(pkg->semename[0],"quadri");
        strcpy(pkg->semename[1],"cuori");
        strcpy(pkg->semename[2],"fiori");
        strcpy(pkg->semename[3],"picche");
        pkg_mazzo_reset(pkg->mazzo);
    }
    
    void pkg_prendicarta(CARTA* dest,CARTA* mazzo)
    {
        dest->n = mazzo[0].n;
        dest->seme = mazzo[0].seme;
    
        int i;
        for (i = 0; i < NCARTE-1 ; i++)
            pkg_mazzo_swap(&mazzo[i],&mazzo[i + 1]);
    }
    
    void pkg_daicarte(POKERGAME* pkg)
    {
        int ip,ic;
    
        for (ip = 0; ip < NPLAYER ; ip++)
            for (ic = 0; ic < 5 ; ic++)
                pkg_prendicarta(&pkg->player[ip].carte[ic],pkg->mazzo);
    }
    
    void pkg_draw(POKERGAME* pkg)
    {
        //per adesso vedo tutto
        int ip,ic;
        for (ip = 0; ip < NPLAYER ; ip++)
        {
            printf("Player%d:",ip);
            for (ic = 0; ic < 5 ; ic++)
            {
                printf("%2d %7s",pkg->player[ip].carte[ic].n,pkg->semename[pkg->player[ip].carte[ic].seme] );
                if (ic < 4) printf (" ++ ");
            }
            printf("\n");
        }
    
    }
    
    int main()
    {
        POKERGAME pkg;
    
        pkg_init(&pkg);
    
        //qui ci andrà un while
        //inizio mano
        pkg_mazzo_mescola(pkg.mazzo);
        pkg_daicarte(&pkg);
        pkg_draw(&pkg);
    
        return 0;
    }
    
    anche se in questo caso sarebbe stato piu consono usare una lista per il mazzo di carte e non un vettore,in questo modo si snellisce il codice in tutti i sensi.
  • Re: Programma in C: Poker

    @vbextreme , ti ringrazio per la risposta (che vedo solo ora )
    Ad ogni modo, sono riuscito a finirlo in un paio di giorni
    Per quanto riguarda le liste, purtroppo non le avevo ancora fatte all'Università...
  • Re: Programma in C: Poker

    Il mio voleva essere solo un esempio su come strutturare il codice,poi vedi te.
    Lo scopo non deve essere solo VA,ma deve essere anche scritto bene.
  • Re: Programma in C: Poker

    vbextreme ha scritto:


    a mio avviso dovresti sistemare un pò il tuo codice,sopratutto in qulle orrende chiamate al sistema quali sono le system("").

    un esempio potrebbe essere:
    
    #include <time.h>
    #define NPLAYER 4
    #define NCARTE 52
    #define CARTE_FOR_SEME 13
    #define MESCOLATE 10000
    
    typedef struct _CARTA
    {
        int n;
        int seme;
    }CARTA;
    
    typedef struct _PLAYER
    {
        CARTA carte[5];
    }PLAYER;
    
    typedef struct _POKERGAME
    {
        char semename[4][7];
        CARTA mazzo[NCARTE];
        PLAYER player[NPLAYER];
    }POKERGAME;
    
    void mth_initrandom()
    {
        srand((unsigned)time(NULL));
    }
    int mth_random(int n)
    {
        return rand() % (n+1);
    }
    
    void pkg_mazzo_swap(CARTA* a,CARTA* b)
    {
        CARTA t;
        t.n = a->n;
        t.seme = a->seme;
        a->n = b->n;
        a->seme = b->seme;
        b->n = t.n;
        b->seme = t.seme;
    }
    
    void pkg_mazzo_reset(CARTA* mazzo)
    {
        int i;
    
        for (i = 0; i < CARTE_FOR_SEME ; i++)
        {
            mazzo[i].n = i + 1;
            mazzo[i].seme = 0;
            mazzo[i + CARTE_FOR_SEME].n = i + 1;
            mazzo[i + CARTE_FOR_SEME].seme = 1;
            mazzo[i + CARTE_FOR_SEME * 2].n = i + 1;
            mazzo[i + CARTE_FOR_SEME * 2].seme = 2;
            mazzo[i + CARTE_FOR_SEME * 3].n = i + 1;
            mazzo[i + CARTE_FOR_SEME * 3].seme = 3;
        }
    }
    
    void pkg_mazzo_mescola(CARTA* mazzo)
    {
        int i;
        for (i = 0; i < MESCOLATE ; i++)
            pkg_mazzo_swap(&mazzo[mth_random(NCARTE - 1)],&mazzo[mth_random(NCARTE - 1)]);
    }
    
    void pkg_init(POKERGAME* pkg)
    {
        mth_initrandom();
        strcpy(pkg->semename[0],"quadri");
        strcpy(pkg->semename[1],"cuori");
        strcpy(pkg->semename[2],"fiori");
        strcpy(pkg->semename[3],"picche");
        pkg_mazzo_reset(pkg->mazzo);
    }
    
    void pkg_prendicarta(CARTA* dest,CARTA* mazzo)
    {
        dest->n = mazzo[0].n;
        dest->seme = mazzo[0].seme;
    
        int i;
        for (i = 0; i < NCARTE-1 ; i++)
            pkg_mazzo_swap(&mazzo[i],&mazzo[i + 1]);
    }
    
    void pkg_daicarte(POKERGAME* pkg)
    {
        int ip,ic;
    
        for (ip = 0; ip < NPLAYER ; ip++)
            for (ic = 0; ic < 5 ; ic++)
                pkg_prendicarta(&pkg->player[ip].carte[ic],pkg->mazzo);
    }
    
    void pkg_draw(POKERGAME* pkg)
    {
        //per adesso vedo tutto
        int ip,ic;
        for (ip = 0; ip < NPLAYER ; ip++)
        {
            printf("Player%d:",ip);
            for (ic = 0; ic < 5 ; ic++)
            {
                printf("%2d %7s",pkg->player[ip].carte[ic].n,pkg->semename[pkg->player[ip].carte[ic].seme] );
                if (ic < 4) printf (" ++ ");
            }
            printf("\n");
        }
    
    }
    
    int main()
    {
        POKERGAME pkg;
    
        pkg_init(&pkg);
    
        //qui ci andrà un while
        //inizio mano
        pkg_mazzo_mescola(pkg.mazzo);
        pkg_daicarte(&pkg);
        pkg_draw(&pkg);
    
        return 0;
    }
    
    anche se in questo caso sarebbe stato piu consono usare una lista per il mazzo di carte e non un vettore,in questo modo si snellisce il codice in tutti i sensi.
    Ciao ho visto il tuo codice volevo chiederti perchè usi una struttura PLAYER ed una POKERGAME non basterebbe creare una struttura PLAYER con il nome del giocatore e un vettore di tipo carta?
  • Re: Programma in C: Poker

    Perché rispondere a un thread di più di 2 anni fa?
  • Re: Programma in C: Poker

    minomic ha scritto:


    Perché rispondere a un thread di più di 2 anni fa?
    Perchè mi trovo a dover programmare uno stesso programma e sto cercando di capire come posso fare
  • Re: Programma in C: Poker

    In questo caso si crea un nuovo thread nei forum, non si continua in trhead vecchi di anni.
  • Re: Programma in C: Poker

    oregon ha scritto:


    In questo caso si crea un nuovo thread nei forum, non si continua in trhead vecchi di anni.
    scusatemi sono un nuovo iscritto ed avevo letto sul regolamento che bisognava evitare di creare discussioni su argomenti già trattati
  • Re: Programma in C: Poker

    Punto 3 del regolamento : Non riaprire thread datati

    Comunque sia tranquillo, ti sei iscritto da poco e hai riconosciuto il tuo errore quindi parti già col piede giusto.
    Segui il consiglio di Oregon: crea una nuova discussione e vediamo se possiamo aiutarti.
  • Re: Programma in C: Poker

    Non mi pare ci siano queste parole nel regolamento ... forse ti sei confuso sull'aprire thread uguali nella stessa sezione da parte dello stesso utente ...
  • Re: Programma in C: Poker

    oregon ha scritto:


    Non mi pare ci siano queste parole nel regolamento ... forse ti sei confuso sull'aprire thread uguali nella stessa sezione da parte dello stesso utente ...
    non ho capito.... Grazie mille ragazzi
Devi accedere o registrarti per scrivere nel forum
12 risposte