初始化QImages的QVector

时间:2016-05-15 23:33:31

标签: qt initialization qimage qvector

我对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...
}

这似乎很痛苦,特别是如果我考虑稍后添加不同风格的扑克牌,或者如果我给用户提供在运行时更改卡片样式的选项。什么是有效的设计呢?

1 个答案:

答案 0 :(得分:1)

  

我想知道是否可以在声明期间初始化容器

是的,因为 C ++ 11

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

关于你的问题,其中一个方法可以是:

  1. 在资源中创建所有类型的图片样式,称为模板,例如:&#34; 名称 n .png &#34;,其中 n - 从1到54的数字(带有Jokers的卡片的cnt);
  2. 创建一些QList<QImage>(我认为它会比QVector更好);
  3. 创建一些QMap以便轻松搜索正确的模板;
  4. 为模板地图创建一些枚举类;
  5. 编写一个按所选枚举更改卡片图像的功能。
  6. 然而,这是非常轻的编码。我认为有更多有用的方法,还有很多其他美容方式来做这个游戏和逻辑。但是作为你的问题的一部分,这里有一些代码(可能不是很正确,导致写原样):

    // 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));
    }