У меня есть программа, которая использует Blackjack вектор полного целых чисел для имитации колоды карт: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);
И attem pted перетасовать колоду с 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];
Так почему же вышеприведенный код будет работать, бу t тот, когда пользователь набирает «hit», не работает? И, что более важно, как я могу это исправить (без кода!)?
Кроме того, если вы посеяны до фиксированного значения с помощью srand, вы всегда будете получать один и тот же случайный порядок (даже после фиксации без удаления из-де-колоды bg) – James
Он не посеял фиксированное значение. – Barry
@james, я посеял со временем (0) +1, который должен быть другим – theunamedguy