使用向量为每个玩家发 5 张牌

Dealing 5 cards per player using vectors

我正在尝试 push_back 从向量 deck_of_cards 到向量 player1_hand 和 pop_back 的 5 个元素来减少 deck_of_cards,然后下一个向量 deck_of_cards 的 5 个元素用于向量 player2_hand,等等。我可以 push_back 使用当前代码 player1_hand。 Player2_hand 推送相同的元素,因此我无法弹出输出中看到的元素:

洗牌 308 309 302 102 211 312 313 414 306 402 113 203 413 206 104 305 314 404 407 304 105 111 412 403 103 112 204 208 109 110 214 405 213 114 210 106 411 205 202 108 310 311 307 207 408 406 212 410 303 107 409 209

Player1 卡片 308 309 302 102 211 312

Player2 卡片 308 309 302 102 211 312

这是我的代码:

class deck
{
private:
    int x;
    vector <int> deck_of_cards
    {
        102,103,104,105,106,107,108,109,110,111,112,113,114,
        202,203,204,205,206,207,208,209,210,211,212,213,214,
        302,303,304,305,306,307,308,309,310,311,312,313,314,
        402,403,404,405,406,407,408,409,410,411,412,413,414
    };

public:
    vector <int> player1_hand;
    vector <int> player2_hand;
    int shuffle_deck()
    {
        unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();

        shuffle(deck_of_cards.begin(), deck_of_cards.end(), default_random_engine(seed));

        cout << "shuffled deck\n";
        for (int x = 0; x < deck_of_cards.size(); x++)
        {
            cout << deck_of_cards.at(x) << " ";
        }
        return 0;
    };

    int deal()
    {
        cout << "\nPlayer1 cards\n";
        for (int d = 0; d < 6; d++)
        {
            int& element = deck_of_cards[d];
            player1_hand.push_back(deck_of_cards[d]);
            deck_of_cards.pop_back();
            cout << player1_hand.at(d) << " ";
        }
        cout << "\nPlayer2 cards\n";
        for (int e = 0; e < 6; e++)
        {
            int& element = deck_of_cards[e];
            player2_hand.push_back(deck_of_cards[e]);
            deck_of_cards.pop_back();
            cout << player2_hand.at(e) << " ";
        }
        return 0;
    }
};

int main()
{
    deck d;
    d.shuffle_deck();
    d.deal();

    return 0;
};

pop_back() 擦除向量的最后一个元素,而不是第一个。因此,每次您向玩家手牌抽一张牌时,您都会从牌组中移除最后一张牌,而不是您给他的那张。

要删除第一个元素,您可以使用擦除。

deck_of_cards.erase(deck_of_cards.begin() )

您还需要更改 push_back() 行以使用 0 作为索引而不是 d 和 e,因为每次删除第一个元素时,整个向量都会向后移动一个索引。

考虑这些行

for (int d = 0; d < 6; d++)
{
     int& element = deck_of_cards[d];   // <- Unused variable
     player1_hand.push_back(deck_of_cards[d]);
     //                                   ^   The FIRST 6 cards of the deck are added
     //                                       to the player hand
     deck_of_cards.pop_back();
     //                ^^^^                   The LAST cards of the deck are removed
     cout << player1_hand.at(d) << " ";
}

在下一个循环中也会发生同样的情况,因此其他玩家的手牌包含相同的牌(洗牌后的前 6 张牌)。

至少有几种方法可以按预期进行:

std::cout << "\nPlayer1 cards\n";
for (int d = 0; d < 6; d++)
{
    player1_hand.push_back(deck_of_cards.back());
    //                                    ^^^^^^    The last card of the deck is added
    deck_of_cards.pop_back();
    //                ^^^^                          The same card is removed
    std::cout << player1_hand.back() << " ";
}

// Or:
std::cout << "\nPlayer2 cards\n";
auto it = std::next(deck_of_cards.end(), -6);
player2_hand.insert(player2_hand.end(), it, deck_of_cards.end());
deck_of_cards.erase(it, deck_of_cards.end());
for ( auto card : player2_hand )
{
    std::cout << card << " ";
}

“请考虑以下事项:”

enum Card_Suit { HEART, CLUB, DIAMOND, SPADE};

struct Card
{
  Card_Suite suit;
  int        value;
};

std::vector<Card> deck;
std::vector<Card> player1_hand;

在上面的代码中,一个struct用来模拟一张卡片。 Card 花色, 价值。易于阅读。

一副纸牌由 std::vector<Card> 表示。
玩家的手牌由 std::vector<Card>.

表示

这里有个好主意,您可以一张牌从deck移到玩家手上。

您可以通过添加以下方法来扩充 Card 结构:
构造、复制、破坏、输入(来自用户)和输出(给用户),
以及比较(排序和相等)。

其他涉及卡片的功能取决于您玩的游戏。