我有一个程序,我为它创建了一个简单的卡片类。如何创建和填充一副扑克牌?
3 回答
如果您有一个类,card
只需创建一个类,deck
其中包含一个数据结构(例如std::vector
数组)来包含card
对象。然后实现诸如deal
, shuffle
etc 之类的功能或任何您认为合适的功能。
要填充你的牌组,你可以使用一个add_card
函数。然后,您可以使用它来循环所有花色和价值,以创建每种不同花色/价值类型的卡片并将其添加到您的牌组中。或者(或另外),您可以在deck
构造函数中执行此操作,但拥有一个add_card
函数将允许您的套牌模拟不同类型的套牌,例如单张纸牌hands
或多套牌游戏,例如赌场二十一点。
如果您使用支持随机访问迭代器的标准 C++ 库中的容器,则可以使用该std::random_shuffle
函数来打乱您的deck
编辑:更新以纳入评论中提出的一些观点
这是用一个例子来扩展 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;
}
最简单的方法是从 int 转换为卡片,这样从 0-51 的每个数字都会产生一张唯一的卡片。怎么样并不重要,只要它们都是独一无二的。
然后你可以从循环中的每个数字创建一副牌,可能是一个向量,你可以执行 std::random_shuffle 来洗牌。
如果您希望您的牌组对于将要玩什么游戏保持“通用”,那么不要使功能成为卡片的成员功能,而是“免费”功能。例如,黑桃 A 在桥牌上的排名可能超过黑桃 7,但这是桥牌(以及与惠斯特相关的游戏)的特征,而不是一般纸牌的特征。同样,一张牌或一副牌也没有“王牌”的概念。
您可能想要一个小丑的特殊卡片选项。当然,不使用小丑的游戏不允许在套牌中使用其中之一。