Инициализация QVector из QImages

Я довольно новичок в Qt. Это первый фреймворк, с которым я работал. Я пишу игру в блэкджек, используя Qt. Мне кажется, что я должен хранить изображения каждой карты в классе-контейнере, таком как QVector. Тип контейнера будет QImage. Так что у меня было бы такое объявление, как QVector<QImage> cards; Возможно, это не лучший способ решения этой проблемы, поэтому любые альтернативные предложения, конечно, приветствуются. Однако независимо от этого я хотел бы знать, можно ли инициализировать контейнер во время объявления. Я не смог решить эту проблему, поэтому мое решение следующее:

// Deck.h
class Deck
{
public:

    Deck();
    void shuffle();    // Creates new deck and shuffles it.
    QImage &popCard(); // Removes first card off deck.

private:

    void emptyDeck(); // Empty the deck so new cards can be added

    QVector<QImage> cards;
    QQueue<QImage> deck;
};

// Deck.cpp
Deck::Deck()
{
    cards.push_back(QImage(":/PlayingCards/Clubs 1.png"));
    cards.push_back(QImage(":/PlayingCards/Clubs 2.png"));
    cards.push_back(QImage(":/PlayingCards/Clubs 3.png"));
    cards.push_back(QImage(":/PlayingCards/Clubs 4.png"));
    // continue process for entire deck of cards...
}

Это кажется болезненно утомительным, особенно если я подумаю о добавлении другого стиля игральных карт позже или если я даю пользователю возможность изменить стиль карт во время выполнения. Что было бы эффективным дизайном для этого?


person Ritchie Shatter    schedule 15.05.2016    source источник
comment
если есть возможность инициализировать контейнер при объявлении - в c++ нет. Это кажется мучительно утомительным — да, но вы получите опыт и следующий проект (а может быть, и этот) сделаете лучше. per aspera ad astra. Удачи!   -  person Alexander Chernin    schedule 16.05.2016


Ответы (1)


Я хотел бы знать, можно ли инициализировать контейнер во время объявления

Да, начиная с C++11:

QList<int> list{1, 2, 3, 4, 5};

Что касается вашего вопроса, одним из способов может быть:

  1. Создавайте в ресурсах все типы ваших изображений в стиле, называющемся шаблоном, например: "Имя n.png", где n - число от 1 до 54 (цент карт с джокерами);
  2. Создайте несколько QList<QImage> (думаю, это будет лучше, чем QVector);
  3. Создайте QMap для простого поиска правильного шаблона;
  4. Создайте некоторый класс enum для карты шаблона;
  5. Напишите функцию, которая меняет изображения ваших карточек по выбранному перечислению.

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

// Somewhere in global
enum class CardsTemplate: {
    Clubs,
    SomeTemp1,
    SomeTemp2,
    ...
    SomeTempN
}

Файл .H:

private:    
   QList<QImage> _images;
   QMap<CardsTemplate, QString> _imagesMap {
       {CardsTemplate::Clubs, QString("Clubs")},
       {CardsTemplate::SomeTemp1, QString("SomeTemp1")},
       {CardsTemplate::SomeTemp2, QString("SomeTemp2")},
       ...
       {CardsTemplate::SomeTempN, QString("SomeTempN")}
   }

public:
    Deck(CardsTemplate temp);
    void setNewTemplate(CardsTemplate temp);

Файл .CPP:

Deck::Deck(CardsTemplate temp){
    for(int i = 1; i <= 54; i++)
        _images << QImage(QString(":/Playing cards/%1 %2.png")
                   .arg(_imagesMap.value(temp)).arg(i));
}

void Deck::setNewTemplate(CardsTemplate temp) {
    for(int i = 1; i <= _images.size(); i++)
        _images[i] = QImage(QString(":/Playing cards/%1 %2.png")
                     .arg(_imagesMap.value(temp)).arg(i));
}
person someoneinthebox    schedule 17.05.2016