2016-05-08 1 views
0

Ich versuche, einen einfaches Poker-Spiel Texas Hold'em Stil mit zu erstellen.Wie erstellt man ein Kartenspiel mit Gesichtern und Anzügen mit int Arrays?

Zuerst habe ich versucht, ein Kartenspiel mit 2 char Arrays ..

char *suits_str[4] = {"Spades", "Hearts", "Diamonds", "Clubs"}; 
char *faces_str[13] = {"2", "3", "4", "5", "6", "7", "8", "9", 
      "10", "J", "Q", "K", "A"}; 

Alles zu schaffen ist gut gelaufen, es war ziemlich einfach, die Karten darzustellen. Aber wenn es darum geht, die Hände zu analysieren, um den Gewinner zu bestimmen, scheint es, als ob die Verwendung von Werten vom Typ "Char" eine ziemlich schlechte Idee wäre. Also möchte ich die Anzüge in int Werte ändern, wobei 0 = Kreuz, 1 = Karo, 2 = Herz, 3 = Pik und 0 = 2 (Zwei), 1 = 3, 11 = König , 12 = Ace. (Das ist meine Idee, aber ich bin nicht sicher, wie diese Zeichenketten, um sie noch vergeben)

Also hier habe ich meine Arrays,

int suits[4] = {0, 1, 2, 3}; 
int faces[13] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 

aber ich weiß nicht, wie diejenigen Werte int konvertieren in ihre übereinstimmenden String-Werte. Was Methode sollte ich verwenden?

Antwort

3

Wie Sie aus dem initializer sehen können, Sie nicht Arrays müssen die Kartenwerte und Gesichter, einfache numerische Werte zwischen bzw. darzustellen. 0 und 12 für Werte und 0 und 3 für Flächen können verwendet werden. Um in Strings zu konvertieren, verwenden Sie den Kartenwert und Gesicht als Index in den Arrays suits_str und faces_str:

int suit = 0; /* spades */ 
int face = 12; /* ace */ 

printf("I am the %s of %s\n", suits_str[suit], faces_str[face]); 

Sie können Aufzählungen verwenden, um Sie besser lesbar zu machen Cade:

enum suits { SPADES, HEARTS, DIAMONDS, CLUBS }; 
enum faces { DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, 
      JACK, QUEEN, KING, ACE }; 
int suit = SPADES; 
int face = ACE; 

printf("I am the %s of %s\n", suits_str[suit], faces_str[face]); 

Eine weitere Idee ist es, Zahlenkarten 0-51 und Verwendung Formeln das Gesicht und Anzug zu extrahieren:

int card = rand() % 52; 
int suit = card/13; 
int face = card % 13; 

printf("I am the %s of %s\n", suits_str[suit], faces_str[face]); 

Sie ein Kartenspiel durch Initialisierung eines Arrays von 52 ints schaffen könnte und schlurfendes es mit einer einfachen Methode:

int deck[52]; 
for (int i = 0; i < 52; i++) { 
    /* start with a sorted deck */ 
    deck[i] = i; 
} 

for (int i = 0; i < 1000; i++) { 
    /* shuffle by swapping cards pseudo-randomly a 1000 times */ 
    int from = rand() % 52; 
    int to = rand() % 52; 
    int card = deck[from]; 
    deck[from] = deck[to]; 
    deck[to] = card; 
} 

printf("Here is a shuffled deck:\n" 
for (int i = 0; i < 52; i++) { 
    int card = deck[i]; 
    int suit = card/13; 
    int face = card % 13; 
    printf("%s of %s\n", suits_str[suit], faces_str[face]); 
} 
+0

Ich verstehe die Enums nicht ganz. Warum musst du int suit = SPADES erstellen; int face = ACE; Kannst du auch die Wörter in der Enum-Liste enthalten? Oder sind sie nur für uns, um zu wissen, welcher welcher ist? –

+0

@JasonBui: enums sind nützlich, um typisierte Namen mit einem numerischen Wert zu erstellen. Es ist lesbarer, 'int suit = SPADES;' zu schreiben, als den numerischen Wert direkt wie in 'int suit = 0;' zu verwenden. Die 2 Beispiele dienen nur zur Veranschaulichung. Das letzte Codefragment ist ein vollständigeres Beispiel dafür, wie Karten für Ihre Zwecke verwendet werden können. – chqrlie

+0

Sicher! Danke für die Hilfe! –

0

Sie halten sowohl Ihre erstellten Arrays, und verwenden Sie die int Array-Werte als Indizes auf Ihre Array von Zeiger auf char.

Beispiel:

int diamonds_index = suits[1]; 
char *diamonds_str = suits_str[diamonds_index]; 
1

Der einfachste Weg ist es, jede Karte als einzelne ganze Zahl darstellen:

int getFace(int card) { 
    return card/4; 
} 

int getSuit(int card) { 
    return card%4; 
} 

int createCard(int face, int suit) { 
    return face*4+suit; 
} 

wandeln sie nur in Strings, wenn sie Benutzer zeigen:

void printCard(int card) { 
    static char *suits_str[4] = {"Spades", "Hearts", "Diamonds", "Clubs"}; 
    static char *faces_str[13] = {"2", "3", "4", "5", "6", "7", "8", "9", 
       "10", "J", "Q", "K", "A"}; 
    printf("%s %s\n", faces_str[getFace(card)], suits_str[getSuit(card)]); 
} 

und all deine Berechnung unter Verwendung von ganzen Zahlen:

bool isOnePair(int* hand) { 
    return getFace(hand[0]) == getFace(hand[1]); 
} 

bool isFlush(int* hand) { 
    return getSuit(hand[0]) == getSuit(hand[1]); 
} 
+0

Was ist der Zweck der Verwendung von ** statischen ** char? –

+0

Alle Aufrufe von 'printCard' teilen die gleiche Kopie von' suits_str' und 'faces_str'. Es macht hier keinen Unterschied, da diese Arrays niemals modifiziert werden. –

Verwandte Themen