簡単なカードクラスを作成したプログラムがあります。トランプのデッキを作成して配置するにはどうすればよいですか?
3 に答える
クラスがある場合は、オブジェクトを含むデータ構造 (または配列など) を含むcard
クラスを作成するだけです。次に、などの関数、または適切と思われるものを実装します。deck
std::vector
card
deal
shuffle
デッキにデータを入力するには、関数を使用できますadd_card
。次に、これを使用してすべてのスーツと値をループし、それぞれの異なるスーツ/値タイプのカードを作成してデッキに追加できます。代わりに (または追加で)deck
コンストラクターでこれを行うこともできますが、関数を使用すると、デッキで個々のカードやカジノ ブラックジャックなどの複数のデッキ ゲームなど、add_card
さまざまな種類のデッキをモデル化できます。hands
ランダム アクセス反復子をサポートする標準 C++ ライブラリのコンテナーを使用する場合、std::random_shuffle
関数を使用して、deck
編集:コメントで提起されたポイントのいくつかを組み込むために更新されました
最も簡単な方法は、0 から 51 までの各数字が一意のカードを生成するように int からカードに変換することです。それらがすべて一意である限り、方法は問題ではありません。
次に、ループ内の各番号から、おそらくベクトルにカードのデッキを作成し、std::random_shuffle を実行してデッキをシャッフルすることができます。
カードのデッキを、どのゲームがプレイされるかについて「汎用」のままにしたい場合は、機能をカードのメンバー関数にするのではなく、「無料」の機能にします。たとえば、スペードのエースはブリッジでスペードの 7 よりもランクが高い場合がありますが、これはブリッジ (およびホイスト関連のゲーム) の特徴であり、一般的なカードの特徴ではありません。同様に、カードやデッキには「切り札」という概念がありません。
ジョーカー用の特別なカード オプションが必要になる場合があります。もちろん、ジョーカーを使用しないゲームでは、これらをデッキに入れることはできません。
これは、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;
}