【发布时间】:2015-02-01 03:44:36
【问题描述】:
好的,我正在创建一副卡片,正如许多其他人所要求的那样,我可以让所有卡片显示在我的代码中,但问题是它们每次的顺序相同。我已经按照教授的要求了解了卡片课程,但甲板课程是我的问题。有几件事,她希望我们对套装使用枚举,她希望我们将 set 方法私下使用,看看为什么我们不应该这样做。 (不要问我这有什么意义,但这是她想要的)上面的说明说:
Deck 构造函数将构建一个包含所有 52 个 Card 对象的数组。也就是说,它将构建 Card 对象。它应该有一个与数组平行的数组,指示卡片是否已从牌堆中取出。它应该有一种从牌组中随机挑选一张牌的方法。此方法将移除并返回一张卡片。
我只是停留在并行数组部分,我如何让它检查是否从原始数组中删除了某些东西?我应该如何处理随机卡?
任何反馈都将不胜感激!
这也是我的代码:
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
enum suit { CLUBS, DIAMONDS, HEARTS, SPADES };
class Card
{
friend class Deck;
private:
string rankname[14];
string suitname;
int rank;
int suitnum;
suit s;
void privatesetsuit(suit arg_suit)
{
s = arg_suit;
}
void privatesetrank(int arg_rank)
{
rank = arg_rank;
}
public:
Card()
{
}
void setsuit(suit arg_suit)
{
privatesetsuit(arg_suit);
}
void setrank(int arg_rank)
{
privatesetrank(arg_rank);
}
int getsuit()
{
return s;
}
int getrank()
{
return rank;
}
void toString()
{
rankname[1] = "ACE";
rankname[2] = "TWO";
rankname[3] = "THREE";
rankname[4] = "FOUR";
rankname[5] = "FIVE";
rankname[6] = "SIX";
rankname[7] = "SEVEN";
rankname[8] = "EIGHT";
rankname[9] = "NINE";
rankname[10] = "TEN";
rankname[11] = "JACK";
rankname[12] = "QUEEN";
rankname[13] = "KING";
if (suitnum == 1)
{
suitname = "DIAMONDS";
}
if (suitnum == 3)
{
suitname = "SPADES";
}
if (suitnum == 2)
{
suitname = "HEARTS";
}
if (suitnum == 0)
{
suitname = "CLUBS";
}
cout << rankname[rank] << " OF " << suitname << endl;
}
};
void privatesetsuit(int s);
void setsuit(int s);
void privatesetrank(int arg_rank);
void setrank(int arg_rank);
void toString();
class Deck
{
public:
Deck()
{
Card currentcard[52];
Card parallel[52];
srand(time(NULL));
for (int i = 0; i < 52; i++)
{
currentcard[i].rank = i % 52;
currentcard[i].rank = currentcard[i].rank % 13 + 1;
parallel[i].rank = currentcard[i].rank;
currentcard[i].suitnum = i % 4;
currentcard[i].toString();
}
}
};
int main()
{
Deck d;
d;
// Test for Class!//
//c.setrank(rank);
//c.setsuit(s);
//c.toString();
// Test for Class!//
}
输出:
ACE OF CLUBS
TWO OF DIAMONDS
THREE OF HEARTS
FOUR OF SPADES
FIVE OF CLUBS
SIX OF DIAMONDS
SEVEN OF HEARTS
EIGHT OF SPADES
NINE OF CLUBS
TEN OF DIAMONDS
JACK OF HEARTS
QUEEN OF SPADES
KING OF CLUBS
ACE OF DIAMONDS
TWO OF HEARTS
THREE OF SPADES
FOUR OF CLUBS
FIVE OF DIAMONDS
SIX OF HEARTS
SEVEN OF SPADES
EIGHT OF CLUBS
NINE OF DIAMONDS
TEN OF HEARTS
JACK OF SPADES
QUEEN OF CLUBS
KING OF DIAMONDS
ACE OF HEARTS
TWO OF SPADES
THREE OF CLUBS
FOUR OF DIAMONDS
FIVE OF HEARTS
SIX OF SPADES
SEVEN OF CLUBS
EIGHT OF DIAMONDS
NINE OF HEARTS
TEN OF SPADES
JACK OF CLUBS
QUEEN OF DIAMONDS
KING OF HEARTS
ACE OF SPADES
TWO OF CLUBS
THREE OF DIAMONDS
FOUR OF HEARTS
FIVE OF SPADES
SIX OF CLUBS
SEVEN OF DIAMONDS
EIGHT OF HEARTS
NINE OF SPADES
TEN OF CLUBS
JACK OF DIAMONDS
QUEEN OF HEARTS
KING OF SPADES
Press any key to continue . . .
【问题讨论】:
-
我有 srand(time(NULL));在那里,因为我最初使用的是 rand,但是我得到了其他卡的副本,我只是忘了把它拿出来。对此的任何改进将不胜感激!
-
并行数组只是一个布尔值,它告诉您是否已经选择了数字,这意味着该牌已经发牌了。
-
要检查卡片是否被移除,请实现一个函数,该函数将遍历卡片并检查提供的卡片实例的等级/花色。如果没有找到匹配的卡,则该卡已从卡组中移除。对于洗牌,这可能会有所帮助:cplusplus.com/reference/algorithm/shuffle
-
@Vizkos,这很昂贵,而不是规格所说的。并行阵列不需要是卡片阵列 - 只是为了清楚。你做的太多了。将整个平行设置为 false 并执行
if(!parallel[i]) {...}。在{...}中将parallel[i] 设置为true(它已被使用)并继续您的一天。 --bool parallel[52];