2016-05-15 8 views
0

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

// 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... 
} 

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

+0

«если возможно инициализировать контейнер во время декларации» - в C++, нет. «Это кажется мучительно утомительным» - да, но вы получите опыт и следующий проект (или, может быть, этот), вы сделаете лучше. per aspera ad astra. Удачи! –

ответ

1

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

Да, вы можете так C++ 11:

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

Ну о вашем вопросе одним из способов может быть:

  1. Создание в ресурсах все типы вашего стиля изображений, называемые шаблоном, например: «Название n .png», где n - номер от 1 до 54 (cnt карт с джокерами);
  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)); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^