2013-04-06 2 views
3

У меня есть программа, которая использует 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», не работает? И, что более важно, как я могу это исправить (без кода!)?

ответ

4

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

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

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

+0

Кроме того, если вы посеяны до фиксированного значения с помощью srand, вы всегда будете получать один и тот же случайный порядок (даже после фиксации без удаления из-де-колоды bg) – James

+0

Он не посеял фиксированное значение. – Barry

+0

@james, я посеял со временем (0) +1, который должен быть другим – theunamedguy

Смежные вопросы