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

问题描述

我正在尝试将向量card_of_cards中的5个元素推回向量vector1_hand中,然后将这些元素弹出_pop_back以减少deck_of_cards,然后向量vector2_hand中的向量deck_of_cards中的下5个元素,等等。我可以使用player1_hand的当前代码来push_back。 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 403 103 112 204 208 109 110 214 405 213 114 210 106 411 205 202 108 310 311 307 307 207 408 406 212 410 410 107 107 409209

Player1卡 308309302102211312

Player2卡 308309302102211312

这是我的代码

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

解决方法

考虑这些行

 sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.6

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] stats4    parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] shinyWidgets_0.5.3       dendextend_1.14.0        tidyr_1.1.2             
 [4] patchwork_1.0.1          ggplot2_3.3.2            shinyhelper_0.3.2       
 [7] colorspace_1.4-1         colourpicker_1.1.0       shinythemes_1.1.2       
[10] DT_0.15                  dplyr_1.0.2              shinydashboardPlus_0.7.5
[13] shinydashboard_0.7.1     shiny_1.5.0              MSnbase_2.14.2          
[16] ProtGenerics_1.20.0      S4Vectors_0.26.1         mzR_2.22.0              
[19] Rcpp_1.0.5               Biobase_2.48.0           BiocGenerics_0.34.0   

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

至少有两种方法可以达到预期效果:

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) << " ";
}
,

“请考虑以下内容:”

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结构:
构造,复制,销毁,输入(来自用户)和输出(至用户),
以及比较(排序和相等)。

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

,

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

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

deck_of_cards.erase(deck_of_cards.begin() )

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