arrays - 使用 int 数组创建一副带有面孔和花色的纸牌

标签 arrays c poker playing-cards

我正在尝试用 创建一个简单的德州扑克风格的扑克游戏.

起初,我尝试用 2 个 char 数组创建一副纸牌:

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="Clubs", 1="Diamonds", 2="Hearts", 3="Spades"
  • 面孔:0="2", 1="3", 11="King", 12="Ace"

例子:

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

但现在我不知道如何将这些 int 值转换回与其匹配的卡片字符串值。

问题

使用 int 数组表示卡片的正确且简单的方法是什么?

最佳答案

正如您从初始化程序中看到的那样,您不需要数组来表示卡值和面孔,resp 之间的简单数值。可以使用 0 和 12 表示值,0 和 3 表示面。要转换为字符串,请使用牌值和面作为数组 suits_strfaces_str 的索引:

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

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

您可以使用枚举来提高代码的可读性:

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

关于arrays - 使用 int 数组创建一副带有面孔和花色的纸牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37099083/

相关文章:

ruby - 如何让用户输入并检查数组中的项目?

java - 检查扑克牌

javascript - 存在 javascript 循环引用问题

c - 一个非常简单的程序中的指令顺序错误

c - "scanf with printf"与 "fgets with printf"

c - 为什么扫描时空字符不会添加到字符串末尾?

math - 是否存在与扑克相关的开源数学库?

algorithm - 我可以在这里做得比二进制搜索更好吗?

javascript - 如何按嵌套值将嵌套对象数组分组为多个数组

objective-c - C 和 Objective-C 中指针的区别