Как создать колоду карт с лицами и мастями с массивами 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];