Как создать колоду карт с лицами и мастями с массивами int?

Я пытаюсь создать простую покерную игру в стиле Техасского Холдема с помощью c.

Сначала я попытался создать колоду карт с двумя массивами символов.

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

Все прошло хорошо, представить карты было довольно просто. Но когда дело доходит до анализа рук для определения победителя, кажется, что использование значений типа char было довольно плохой идеей. Поэтому я хочу изменить масти на значения int, где 0= трефы, 1= алмазы, 2= червы, 3= пики, а для граней 0 = 2 (двойка), 1 = 3, 11 = король, 12 = туз. (это моя идея, но я пока не уверен, как присвоить им эти строковые значения)

Итак, у меня есть свои массивы,

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

но я не знаю, как преобразовать эти значения int в соответствующие им строковые значения. Какой метод я должен использовать?

3 ответа

Решение

Как видно из инициализатора, вам не нужны массивы для представления значений и граней карт, простые числовые значения между соотв. 0 и 12 для значений и 0 и 3 для граней. Чтобы преобразовать в строки, используйте значение карты и лицо в качестве индекса в массивах suits_str а также faces_str:

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

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

Вы можете использовать перечисления, чтобы сделать 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]);

Другая идея состоит в том, чтобы пронумеровать карты от 0 до 51 и использовать формулы для выделения лица и масти:

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]);

Вы можете создать колоду карт, инициализируя массив из 52 дюймов и перетасовывая его простым методом:

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]);
}

Самый простой способ - представить каждую карту как одно целое число:

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

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

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

преобразовать их в строки только при показе пользователю:

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)]);
}

и сделайте все ваши вычисления, используя целые числа:

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

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

Вы сохраняете и созданные вами массивы, и используете int Значения массива в виде индексов для вашего массива указателя на символ.

Пример:

 int diamonds_index = suits[1];
 char *diamonds_str = suits_str[diamonds_index];
Другие вопросы по тегам