0

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

这似乎非常乏味,特别是如果我考虑稍后添加不同风格的扑克牌,或者如果我让用户选择在运行时更改卡片的风格。对此有什么有效的设计?

4

1 回答 1

1

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

是的,你可以从C++11开始:

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

那么关于你的问题,一种方法可以是:

  1. 在资源中创建所有类型的图像样式调用模板,例如:“ Name n .png ”,其中n - 数字从 1 到 54(带有 Jokers 的卡片的数量);
  2. 创建一些QList<QImage>(我认为它会比 QVector 更好);
  3. 创建一些 QMap 以轻松搜索正确的模板;
  4. 为模板映射创建一些枚举类;
  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));
}
于 2016-05-17T04:31:38.203 回答