Programma in C: Poker

di Anonimizzato13304 il
12 risposte
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

  • A posto, ho sistemato.
  • 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.
  • @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à...
  • 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.
  • 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?
  • Perché rispondere a un thread di più di 2 anni fa?
  • 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
  • In questo caso si crea un nuovo thread nei forum, non si continua in trhead vecchi di anni.
  • 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
  • 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.
  • 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 ...
  • 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