【问题标题】:Inserting values into objects from a function从函数向对象中插入值
【发布时间】:2021-09-03 02:38:01
【问题描述】:

我用c ++制作了一个二十一点游戏,我有一个将牌分发给房子玩家和其他玩家的函数,这个函数获取一个对象是纸牌,一个对象是房子玩家,以及作为其他玩家的对象数组,问题是当您退出函数时,该对象不包含函数中发给他的牌,与包含的对象数组(其他玩家)相比


#include <iostream>
using namespace std;
#define NumberOfPlayers 1

class Card {

public:
    int CardValue;
    string type;
    string RoyalCard = "";

    friend class Pack;
    friend class Player;
    friend ostream& operator<<(ostream& out, Card c);
};

class Pack {

public:
    Card P[13][4];
    bool visible[13][4];

    Pack() {

        for (int i = 0; i < 13; i++) {
            for (int j = 0; j < 4; j++) {
                visible[i][j] = true;
            }
        }

        for (int i = 0; i < 13; i++) {
            for (int j = 0; j < 4; j++) {

                P[i][j].CardValue = i + 1;

                switch (j) {
                case 0: {
                    P[i][j].type = "Heart";
                    break;
                }
                case 1: {
                    P[i][j].type = "Diamond";
                    break;
                }
                case 2: {
                    P[i][j].type = "Clover";
                    break;
                }
                case 3: {
                    P[i][j].type = "Leaf";
                    break;
                }
                }

                switch (P[i][j].CardValue) {
                case 1: {
                    P[i][j].RoyalCard = "Ace";
                    break;
                }
                case 11: {
                    P[i][j].CardValue = 10;
                    P[i][j].RoyalCard = "Prince";
                    break;
                }
                case 12: {
                    P[i][j].CardValue = 10;
                    P[i][j].RoyalCard = "Queen";
                    break;
                }
                case 13: {
                    P[i][j].CardValue = 10;
                    P[i][j].RoyalCard = "King";
                    break;
                }
                }
            }
        }
    }

    friend ostream& operator<<(ostream& out, Pack p);
};

class Player {
    
public:
    string Name;
    int Points = 0;
    int Money = 200;
    int NumberOfPlayerCards = 0;
    Card PlayerCards[6];

    Player() {
        cout << "Enter player name: ";
        cin >> Name;
        cout << "\n";
    }

    Player(string name, int money) {
        Name = name;
        Money = money;  
    }

    int ChooseValueOfAce() {

        int Ace;
        
        cout << "Select the value of your Ace card: 1/11\n";
        do {
            cin >> Ace;
        }       
        while (Ace != 1 && Ace != 11);

        cout << "\n";

        return Ace;
    }

    friend iostream& operator<<(iostream& out, Player p);
};

ostream& operator<<(ostream& out, Card c) 
{
    if (c.CardValue == NULL || c.type == "") {
        return cout;
    }

    else {
        if (c.RoyalCard != "") {
            cout << c.RoyalCard << " " << c.type << " ";        
        }
        else {
            cout << c.CardValue << " " << c.type << " ";
        }
    }
    return out;
}

ostream& operator<<(ostream& out, Pack pack)
{
    for (int i = 0; i < 13; i++) {
        for (int j = 0; j < 4; j++) {
            
            cout << pack.P[i][j] << " ";
            
            if (pack.visible[i][j]) {
                cout << "True\n";
            }
            else {
                cout << "False\n";
            }
        }
    }

    cout << "\n";

    return out;
}

ostream& operator<<(ostream& out, Player player) {

    cout << "Name: " << player.Name << "\n";

    if (player.NumberOfPlayerCards > 0) {

        cout << "Cards: ";
    for (int i = 0; i < player.NumberOfPlayerCards; i++) {
        cout << player.PlayerCards[i] << "       ";

        if (i == player.NumberOfPlayerCards - 1) {
            cout << "\n";
        }
        else {
            cout << "\n       ";
        }
    }
    }

    cout << "Points: " << player.Points << "\nMoney: " << player.Money << "$" << "\n\n";

    return out;
}

Pack DividingCards(Pack pack, Player players[], Player cp) {

    srand(time(0));
    
    int chooseCardValue;
    int chooseCardType;

    for (int j = 0; j < 2; j++) {
        chooseCardValue = rand() % 13;
        chooseCardType = rand() % 4;

        if (pack.visible[chooseCardValue][chooseCardType]) {
            cp.PlayerCards[j] = pack.P[chooseCardValue][chooseCardType];
            cp.NumberOfPlayerCards++;
            pack.visible[chooseCardValue][chooseCardType] = false;
            if (cp.PlayerCards[j].CardValue != 1) {
                cp.Points += cp.PlayerCards[j].CardValue;
            }
        }
        else {
            j--;
        }
    }
    
    for (int i = 0; i < NumberOfPlayers; i++) {
        for (int j = 0; j < 2; j++) {
            chooseCardValue = rand() % 13;
            chooseCardType = rand() % 4;

            if (pack.visible[chooseCardValue][chooseCardType]) {
                players[i].PlayerCards[j] = pack.P[chooseCardValue][chooseCardType];
                players[i].NumberOfPlayerCards++;
                pack.visible[chooseCardValue][chooseCardType] = false;

                if (players[i].PlayerCards[j].CardValue != 1) {
                    players[i].Points += players[i].PlayerCards[j].CardValue;
                }
            }
            else {
                j--;
            }
        }
    }

    return pack;
}

