質問
C#でポーカーゲームを開発しています。現時点では、 RegEx
を使用してプレーヤーのハンドスコアを取得しようとしています。文字列(カードのスーツと番号で構成される)を検索し、 RegEx
に一致するスーツまたは番号を探します。私が2試合を取得した場合、プレーヤーはペアを持ち、3試合は彼が3種類を持っています。
現時点では、カードクラス(番号とスーツ)、デッキクラス(52枚のカードを含む)、シャッフルデッキから5枚のカードを取得するハンドクラスの3つのクラスがあります。
Deckクラスには shuffleDeck()
があります。
Handクラスには、スコアを計算する関数があります(これらの関数にはRegExを使用しています)。
手にある5つのスーツと数字を追加して、 RegEx
を使用する文字列を生成します。
これは良いアイデアですか、それとも別の方法で行う必要がありますか?
ご協力ありがとうございます
PS。私はすべてに新しく学んだツールを使用したい未経験のプログラマーの一人です
解決
正規表現がこれに対処する適切な方法だとは思わない。おそらく、文字列よりも洗練された手の表現を使用する必要があります。
他のヒント
あなたは詳細を提供していませんが、私が読んだことから、OOPをあまり遠くまでプッシュしていないと思います...
ランクとスーツのクラスインスタンスを持つカードクラスがあります。そうすると、シャッフル/ディールを処理するデッキクラスができます...
その後、n個のカードオブジェクトのポーカーハンドを含むHandクラスを作成します...
このようにして、各ハンドオブジェクトを評価するルールを構築することができます。したがって、将来的にはより柔軟で拡張性が高くなります。
これをすべて行うために正規表現を使用するのは、かなり貧弱な選択のようです。
Regexは悪い選択のように思えるので、他の人にも同意します。ペア、3種類、4種類のペアで動作する可能性があります。ただし、フラッシュ、ストレート、2ペアなどのハンドを見始めると、ややトリッキー(または不可能)になります。
最善の解決策は、カードをベストハンドからワーストハンドまで評価することだと思います。こちら、一致が見つかったらすぐにそれがあなたの手になります。これにより、4を2ペアと間違えないようにします。または、ストレートまたはフラッシュのみのストレートフラッシュ。 mmattaxを使用して、カードのオブジェクトとハンドのオブジェクトを作成し、各ハンドのカードを評価して、各ハンドに必要な基準を満たしているかどうかを確認します。
素数はそのための良い解決策だと思います。 考慮してください:
// D H S C
colors = [7,5,3,2]
// A Q K J T 9 8 7 6 5 4 3 2
ranks = [61,59,53,43,41,37,31,29,23,19,17,13,11,61]
一意のカードは、色の素数*ランクの素数で識別されます。 (たとえば、ダイヤモンドのように:プライム= 7 * 61)
したがって、全体のユニークなデッキまたは組み合わせは、プライム*プライム*プライム*プライム*プライム*プライムによって識別されます
ダイヤモンドのフラッシュがある場合、5カードデッキのプライムIDは、ダイヤモンドIDのフラッシュによる除算(mod = 0)でなければなりません(ダイヤモンドカラープライムは7であるため、7 ^ 5)
手を表すために文字列を使用することは、悪い判断のように思えます。私の推奨事項は、Enumを使用してスーツを表し、別のEnumを使用してカードの数値を表すことです。