0

我有一个程序,我为它创建了一个简单的卡片类。如何创建和填充一副扑克牌?

4

3 回答 3

3

如果您有一个类,card只需创建一个类,deck其中包含一个数据结构(例如std::vector数组)来包含card对象。然后实现诸如deal, shuffleetc 之类的功能或任何您认为合适的功能。

要填充你的牌组,你可以使用一个add_card函数。然后,您可以使用它来循环所有花色和价值,以创建每种不同花色/价值类型的卡片并将其添加到您的牌组中。或者(或另外),您可以在deck构造函数中执行此操作,但拥有一个add_card函数将允许您的套牌模拟不同类型的套牌,例如单张纸牌hands或多套牌游戏,例如赌场二十一点。

如果您使用支持随机访问迭代器的标准 C++ 库中的容器,则可以使用该std::random_shuffle函数来打乱您的deck

编辑:更新以纳入评论中提出的一些观点

于 2012-10-25T07:33:52.643 回答
0

这是用一个例子来扩展 mathematician1975 的答案:

#include <iostream>
#include <string>
#include <map>
#include <array> //needs c++11 support

enum CARDSUIT { Spades, Hearts, Diamonds, Clubs };
typedef std::pair< int, int > Card;
template< class T, size_t N> struct DECK : public std::array< T, N> 
{
    void shuffle()
    {
        //see here for example:
        // http://www.cplusplus.com/reference/algorithm/random_shuffle/
    }
};
typedef DECK<Card, 52> StandardDeck;

int main()
{
    int i=0,j=0;
    StandardDeck deck;

    for (i=Spades; i<=Clubs; i++)
        for (j=0; j<13; j++)
                deck[j + (i*13)] = Card(i,j);

    for (i=0; i<(int)deck.size(); i++) 
        std::cout << deck[i].first << " " << deck[i].second << "\n";

    return 0;
}
于 2012-10-25T10:47:00.573 回答
0

最简单的方法是从 int 转换为卡片,这样从 0-51 的每个数字都会产生一张唯一的卡片。怎么样并不重要,只要它们都是独一无二的。

然后你可以从循环中的每个数字创建一副牌,可能是一个向量,你可以执行 std::random_shuffle 来洗牌。

如果您希望您的牌组对于将要玩什么游戏保持“通用”,那么不要使功能成为卡片的成员功能,而是“免费”功能。例如,黑桃 A 在桥牌上的排名可能超过黑桃 7,但这是桥牌(以及与惠斯特相关的游戏)的特征,而不是一般纸牌的特征。同样,一张牌或一副牌也没有“王牌”的概念。

您可能想要一个小丑的特殊卡片选项。当然,不使用小丑的游戏不允许在套牌中使用其中之一。

于 2012-10-25T11:01:31.277 回答