我对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...
}
这似乎很痛苦,特别是如果我考虑稍后添加不同风格的扑克牌,或者如果我给用户提供在运行时更改卡片样式的选项。什么是有效的设计呢?
答案 0 :(得分:1)
我想知道是否可以在声明期间初始化容器
是的,因为 C ++ 11 :
QList<int> list{1, 2, 3, 4, 5};
关于你的问题,其中一个方法可以是:
QList<QImage>
(我认为它会比QVector更好); 然而,这是非常轻的编码。我认为有更多有用的方法,还有很多其他美容方式来做这个游戏和逻辑。但是作为你的问题的一部分,这里有一些代码(可能不是很正确,导致写原样):
// 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));
}