カードシャッフルを書こうとしていますが、カードをシャッフルしたい方法を知っています。しかし、私はそれを書くための最良のオブジェクト指向の方法を失っています。
かなり一般的な方法は次のとおりです。
- それぞれに 0 から 2,147,483,647 の間のランダムな数値を割り当てます
- 重複するキー値がある場合 (ほとんどありません)、デッキを捨てて、最初からやり直してください。
- カードをセットで収納
- カードのキー値ごとにセットを並べ替える
私の問題は、これを記述する最善の OOP の方法にあります。Card
最初に、スーツの値、数値、およびランダムなキーの値を含む というオブジェクトを思いつきました。Deck
次に、 a を拡張したという名前のクラスをHashSet
用意し、各カードを に格納してHashSet
から、キー値で並べ替えます。私が苦労したのは、Card
そもそも 52 個のオブジェクトを「生成」する最も効率的な方法と、セットの順序付け方法です。インターフェイス「SortedSet」を実装しますか?実装する場合、コンパレータをどのように記述しますか?
OOPの設計慣行に基づいた非常に幅広い質問ですが、これが本当にスムーズでオブジェクトベースのソリューションであることを望みます。
乾杯、
ティム。
編集:
みんな助けてくれてありがとう。私の解決策は次のとおりです。
- 4 つのスーツと 13 の可能な値を含む 2 つの Enum (CardValues、CardSuits)
- コンストラクタ引数として CardValue と CardSuit を取る Card クラス。
- TreeMap を拡張する Deck クラス
新しいデッキが作成されシャッフルされると、CardSuit Enum と作成されたカードをループし、そのループ内で CardValue Enum を調べます。これでカードが作成され、次にランダムなキーを生成して TreeMap に配置します。
キーが繰り返される可能性は常にわずかにあるため、最終的なデッキ サイズが 52 でない場合は、新しい InvalidDeckException をスローします。
提案をありがとう、私はこの解決策にとても満足しています.