如何使用 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_strfaces_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_strfaces_str 的同一个副本。在这里并没有真正的区别,因为这些数组从未被修改过。【参考方案3】:

您保留创建的两个数组,并使用 int 数组值作为指向 char 的指针数组的索引。

例子:

 int diamonds_index = suits[1];
 char *diamonds_str = suits_str[diamonds_index];

【讨论】:

以上是关于如何使用 int 数组创建带有面孔和西装的卡片组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ngFor 和 bootstrap 4 创建新的卡片行

传递结构的二维数组

批处理文件 - 选择一张卡片

带有分页的 Vuetify 卡片

如何在 Flutter 中制作带有标题的多张卡片列表

使用带有网络过滤器的漂亮面孔