Pack TakingAnotherCard(Pack pack, Player player) {

    char x = NULL;

    while (x != 'Y' && x != 'N') {
        cout << "Do you want to take another card?\nPress: Y/N\n";
        cin >> x;
    }

    if (x == 'N') {
        return pack;
    }
    else {
        srand(time(0));

        int chooseCardValue;
        int chooseCardType;

        while (1) {
            chooseCardValue = rand() % 13;
            chooseCardType = rand() % 4;

            if (pack.visible[chooseCardValue][chooseCardType]) {
                player.PlayerCards[player.NumberOfPlayerCards] = pack.P[chooseCardValue][chooseCardType];
                pack.visible[chooseCardValue][chooseCardType] = false;

                if (player.PlayerCards[player.NumberOfPlayerCards].CardValue != 1) {
                    player.Points += player.PlayerCards[player.NumberOfPlayerCards].CardValue;
                }
                player.NumberOfPlayerCards++;
                break;
            }
        }
    }

    return pack;
}

int main() {

    Player cp("CPU", 500);
    Player players[NumberOfPlayers];
    Pack pack;
    pack = DividingCards(pack, players, cp);

    cout << pack;
    cout << cp;

    for (int i = 0; i < NumberOfPlayers; i++) {
    cout << players[i];
    }

    for (int i = 0; i < NumberOfPlayers; i++) {
        for (int j = 0; j < players[i].NumberOfPlayerCards; j++) {
            if (players[i].PlayerCards[j].CardValue == 1) {
                players[i].Points += players[i].ChooseValueOfAce();

                for (int i = 0; i < NumberOfPlayers; i++) {
                    cout << players[i];
                }
            }
        }
    }

    for (int i = 0; i < NumberOfPlayers; i++) {
        pack = TakingAnotherCard(pack, players[i]);
        cout << players[i];
    }
}

【问题讨论】:

  • 很多代码似乎与问题无关。无论如何,只是略读一下,似乎您正在将诸如“播放器”之类的内容按值传递给函数,这意味着它将被复制。如果你想在函数内部修改它,你需要通过引用传递它,比如Pack DividingCards(Pack pack, Player players[], Player&amp; cp)(注意与号)
  • 您能否更具体地说明什么不起作用?您期望的输出是什么? srand(time(0)); 通常只能在程序开始时调用一次。调高编译器警告级别并注意它们。
  • Pack TakingAnotherCard(Pack pack, Player player)这个函数也应该使用引用参数。

标签: c++ function object call blackjack


【解决方案1】:

这只是在键盘上敲出来的,但Card 是一个值类型。您似乎还复制了包中的牌(由经销商持有)和玩家的牌(在桌子上可见)。也许你可以从这里开始:

/* This code is very incomplete
 */

class Card
{
public:
    enum Type { Heart, Diamond, Clover, Leaf, NumberOfTypes };
    enum Value { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Prince, Queen, King, NumberOfValues };

    Card(Type t, Value v)
    : m_type(t), m_value(v)
    {
    }

    Type type() const { return m_type; }
    Value value() const { return m_value; }
};

class Dealer
{
public:
    /** \brief Give the initial set of cards to the players
      */
    void dealTo(std::vector<Player>& players);

    /** \brief Move a random card from the dealer's pack into the player's pack
     */
    void giveCardTo(Player& player);

private:
    std::set<Card> generatePack()
    {
        std::set<Card> pack;

        for(int type = 0; type < NumberOfTypes; ++type)
            for(int value = 0; value < NumberOfValues; ++value)
                pack.insert(Card((Card::Type)type, (Card::Value)value));

        return pack;
    }
};

class Player
{
public:
    /** \brief Add the card to our own pack
     */
    void receive(Card card);

    /** \brief The points are calculated based on the current pack
     */
    int points() const;

private:
    std::set<Card> pack;
};

因此,总是只有 52 张牌。为了给玩家一张牌,你将一张牌从代表庄家的牌组移到代表牌手的牌组中。这也遵循Tell, Don't Ask 理念,因为荷官将一张牌传给二十一点中的玩家。玩家不拿牌。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2016-03-17
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多