PDA

Visualizza la versione completa : [C] Confrontare una scala di poker


.:DarkSkull:.
10-09-2011, 16:21
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:


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!

MItaly
10-09-2011, 16:35
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)


enum Seme
{
Cuori,
Fiori,
Picche,
Quadri
};

struct Carta
{
unsigned int NumeroCarta; /* 1-13 */
enum Seme SemeCarta;
};

struct Mano
{
struct Carta[5];
};

.:DarkSkull:.
10-09-2011, 17:07
Grazie ora ci provo!

.:DarkSkull:.
10-09-2011, 21:19
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...


#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;
}

oregon
10-09-2011, 23:00
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) ...

MItaly
10-09-2011, 23:48
Originariamente inviato da oregon
Vince la scala che ...
... ha Paul Newman. :D

oregon
10-09-2011, 23:55
Originariamente inviato da MItaly
... ha Paul Newman. :D

Ahi ... allora addio regole ... :zizi:

.:DarkSkull:.
11-09-2011, 03:04
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à!

oregon
11-09-2011, 10:55
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) ?

.:DarkSkull:.
11-09-2011, 12:12
Questa parte di codice serve per la regola 1:


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:


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...


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.

Loading