一副纸牌,随机选择一张纸牌并使用两个数组

Deck of Cards, pick a random card and use two arrays

好的,我正在创建一副纸牌,正如许多其他人所问的那样,我可以让所有纸牌都显示在我的代码中,但问题是它们每次的顺序都相同。我已经按照我的教授想要的方式拿到卡片 class,但是牌组 class 是我的问题。有几件事,她希望我们为西装使用枚举,她希望我们将设置方法保密,看看为什么我们不应该这样做。 (不要问我这有什么意义,但这就是她想要的)上面的说明是:

Deck 构造函数将构建一个包含所有 52 个 Card 对象的数组。也就是说,它将构建 Card 对象。它应该有一个与指示牌是否已从牌组中移除的数组平行的数组。它应该有一种从牌组中随机挑选一张牌的方法。此方法将删除 return 一张卡片。

我只是停留在并行阵列部分,如何让它检查是否从原始阵列中删除了某些内容?我应该如何选择随机卡?

如有任何反馈,我们将不胜感激!

这也是我的代码:

#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 . . .

It should have an array parallel to the array that indicates whether the card has been removed from the deck.

短语 "indicates whether" 表明需要布尔值。在您的例子中,这是一个包含 52 个布尔值的数组,因此 bool is_removed[52];.

[…] how do I get it to check if something was removed from the original array?

您不想检查是否从原始数组中删除了某些内容,因为您实际上并不想从原始数组中删除任何内容。曾经。相反,要从牌组中移除一张牌,只需将 is_removed[i] 设置为 true(其中 i 是适当的索引);并检查一张牌是否已从牌组中移除,您只需检查 is_removed[i].