2016-05-15 34 views
0

Qtの初心者です。これは私が協力した最初のフレームワークです。私はQtを使ってブラックジャックゲームを書いています。私は、各カードの画像をQVectorのようなコンテナクラスに保存しなければならないと思います。コンテナのタイプはQImageです。だから、私はQVector<QImage> cards;のような宣言をするでしょう。これはおそらく、この問題に近づく最善の方法ではないので、代替提案はもちろん歓迎されます。しかし、関係なく、宣言中にコンテナを初期化できるかどうかを知りたいと思います。以下、私はこのように私の解決策を解決することができていないです。QImageの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++、no。 "これは辛いほど退屈なようです" - そうですが、あなたはその経験と次のプロジェクト(またはこれと同じかもしれません)を得るでしょう。 aspera ad astraごとに がんばろう! –

答えて

1
宣言時にコンテナを初期化することが可能である場合、私は知りたいのですが

はい、できC++ 11以来:あなたの質問についてよく

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

1つの方法は:

  1. リソースで作成することができます"名前n .png"、n - 1から54までの数字(Jokersのあるカードの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)); 
} 
関連する問題