如何使用 int 数组创建带有面孔和西装的卡片组?
Posted
技术标签:
【中文标题】如何使用 int 数组创建带有面孔和西装的卡片组?【英文标题】:How to create a Deck of cards with faces and suits with int Arrays? 【发布时间】:2016-09-03 02:28:51 【问题描述】:我正在尝试使用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 类型的值似乎是一个非常糟糕的主意。 所以我想将 suits 更改为 int 值,其中 0=Clubs,1=Diamonds,2=Hearts,3=Spades,对于 faces,0 = 2(deuce ), 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 值转换为匹配的字符串值。我应该使用什么方法?
【问题讨论】:
【参考方案1】:从初始化程序中可以看出,您不需要数组来表示卡片值和面,分别是简单的数值。可以使用 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 suit = SPADES;诠释脸=王牌;另外,您可以将单词包含在枚举列表中吗?或者它们只是为了让我们知道哪个是哪个? @JasonBui:枚举对于创建具有数值的类型名称很有用。写int suit = SPADES;
比直接使用int suit = 0;
中的数值更具可读性。 2 个示例仅用于说明目的。最后一个代码片段是一个更完整的示例,说明如何为您的目的发牌。
当然!感谢您的帮助!【参考方案2】:
最简单的方法是将每张卡片表示为单个整数:
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]);
【讨论】:
使用static char的目的是什么? 所有printCard
的调用将共享suits_str
和faces_str
的同一个副本。在这里并没有真正的区别,因为这些数组从未被修改过。【参考方案3】:
您保留创建的两个数组,并使用 int
数组值作为指向 char 的指针数组的索引。
例子:
int diamonds_index = suits[1];
char *diamonds_str = suits_str[diamonds_index];
【讨论】:
以上是关于如何使用 int 数组创建带有面孔和西装的卡片组?的主要内容,如果未能解决你的问题,请参考以下文章