Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] Confrontare una scala di poker

    Ciao a tutti! Sto svolgendo un esercizio che mi chiede di creare una struttura dati completa per codificare 5 carte francesi e successivamente, scrivere una funzione che date due strutture codificate come sopra, che rappresentano le scale di due giocatori di poker, dica chi è il vincitore.
    Io avevo pensato ad una struttura del genere:
    codice:
    typedef struct card {
     int face;
     char suit*;
     struct card *next;
    }Card;
    Ma come faccio a confrontare una scala dove compaiono anche le figure? Ho fatto bene ad usare int face invece che char *face? Anche perchè non saprei poi come confrontarli.
    Mi date, gentilmente, un idea su come fare questo problema? Grazie a tutti in anticipo!

  2. #2
    Dato che il numero di carte è fissato lascerei stare la lista e userei un normale array di 5 elementi (eventualmente incapsulato in una struct in modo da poterlo passare comodamente ad una funzione).
    Per quanto riguarda la carta, puoi tranquillamente codificarla con un numero da 1 a 13, dove i numeri da 11 a 13 sono le figure (fante, donna, re) accompagnato da un enum che ne specifichi il seme (si può usare anche un approccio più compatto basato su un unico int e su operazioni di modulo, ma in questo caso è sostanzialmente inutile)
    codice:
    enum Seme
    {
        Cuori,
        Fiori,
        Picche,
        Quadri
    };
    
    struct Carta
    {
        unsigned int NumeroCarta; /* 1-13 */
        enum Seme SemeCarta;
    };
    
    struct Mano
    {
        struct Carta[5];
    };
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Grazie ora ci provo!

  4. #4
    Vi posto quello che sono riuscito a scrivere finora, premetto che il programma dà per scontato che gli siano passate due scale, fatto questo tramite due cicli for controlla quale carta sia maggiore delle due mani, senza tenere conto però del seme. Come posso fare? Avevo pensato di scrivere un altro ciclo for per vedere se le due scale erano uguali, ma sono sicuro che l'ho scritto male...
    codice:
    #include <stdio.h>
    
    typedef enum Seme
    {
        Cuori = 4,
        Quadri = 3,
        Fiori = 2,
        Picche = 1
        
    }Seme;
    
    typedef struct Carta
    {
        unsigned int NumeroCarta; /* 1-13 */
        Seme SemeCarta;
    }Carta;
    
    int Vincitore(Carta G1[], Carta G2[]);
    
    int main()
    { 
        Carta G1[5], G2[5];
        
        // mano giocatore 1
        G1[0].NumeroCarta = 1;
        G1[0].SemeCarta = Quadri;
        G1[1].NumeroCarta = 2;
        G1[1].SemeCarta = Quadri;
        G1[2].NumeroCarta = 3;
        G1[2].SemeCarta = Quadri;
        G1[3].NumeroCarta = 4;
        G1[3].SemeCarta = Quadri;
        G1[4].NumeroCarta = 5;
        G1[4].SemeCarta = Quadri;
    
        //mano giocatore 2
        G2[0].NumeroCarta = 3;
        G2[0].SemeCarta = Quadri;
        G2[1].NumeroCarta = 4;
        G2[1].SemeCarta = Quadri;
        G2[2].NumeroCarta = 5;
        G2[2].SemeCarta = Quadri;
        G2[3].NumeroCarta = 6;
        G2[3].SemeCarta = Quadri;
        G2[4].NumeroCarta = 7;
        G2[4].SemeCarta = Quadri;
    
        if (Vincitore(G1,G2) == 1)
    	printf("Ha vinto il giocatore 1\n");
        else
    	printf("Ha vinto il giocatore 2\n");
        return 0;
    }
    
    int Vincitore(Carta G1[], Carta G2[])
    {
        int i, max1, max2, uguale;
    
        //controllo se la scala è uguale
        uguale = 0;
        for(i=0;i<5;i++)
        {
    	if(G1[i].NumeroCarta == G2[i].NumeroCarta)
    		uguale = 1;
    	else
    		uguale = 0;
    
        }
    
        // trovo la carta più alta del primo giocatore
        max1=G1[0].NumeroCarta; 
        for (i=1;i<5;i++)
        {
    	if (G1[i].NumeroCarta>max1)
                    max1=G1[i].NumeroCarta;              
        }
    
        // trovo la carta più alta del secondo giocatore
        max2=G2[0].NumeroCarta; 
        for (i=1;i<5;i++)
        {
    	if (G2[i].NumeroCarta>max2) 
                    max2=G2[i].NumeroCarta;              
        }
    
        if(max1 > max2)
    	return 1;
        else
    	return 2;
    }

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima di scrivere il codice, mettiamoci d'accordo sulle regole da seguire.
    E' bene che tu le scriva, magari numerandole ...

    Vince la scala che ...

    1) ...

    2) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Originariamente inviato da oregon
    Vince la scala che ...
    ... ha Paul Newman.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da MItaly
    ... ha Paul Newman.
    Ahi ... allora addio regole ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Le regole sono questo, calcola che le leggo dal testo dell'esercizio dato che non so giocare a poker!!
    1) Vince la scala più alta, ad esempio: se il primo giocatore ha A,2,3,4,5 e il secondo 2,3,4,5,6 vince il secondo;
    2) Se le scale sono uguali di numero vince il seme più potente, in quest'ordine Cuori, Quadri, Fiori, Picche.
    Grazie mille per la disponibilità!

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ok ... confermate le regole (anche quelle del poker che gioco io ...), quale parte del tuo codice serve per la regola 1) e quale per la regola 2) ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Questa parte di codice serve per la regola 1:
    codice:
    max1=G1[0].NumeroCarta; 
        for (i=1;i<5;i++)
        {
    	if (G1[i].NumeroCarta>max1)
                    max1=G1[i].NumeroCarta;              
        }
    
        // trovo la carta più alta del secondo giocatore
        max2=G2[0].NumeroCarta; 
        for (i=1;i<5;i++)
        {
    	if (G2[i].NumeroCarta>max2) 
                    max2=G2[i].NumeroCarta;              
        }
    
        if(max1 > max2)
    	return 1;
        else
    	return 2;
    Per la regola 2, ho pensato a questo:
    codice:
    uguale = 0;
        for(i=0;i<5;i++)
        {
    	if(G1[i].NumeroCarta == G2[i].NumeroCarta)
    		uguale = 1;
    	else
    		uguale = 0;
    
        }
    Ma controlla solo le carte correnti, quindi sicuro è sbagliato...
    codice:
    typedef enum Seme
    {
        Cuori = 4,
        Quadri = 3,
        Fiori = 2,
        Picche = 1
        
    }Seme;
    In questa parte di codice ho fatto in modo che il seme più forte avesse il valore maggiore, per un eventuale confronto futuro.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.