需要帮助比较开关盒,以确保拾取的卡不相同

问题描述 投票:0回答:2

我正在尝试为单人二十一点编写C ++程序,但我不确定如何确保所抽取的卡都不相同。我使用大小写转换方法随机抽取2张卡,但不确定如何选择2张不同的卡。

int player_card1 = rand() % 13 + 1;     //player card 1
int player_card2 = rand() % 13 + 1;  //player card 2
    int value = 0;
cout << "Current Hand: ";
switch (player_card1) {
    case 10: cout << "A-";
        value+=10;
        break;
    case 11: cout << "J-";
        value+=10;

        break;
    case 12: cout << "Q-";
        value+=10;

        break;
    case 13: cout << "K-";
        value+=10;

        break;
    default: cout << player_card1 << "-";
        value+=player_card1;

        break;
}
switch (player_card2) {
    case 10: cout << "A";
        value+=10;
        cout << " with a value of " << value;
        break;
    case 11: cout << "J";
        value+=10;
        cout << " with a value of " << value;

        break;
    case 12: cout << "Q";
        value+=10;
        cout << " with a value of " << value;

        break;
    case 13: cout << "K";
        value+=10;
        cout << " with a value of " << value;

        break;
    default: cout << player_card2;
        value+=player_card2;
        cout << " with a value of " << value;

        break;
}
    cout << endl;
}
c++ blackjack
2个回答
1
投票

您可以在进行操作时抽出第一张卡:

int player_card1 = rand() % 13 + 1;     //player card 1

然后继续尝试画第二张纸牌,直到获得与第一张纸牌不同的纸:

int player_card2 = rand() % 13 + 1;
//Keep drawing until we get a different card from player 1
while(player_card2 == player_card1) { player_card2 = rand() % 13 + 1; }

或者,如果您想成为一名鸽友:

int player_card2;
while( (player_card2 = rand() % 13 + 1) == player_card1 ) { }

0
投票

您可以制造一副纸牌并将纸牌分发给玩家。随机放置卡片盒。发行卡片时,请从容器中取出卡片。这样可以确保不会重复。

数学,没有魅力

甲板上有52张卡片。如果我们将卡片从0到51编号,则可以使用一些数学运算来确定卡片:

Card suit == (card number / 13)

因此,您可以映射西服编号,例如0:黑桃,1:心脏,2:俱乐部,3:钻石。

Card Value == (card number) % 13

卡片组可以是整数的向量:

std::vector<int> deck(52);

初始化套牌:

for (int i = 0; i < 52; ++i)
{
    deck[i] = i;
}
std::random_shuffle(deck.begin(), deck.end());

让我们使用std::vector作为玩家的手:

std::vector<int> players_hand;

处理玩家需要将卡片从卡组移到玩家的手上:

players_hand.push_back(deck[0]);
players_hand.push_back(deck[1]);
deck.erase(deck.begin(), deck.begin() + 2);

可以通过使用数学运算(以上)以更加可读的方式显示玩家的手。

可读性结构

可以通过将卡表示为struct来增强上述算法。

enum class Card_Suit : int {SUIT_SPADES, SUIT_HEARTS, SUIT_CLUBS, SUIT_DIAMONDS};

struct Card
{
    enum Card_Suit suit;
    int            face_value;
};

您将需要使用输入和输出方法来扩展Card类,并可能添加一些有用的方法(例如,添加面值)。

© www.soinside.com 2019 - 2024. All rights reserved.