0

我正在使用向量来表示 C++ 中的一副牌。我在洗牌和移除第一个元素时遇到了麻烦。

洗牌不起作用,向量保持相同的顺序。我在我的程序中调用 reseed 一次,在 Deck 的构造函数中。int random 每次都不一样。我试过时间(NULL)和时间(0)。洗牌:

void Deck::reseed() {
srand(time(NULL));
}

void Deck::shuffle() {
int random = rand();
for(int i = 0; i < random; i++) {
    std::random_shuffle(deckVec.begin(), deckVec.end());
}
}

删除不起作用,最后一个元素被删除而不是第一个(例如,元素 16 被删除而不是元素 0)。删除:

Card Deck::dealCard() {
//other code...
Card& tempCard = deckVec.front();
std::vector<Card>::iterator temp = deckVec.begin(); //This if for debugging, and 
                                                    //this pointer is correct   
deckVec.erase(deckVec.begin()); 
return tempCard; //the correct card is returned
    }

任何帮助,将不胜感激。

-----------Update---------------- 洗牌前后的打印代码:

cout << deck.toString(); //output: Suit: Clubs, Rank: 2
                         //        Suit: Clubs, Rank: 3 ...   
//shuffle if there are three arguments
if(argc == 3)
   deck.shuffle();
cout << deck.toString();//output: Suit: Clubs, Rank: 2
                        //        Suit: Clubs, Rank: 3 ... (identical to above) 

很难显示交易卡。基本上,我在这里称它为:

void operator<<(Hand& hand, Deck& deck) {
    hand.addCard(deck.dealCard());
}

然后我打印出内容。输出为:C2 C2 C2 C2 ... 用于俱乐部 2。它们都是套牌中的第一张牌。

for(int i = 0; i < 5; i++) {
            for(unsigned int j = 0; j < hands.size(); j++) {
                try {
                hands.at(j) << deck;
                } catch(int& i) {
                    cout << "no cards left" << endl;
                }
            }
        }

        //print out the contents
        cout << deck.toString() << endl;
        for(unsigned int i = 0; i < hands.size(); i++) {
            cout << "Hand " << i << ": ";
            cout << hands.at(i).toString() << endl;
        }
4

0 回答 0