2016-05-15 99 views
0

我對Qt相當陌生。這是我與之合作的第一個框架。我正在寫一個使用Qt的二十一點遊戲。在我看來,我應該將每張卡的圖像存儲在容器類中,例如QVector。容器類型將是QImage。所以我會有一個聲明,如QVector<QImage> cards;也許這不是解決這個問題的最好方法,所以當然歡迎任何其他建議。但是,無論如何,我想知道在聲明期間是否可以初始化容器。我一直沒能解決這個,所以我的解決方案如下:初始化QImages的QVector

// 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++中,否。 「這似乎很痛苦乏味」 - 是的,但你會得到經驗和下一個項目(或可能是這一個),你會變得更好。 每aspera ad astra。祝你好運! –

回答

1

我想知道是否有可能在聲明中初始化容器

是的,你可以自C++ 11

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

那麼你的問題其中一種方式可以是:

  1. 創建資源所有類型的您的圖像風格像調用模板,例如:「名稱ň png格式」,其中ñ - 從1數到54(與王牌卡CNT);
  2. 創建一個QList<QImage>(我認爲它會比QVector更好);
  3. 創建一些用於搜索正確模板的QMap;
  4. 爲模板圖創建一些枚舉類;
  5. 編寫一個功能,通過選定的枚舉改變你的卡的圖像。

然而,它是非常輕的codding。我認爲有更多有用的方法,並有很多其他更美麗的方式來做這個遊戲和邏輯。但是你的問題的一部分,這裏的一些代碼(可以不是很對,原因寫的是):

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