вектор — C ++ random_shuffle () не ведет себя должным образом

У меня есть программа Блэкджек, которая использует вектор, полный целых чисел, для имитации колоды карт:

vector<short int> deck;

и заполнили его 1-10:

for (int i=0; i<=4; ++i) // Populate the deck with 1-10
{
for (int c=1; c<=10;++c)
{
deck.push_back(c);
}
}
for (i=0; i<=12;++i)
{
deck.push_back(10); // Face cards
}

затем посеял генератор случайных чисел:

srand(time(0)+1);

И попытался перетасовать колоду random_shuffle(deckofcards.begin(), deckofcards.end()); однако, когда пользователь решает нанести удар, карта, которой он сдается, является ТОЧНЫМ ЖЕ для всей игры, вот некоторый пример вывода:

Dealer: I'm gonna play it safe
Dealer bets $42
Dealing cards...
Dealer lays down a 5
You have a 3, and a 10 and your total is 13
Stand, or hit? Stand, or hit? hit
You have been dealt an Ace, your hand is soft, and your total is now 14
Stand, or hit? hit
You have been dealt an Ace, your hand is soft, and your total is now 15
Stand, or hit? hit
You have been dealt an Ace, your hand is soft, and your total is now 16
Stand, or hit? hit
You have been dealt an Ace, your hand is soft, and your total is now 17
Stand, or hit? hit
You have been dealt an Ace, your hand is soft, and your total is now 18
Stand, or hit? hit
You have been dealt an Ace, your hand is soft, and your total is now 19
Dealer calls stand
The dealer has a 3, a 10, an Ace , an Ace , an Ace , an Ace , an Ace , an Ace    for      total of 17, you have a 3, a 10, an Ace , an Ace , an Ace , an Ace , an Ace , an         Ace  you win 1042!

Если это поможет, вот код, когда пользователь вводит hit:

playerhand.push_back(deck.front());
ptotal+=playerhand.back();
if (playerhand.back()!=1)
cout << "You have been dealt a "<<playerhand.back()<<", your total is now"<<ptotal<<endl;
else
cout << "You have been dealt an Ace, your hand is soft, and your total is now "<<ptotal<<endl;
dealerhand.push_back(deck.front());
dtotal+=dealerhand.back();

Тем не менее, этот код работает, но сдает две карты:

cout << "Dealing cards...\n";
playerhand.clear();
dealerhand.clear();
playerhand.push_back(deck.back());
deck.pop_back();
dealerhand.push_back(deck.back());
deck.pop_back();
if (dealerhand.back()==1)
dhsoft=true;
else
dhsoft=false;
if (playerhand.back()==1)
{
phsoft=true;
cout << "Your hand is soft\n";
}
else
phsoft=false;
playerhand.push_back(deck.back());
deck.pop_back();
dealerhand.push_back(deck.back());
deck.pop_back();
if (dealerhand.back()==1)
dhsoft=true;
else
dhsoft=false;
if (playerhand.back()==1)
{
cout << "Your hand is soft\n";
phsoft=true;
}
else
phsoft=false;
unsigned int i;
for (i=0;i<=dealerhand.size()-1; ++i)
dtotal+=dealerhand[i];
for (i=0;i<=playerhand.size()-1; ++i)
ptotal+=playerhand[i];

Итак, почему вышеупомянутый код работает, но тот, когда пользователь нажимает «хит», не работает?
И, что более важно, как я могу это исправить (без кода!)?

3

Решение

Причина, по которой он возвращает одну и ту же карту снова и снова, заключается в том, что deck.front() просто возвращает ссылку на передний элемент, но не удаляет его. Но с тех пор vector не имеет удобного способа фактического удаления переднего элемента, я бы рекомендовал просто удалить задний:

playerhand.push_back(deck.back());
deck.pop_back();

В любом случае колода случайна, не имеет значения, с какой стороны вы имеете дело.

4

Другие решения

Других решений пока нет …