我正在使用向量来表示 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;
}