Инициализация массива структур - PullRequest
0 голосов
/ 11 мая 2010

Привет, я работаю над программой, в которой мне нужно инициализировать колоду карт. Я использую структуру для представления карты. Однако я не заполняю это правильно, поскольку я получаю кучу нулей, когда я показываю колоду карт. Я считаю, что моя ошибка в этой строке, но я не уверен:

struct card temp = {"Clubs", value, false};

код:

void initCards(){

    int count = 0;
    int location = 0;
    const int hand = 12;

    //add hearts
    int value=2;
    while( count < hand ){
        struct card temp = {"Hearts", value, false};
        cards[location] = temp;
        value++;
        count++;
    }

    count = 0;

    //add diamonts
    value = 2;
    while( count < hand ){
        struct card temp = {"Diamonds", value, false};
        cards[count] = temp;
        value++;
        count++;
    }

    //add spades
    count = 0;
    value = 2;
    while( count < hand ){
        struct card temp = {"Spades", value, false};
        cards[count] = temp;
        value++;
        count++;
    }

    //add clubs
    count = 0;
    value = 2;
    while( count < hand ){
        struct card temp = {"Clubs", value, false};
        cards[count] = temp;
        value++;
        count++;
    }

    //print the deck
    for(int i=0; i<52; i++){
        cout << cards[i].type << " " << cards[i].rank << endl;
    }
}

Не могу поверить, что я использовал count в качестве итератора ... местоположение было тем, что я намеревался использовать. И поскольку я начал считать с 2, раздача должна быть 13. Иногда вам просто нужно сделать перерыв и вернуться, чтобы поймать ошибки. Это отлично работает:

void initCards(){

    int count = 0;
    int location = 0;
    const int hand = 13;

    //add hearts
    int value=2;
    while( count < hand ){
        struct card temp = {"Hearts", value, false};
        cards[location] = temp;
        value++;
        location++;
        count++;
    }

    count = 0;

    //add diamonts
    value = 2;
    while( count < hand ){
        struct card temp = {"Diamonds", value, false};
        cards[location] = temp;
        value++;
        location++;
        count++;
    }

    //add spades
    count = 0;
    value = 2;
    while( count < hand ){
        struct card temp = {"Spades", value, false};
        cards[location] = temp;
        value++;
        location++;
        count++;
    }

    //add clubs
    count = 0;
    value = 2;
    while( count < hand ){
        struct card temp = {"Clubs", value, false};
        cards[location] = temp;
        value++;
        location++;
        count++;
    }


    for(int i=0; i<52; i++){
        cout << cards[i].type << " " << cards[i].rank << endl;
    }
}

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

Вы сбрасываете count в ноль каждый раз, когда добавляете новый костюм. Итак, предположим, что cards достаточно велико, чтобы вместить 52 элемента, большинство из них не будут заполнены, потому что вы продолжаете переписывать их в начале.

Если вы опубликуете объявления struct card и cards, мы лучше вам поможем.

1 голос
/ 11 мая 2010

Вот код:

struct Card
{
  virtual const std::string& get_suite_name(void) const = 0;
  unsigned int value;
};

struct Spade_Card
: public Card
{
    const std::string& get_suite_name(void) const
    {
        static const std::string name = "Spades";
        return name;
    }
};

struct Heart_Card
: public Card
{
    const std::string& get_suite_name(void) const
    {
        static const std::string name = "Hearts";
        return name;
    }
};

struct Clubs_Card
: public Card
{
    const std::string& get_suite_name(void) const
    {
        static const std::string name = "Clubs";
        return name;
    }
};

#define CARDS_IN_SUITE 13
#define NUM_SUITES 4
#define CARDS_IN_DECK ((CARDS_IN_SUITE) * (NUM_SUITES))

int main(void)
{
    std::vector<Card *> deck;
    // Create the hearts suite & add to the deck.
    unsigned int i = 0;
    for (i = 0; i < CARDS_IN_SUITE; ++i)
    {
        Card * p_card = new Spade_Card;
        if (!p_card)
        {
            cerr << "Error allocating memory for a card." << endl;
            return EXIT_FAILURE;
        }
        p_card->value = i + 1;
        deck.push_back(p_card);
    }

    // Repeat for other suites.

    for (i = 0; i < CARDS_IN_DECK; ++i)
    {
         delete deck[i];  // Good karma to deallocate memory.
    }
    return EXIT_SUCCESS;
}

Название сюиты не нужно повторять для каждой карты. Карта делит имя набора с 12 другими картами. Карта имеет название набора .

Возможно, это слишком далеко заходит ОО. ; -)

0 голосов
/ 11 мая 2010

Массив карт всегда перезаписывается последним типом карты. Вы не должны сбрасывать счетчик до 0, вместо этого вы должны проверить условие while, если оно меньше его значения + 12.

int temp = count + 12;
while(count < temp)
{
}

Кроме того, я бы рекомендовал вам держать ваши карты в массиве указателей. Это заставит вас сохранить много операций копирования, так как в этом случае каждый раз, когда вы добавляете карту в индекс массива, вы копируете весь объект структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...