0

簡単なカードクラスを作成したプログラムがあります。トランプのデッキを作成して配置するにはどうすればよいですか?

4

3 に答える 3

3

クラスがある場合は、オブジェクトを含むデータ構造 (または配列など) を含むcardクラスを作成するだけです。次に、などの関数、または適切と思われるものを実装します。deckstd::vectorcarddealshuffle

デッキにデータを入力するには、関数を使用できますadd_card。次に、これを使用してすべてのスーツと値をループし、それぞれの異なるスーツ/値タイプのカードを作成してデッキに追加できます。代わりに (または追加で)deckコンストラクターでこれを行うこともできますが、関数を使用すると、デッキで個々のカードやカジノ ブラックジャックなどの複数のデッキ ゲームなど、add_cardさまざまな種類のデッキをモデル化できます。hands

ランダム アクセス反復子をサポートする標準 C++ ライブラリのコンテナーを使用する場合、std::random_shuffle関数を使用して、deck

編集:コメントで提起されたポイントのいくつかを組み込むために更新されました

于 2012-10-25T07:33:52.643 に答える
0

最も簡単な方法は、0 から 51 までの各数字が一意のカードを生成するように int からカードに変換することです。それらがすべて一意である限り、方法は問題ではありません。

次に、ループ内の各番号から、おそらくベクトルにカードのデッキを作成し、std::random_shuffle を実行してデッキをシャッフルすることができます。

カードのデッキを、どのゲームがプレイされるかについて「汎用」のままにしたい場合は、機能をカードのメンバー関数にするのではなく、「無料」の機能にします。たとえば、スペードのエースはブリッジでスペードの 7 よりもランクが高い場合がありますが、これはブリッジ (およびホイスト関連のゲーム) の特徴であり、一般的なカードの特徴ではありません。同様に、カードやデッキには「切り札」という概念がありません。

ジョーカー用の特別なカード オプションが必要になる場合があります。もちろん、ジョーカーを使用しないゲームでは、これらをデッキに入れることはできません。

于 2012-10-25T11:01:31.277 に答える
0

これは、mathematician1975 の回答を例で拡張することです。

#include <iostream>
#include <string>
#include <map>
#include <array> //needs c++11 support

enum CARDSUIT { Spades, Hearts, Diamonds, Clubs };
typedef std::pair< int, int > Card;
template< class T, size_t N> struct DECK : public std::array< T, N> 
{
    void shuffle()
    {
        //see here for example:
        // http://www.cplusplus.com/reference/algorithm/random_shuffle/
    }
};
typedef DECK<Card, 52> StandardDeck;

int main()
{
    int i=0,j=0;
    StandardDeck deck;

    for (i=Spades; i<=Clubs; i++)
        for (j=0; j<13; j++)
                deck[j + (i*13)] = Card(i,j);

    for (i=0; i<(int)deck.size(); i++) 
        std::cout << deck[i].first << " " << deck[i].second << "\n";

    return 0;
}
于 2012-10-25T10:47:00.573 に答える