3

我有一个二十一点程序,它使用一个充满整数的向量来模拟一副牌:

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];

那么,为什么上面的代码可以工作,但是当用户输入“hit”的时候却不行呢?而且,更重要的是,我该如何修复它(没有代码!)?

4

1 回答 1

4

它一遍又一遍地返回同一张卡片的原因是它只返回deck.front()对前面元素的引用,而不是删除它。但是由于vector没有一种方便的方法来实际移除前面的元素,我建议只移除后面的元素:

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

无论如何,套牌都是随机的,无论您从哪种方式进行交易都没关系。

于 2013-04-06T21:29:43.560 回答