Вставка значений в объекты из функции

#c #function #object #call #blackjack

Вопрос:

Я делаю игру в блэкджек на 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 ostreamamp; operator<<(ostreamamp; 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 ostreamamp; operator<<(ostreamamp; 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/11n";
        do {
            cin >> Ace;
        }       
        while (Ace != 1 amp;amp; Ace != 11);

        cout << "n";

        return Ace;
    }

    friend iostreamamp; operator<<(iostreamamp; out, Player p);
};

ostreamamp; operator<<(ostreamamp; 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;
}

ostreamamp; operator<<(ostreamamp; 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 << "Truen";
            }
            else {
                cout << "Falsen";
            }
        }
    }

    cout << "n";

    return out;
}

ostreamamp; operator<<(ostreamamp; 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 << "$" << "nn";

    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' amp;amp; x != 'N') {
        cout << "Do you want to take another card?nPress: Y/Nn";
        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];
    }
}
 

Комментарии:

1. Это много кода, который, по-видимому, не имеет отношения к проблеме. В любом случае, просто просматривая его, кажется, что вы передаете такие вещи, как «Игрок», в функцию по значению, что означает, что она будет скопирована. Если вы хотите изменить его внутри функции, вам нужно передать его по ссылке, например Pack DividingCards(Pack pack, Player players[], Playeramp; cp) (обратите внимание на амперсанд)

2. Не могли бы вы уточнить, что именно не работает? Какой результат вы ожидаете? srand(time(0)); как правило, следует вызывать только один раз в начале вашей программы. Повысьте уровень предупреждений компилятора и обратите на них внимание.

3. Pack TakingAnotherCard(Pack pack, Player player) эта функция также должна использовать ссылочные параметры.

Ответ №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>amp; players);

    /** brief Move a random card from the dealer's pack into the player's pack
     */
    void giveCardTo(Playeramp; 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 карты. Чтобы дать игроку карту, вы перемещаете карту из набора, представляющего колоду дилера, в набор, представляющий руку игрока. Это также следует из инструкции «Не спрашивайте философии», потому что дилер передает карту игроку в блэкджек. Игрок не берет карту.