c++ - 如何在 C++ 中处理一副纸牌

标签 c++ class dynamic-arrays

我的要求如下:

int Deal(int,CardSet&,CardSet&) 在传递的两个 CardSet 参数中发两手牌。

每手牌的张数是第一个参数。应该一次一张地从当前的牌组中取出牌,将牌交到交替的手中。

例如。如果当前牌组有 2S, 3S, 4S, 5S, 6S, 7S(整数 0 到 5)并且我们必须发 3 张牌,那么两只手都会得到 2S, 4S , 6S(整数 0、2、4)和 3S、5S、7S(1、3、5)。

两只手上可能已经有牌了,追加的牌需要新的内存。不要比需要的更频繁地创建新内存。

请记住,当前集的大小也必须减小。如果当前集合中没有足够的卡片来执行交易,则打印错误 消息并终止。

我不知道我在 Deal() 函数中的错误是什么。程序运行没有任何错误,但我得到的输出是错误的:请帮助我纠正我的错误(如果有的话)。

我在 main() 中定义的类对象是:

CardSet CardSet1(104), CardSet2(12), CardSet3, CardSet4, CardSet5, CardSet6;
cout << "Dealing 3 Cards from CardSet1 into CardSet3 and CardSet4: " <<endl;
CardSet1.Deal(3,CardSet3,CardSet4);
cout << "Printout of CardSet1:" << endl;
CardSet1.Print();
cout << "Printout of CardSet3:" << endl;
CardSet3.Print();
cout << "Printout of CardSet4:" << endl;
CardSet4.Print();
cout << endl;

这是类:

class CardSet
{
public:
    CardSet();
    CardSet(int);
    ~CardSet();
    int Size() const;
    bool IsEmpty() const;
    void Shuffle();
    int Deal();
    void Deal(int,CardSet&,CardSet&);
    void Deal(int,CardSet&,CardSet&,CardSet&,CardSet&);
    void AddCard(int);
    void MergeShuffle(CardSet&);
    void Print() const;
private:
    int* Card;
    int nCards;
    void PrintCard(int c) const;
};

这是我必须使用的功能:

CardSet::CardSet()
{
    Card = NULL;
    nCards =0;
}

CardSet::CardSet(int crd)
{
    int nCard;
    Card = new int[crd];
    nCards=crd;

    for(int i=0; i<nCards; i++)
    {
        Card[i]=i%52;
    }
}

CardSet::~CardSet()
{
    delete [] Card;
}

int CardSet::Size() const
{
    return nCards ;
}

void CardSet::Shuffle()
{
    int shuffle, tmp;
    for (int i=0; i<nCards-1; i++)
    {
        shuffle = rand() % 52;
        tmp = Card[i];
        Card[i]=Card[shuffle];
        Card[shuffle]= tmp;
    }
}

int CardSet::Deal()
{
    int a;
    a = Card[0];
    return a; // return Card[0]
    int *newSet = NULL;
    newSet = new int[nCards];

    if(nCards==0)
    {
        cerr << "The set is empty ." << endl;
        exit(1);
    }
    else
    {
        for(int i =0; i<nCards; i--)
        {
            newSet[i] = Card[i+1];
        }
        delete [] Card;
    }
}
void CardSet::Deal(int ncard, CardSet& crdHand1, CardSet& crdHand2 )
{
    int a;
    a =nCards/3;
    for(int i=0; i<a; i++)
    {
        for(int j=0; j<ncard; j++)
        {   
            if(nCards==0)
            {
                cerr << "No more Cards. " <<endl;
                exit(1);
            }
            else if(i%2==0)
            {
                crdHand1 = Card[i];
            }
            else if(i%2==1)
            {
                crdHand2 = Card[i];
            }
        }
    }
}

这是输出: 当我实现 crdHand1 或 crdHand2 时。输出应该是这样的

 for CardSet1:
 2S 4S 6S 8S XS
 QS AS 3C 5C 7C
 .....
 for CardSet4:
 3S 5S 7S 9S JS
 KS 2C 4C 6C 8C
 ......
and so on until cards are finished

enter image description here

最佳答案

你可以使用 std::shuffle()对于 <vector>洗牌

private void setCardDeck() {
    for (int i = 0; i < Card.Rank.values().length; i++) {
        for (int j = 0; j < Card.Suit.values().length; j++) {
            cardDeck.push_back(new Card(Card.Rank.values()[i], Card.Suit.values()[j]));
        }
    }

    std::shuffle(cardDeck.begin(), cardDeck.end());
}

来 self 在 Java 上的扑克实现。 RankSuitenum秒。

感谢Bob__进行改进。

关于c++ - 如何在 C++ 中处理一副纸牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49809896/

相关文章:

c++ - 在 C++ 代码中设置 while 循环的执行速率以实现实时同步

c++ - C++ char类findCharIndex

c++ - SIGSEGV 同时尝试读取数组

c++ - 如何从动态分配的数组中删除元素?

使用指针将 Integer 逐位转换为动态分配的 Char 数组

c++ - 如何捕获私有(private)成员子类对象的异常?

c++ - 将非静态 const 数组声明为类成员

c++ - 重用存储是否开始新对象的生命周期?

flutter - 为什么我们应该在 dart 中使用 static 关键字代替抽象?

c# - 通过CMD以兼容模式运行可执行文件