c语言关于创建扑克牌的各种函数!!

我要写的函数如下
card *makestandarddeck()
{
}
创造一副完整的52张牌(除去大小王)。就是让我为整幅牌分配空间 ,然后初始化所有的分配的structure的值。不需要排序。最后return出来的应该是一堆牌52张各种花色都有。(First, allocate space for one card. Second, set the values in the card to the values in the input arguments. Finally, return that new card so that it may be used outside this function.)

int compare(card *c1, card *c2)
{
}
这是比较牌 先比较数字大小 数字相同时 比较花色 如果牌1大于牌2 return1;如果小于,return-1,如果等于return0

int find_index(deck *d, int suit, int value)
{
}
这个是要找牌。找到牌的话 输出它的序号。找不到就return-1

关于card的定义struct
typedef struct _card {
int suit;
int value;
} card;
(关于花色suit已经定义为int类型:clubs == 0, diamonds == 1, hearts == 2, and spades == 3.)
typedef struct _deck {
int num_cards;
card *cards;
} deck;

另外需要注意的是
Ace(1) 10 Jack(11) Queen(12) King(3) 输出时分别用A T J Q K表示 其他2——9都保持原数字。

compare我是这样写的
int compare(card *c1, card *c2)
{
if (c1->value != c2->value)
{
if (c1->suit > c2->suit)
{
return 1;
}
else if(c1->suit == c2->suit)
{
return 0;
}
else
return -1;
}
else if(c1->value > c2->value)
{
return 1;
}
else
return -1;
}
大神求其他函数的解答!!

LZ的compare函数第一个if (c1->value != c2->value)应该是if (c1->value == c2->value)吧,其他没问题。

其他函数:

makestandarddeck函数负责创建一副完整52张牌,我理解应该是创建一副洗好的顺序不规则的牌吧。我想到的思路大概有两种,最快的思路是每产生一张新牌,分配不重复的一种花色;另一种更容易的思路是先老实按点数和花色的顺序依次产生52张排好顺序的牌,之后洗牌。分别给出代码。

#include <stdlib.h>
card *makestandarddeck()  // solution 1
{
    int gen[52] = {0};
    card* cards = malloc(52 * sizeof(card));
    int i, k, d;
    srand(time(NULL));
    for(i=0; i<52; i++)
    {
        k = rand() % 52;
        d = k%2 ? 1: -1;
        while(gen[k] == 0)
        {
            k += d;
        }
        gen[k] = 1;
        cards[i].suit = k % 4;
        cards[i].value = k / 4 + 1;
    }
    return cards;
}

card *makestandarddeck()  // solution 2
{
    int i;
    card *cards = malloc(52 * sizeof(card));
    for(i=0; i<52; i++)
    {
        cards[i].suit = i % 4;
        cards[i].value = i / 4 + 1;
    }
    shufflecards(cards);  // 洗牌
    return cards;
}

find_index函数负责找牌,因为牌可能是乱序的,只能老实的遍历查找。

int find_index(deck *d, int suit, int value)
{
    int i, n = d->num_cards;
    card *cards = d->cards;
    for(i=0; i<n; i++)
    {
        if(cards[i].value == value && cards[i].suit == suit)
            return i;
    }
    return -1;
}

追问

非常感谢。你的代码我有认真看 ,但 我有个东西打错了orz 关于第一个函数 应该是deck *makestandarddeck() 而不是card *makestandarddeck()这样应该怎么做呢?谢谢!!
是不是先initilize deck* deck1然后在for loop用deck1-〉cards= cards就行了?然后再return deck1

追答

是的。deck结构里的cards只是一个指针,因此deck结构本身无法容纳多个card的,只能另外辟一个数据结构比如简单的数组,来保存多个card的内容,而让deck的cards指针指向这个结构,使两者关联起来,好处是对cards的操作比较宽松,数据类型和大小都容易变动,坏处是增删deck时要两头操作比较麻烦。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-15
兄弟,你的compare有逻辑错误哦,应该是这样的
int compare(card *c1, card *c2)
{
if (c1->value == c2->value)
{
if (c1->suit > c2->suit)
{
return 1;
}
else if(c1->suit == c2->suit)
{
return 0;
}
else
return -1;
}
else if(c1->value > c2->value)
{
return 1;
}
else
return -1;
}
另makestandarddeck与find_index函数实现如下
void Swap(card *a, card *b)
{
card tmp = *a;
*a = *b;
*b = tmp;
}
card *makestandarddeck()
{
int i, index;
card *cards;
cards = (card*) malloc (52 * sizeof(card));
for(i = 0; i < 52; i++)
{
cards[i].suit = i / 13;
cards[i].value = i % 13 + 1;
}
srand(time(0));
for(i = 0; i < 52; i++)
{
index = rand( ) % 52;
Swap(&cards[i], &cards[index]);
}
return cards;
}
int find_index(deck *d, int suit, int value)
{
int i;
card c;
c.suit = suit;
c.value = value;
for(i = 0; i < d->num_cards; i++)
{
if(compare(d->cards[i], c) == 0)
{
return i;
}
}
return -1;
}
相似回答