0

私はC++に非常に慣れていないので、まだ基本的な概念に頭を悩ませていませんが、教授はカードのデッキをシャッフルして表示するアルゴリズムを作成することを望んでおり、デッキは2D配列として表す必要があります。

しかし、私はトランプのデッキをシミュレートするのに苦労しています!

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<char> deck;
    char suit[] = {'h','d','c','s'};
    char card[] = {'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
    for (int j=0; j<13; j++) {
        for (int i=0; i<4; i++) {
            deck.push_back(card[j] suit[i]);
        }       
    }

    return 0;
}

クラス付きのカードプログラムをたくさん見ましたが、今学期にそれらを学ぶかどうかさえわかりません。

4

4 に答える 4

2

単純な構造体を使用すると、次のようにコードを編集できます。

#include <iostream>
#include <vector>

using namespace std;

struct Card {
  char suit, number;
  Card(char aSuit, char aNumber) : suit(aSuit), number(aNumber) { }
};

int main() {
    vector<Card> deck;
    char suit[] = {'h','d','c','s'};
    char num[] = {'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
    for (int j=0; j<13; j++) {   
        for (int i=0; i<4; i++) {
            deck.push_back(Card(suit[i], num[j]);
        }
    }

    // now, deck[0] to deck[51] hold all the cards
    // first card's suit is deck[0].suit, number is deck[0].number

    return 0;
}
于 2012-11-05T20:04:07.613 に答える
0

なぜ複雑にするのですか?

カードのパックには 52 の要素が含まれています。各要素は 2 文字で表すことができます。あなたの投稿で述べたように、スーツと(より良い言葉が必要なため)番号。その配列を構築します。ベクトルなどの費用は必要ありません。配列のサイズは固定です。52 アイテム、各アイテム 2 文字。

次に、ループを作成します - そのルックを何度でも実行します。

ループのたびに、0 ~ 51 の間で 2 つの項目が選択されます (C++ の世界では、物事はゼロから始まることを思い出してください)。これら 2 つの数値はランダムです ( randを参照)。それらを交換します(両方の文字 - またはできれば a を使用しますstruct)。

于 2012-11-05T20:03:16.907 に答える
0

Jon Bentley のProgramming Pearlsを読んでください。最初の章には、ランダム順列を生成するアルゴリズムがあります。アルゴリズムは、各順列を等しい尤度で生成します。さらに、それを読み終えるまでに、その理由を理解できます。

彼のアルゴリズムは、順列に単一のインデックスを使用します。あなたの場合、N=52 を使用し、4 で割った後の (整数) 商と余りによって 2 つのインデックスを生成します。商はカード インデックスを与えます。残りはスーツになります。

于 2012-11-05T20:25:18.180 に答える
0

コメントで提案されているように、構造体を使用してカードを表す必要があります。たとえば、この記事を参照してください

シャッフル アルゴリズムのヒントを次に示します。n-1 枚のカードのデッキをシャッフルできる場合、n 枚のカードのデッキをシャッフルできますか?

于 2012-11-05T20:01:46.597 に答える