gpt4 book ai didi

c++ - 随机洗牌似乎产生相同的结果,但仅在前两种情况下。我该如何避免这种情况?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:21 25 4
gpt4 key购买 nike

我不得不为类里面的二十一点游戏编程。一切似乎都运行良好,除了在初始化游戏时洗牌(抽前两张牌)。从那时起,一切似乎都是随机的。

我将提供所有必要的代码。我正在使用的 randomWithLimits 函数:

int randomWithLimits(int upperLimit, int lowerLimit)
{
return (std::rand() % (upperLimit - lowerLimit + 1) + lowerLimit);
}

很简单,它在 main 中播种,像这样:

int main()
{
srand(time(nullptr));
Blackjack bj;
bool play = true;
while (play == true) play = bj.playGame();
return 0;
}

blackjack 函数本身很长,但这里是不能正常工作的部分(第一轮):

bool Blackjack::playGame() {
CardDeck deck = CardDeck();
std::cout << "The dealer shuffles the deck\n";
deck.shuffle();
drawInitialCards();
std::cout << "\nYour hand is currently " << playerHand << ".";


{...}


std::string cont;
std::cout << "\n\n\nDo you wish to play another round? (y/n) ";
std::cin >> cont;
while (cont != "y" && cont != "n") {
std::cout << "\nNot a valid choice, choose again: (y/n) ";
std::cin >> cont;
}
if (cont == "y") return true;
else return false;
}

CardDeck就是一个具有这个功能的类

CardDeck::CardDeck() {
int count = 0;
for (int s = CLUBS; s <= SPADES; s++) {
for (int r = TWO; r <= ACE; r++) {
Card card(static_cast<Suit>(s), static_cast<Rank>(r));
cards.push_back(card);
}
}
currentCardIndex = 0;
}

创建甲板。 currentCardIndex 跟踪已经抽取了多少张牌,s 是一个名为 Suit 的枚举类型,r 是一个名为 Rank 的枚举类型。这似乎工作正常。

它使用了这个随机播放功能,

void CardDeck::shuffle() {
int count = 0;
while (count < 100) {
int a = randomWithLimits(51, 0);
int b = randomWithLimits(51, 0);
swap(a, b);
count++;
}
}

它使用了之前的 randomWithLimits 函数和这个交换函数

void CardDeck::swap(int a, int b) {
Card temp = cards[a];
cards[a] = cards[b];
cards[b] = temp;
}

这不是什么大问题,但它仍然困扰着我。每当我第一次编译和运行函数时,第一个输出总是:

The dealer shuffles the deck

You drew a Two of Clubs.
The dealer drew a card.

You drew a Four of Clubs.
The dealer drew a card.
Your hand is currently 6.

从那时起,每张牌似乎都是随机的。抽卡函数:

Card CardDeck::drawCard() {
currentCardIndex++;
return cards[currentCardIndex - 1];
}

drawInitialCards 函数:

void Blackjack::drawInitialCards() {
Card card = deck.drawCard();
std::cout << "\nYou drew a " << card.toString() << ".";
playerHand = getPlayerCardValue(&card);
card = deck.drawCard();
std::cout << "\nThe dealer drew a card.";
dealerHand = getDealerCardValue(&card, dealerHand);
card = deck.drawCard();
std::cout << "\n\nYou drew a " << card.toString() << ".";
playerHand += getPlayerCardValue(&card);
card = deck.drawCard();
std::cout << "\nThe dealer drew a card.";
dealerHand += getDealerCardValue(&card, dealerHand);
}

我试过随机播放函数交换卡片的次数,无论是将种子放在主函数还是 playGame 函数等,但我总是得到这个结果。有帮助吗?

最佳答案

发现错误。这个

bool Blackjack::playGame() {
CardDeck deck = CardDeck();

应该简单地写成

bool Blackjack::playGame() {
deck = CardDeck();

看来我按照我的想法创建了一个新的套牌。

关于c++ - 随机洗牌似乎产生相同的结果,但仅在前两种情况下。我该如何避免这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42288601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com