我正在尝试用 c 创建一个简单的德州扑克风格的扑克游戏.
起初,我尝试用 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_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]);
您可以使用枚举来提高代码的可读性:
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/