0

C#でポーカーゲームを開発しています。現時点では、 を使用してプレイヤーの手のスコアを取得しようとしていRegExます。文字列 (カードのスーツと数字で構成される) を検索し、一致するスーツまたは数字を探しますRegEx。私が 2 マッチを獲得した場合、プレイヤーはペアを持ち、3 マッチで彼は 3 つの種類を持っています。

現時点では、カード クラス (番号とスーツ)、デッキ クラス (52 枚のカードを含む)、およびシャッフルされたデッキから 5 枚のカードを取得するハンド クラスの 3 つのクラスがあります。

デッキ クラスにはshuffleDeck(); Hand クラスには、スコアを計算する関数があります (RegEx を使用しているこれらの関数にあります)。

RegEx手が持っている5つのスーツと数字を追加して、使用する文字列を生成します.

これは良いアイデアですか、それとも別の方法で行う必要がありますか?

ご協力ありがとうございました

PS。私は、新しく学んだツールをすべてに使用したいと考えている経験の浅いプログラマーの 1 人です。

4

5 に答える 5

13

正規表現がこれに対処する適切な方法だとは思いません。おそらく、ひもよりも洗練された手の表現を使用する必要があります。

于 2008-10-28T17:29:26.757 に答える
7

あなたはあまり詳細を提供していませんが、私が読んだことから、あなたはOOPをあまり推進していないと思います...

Rank クラスと Suit クラスのインスタンスを持つ Card クラスを作成します。次に、シャッフル/ディーリングを処理するデッキクラスを作成します...

次に、n Card オブジェクトのポーカー ハンドを含む Hand クラスを作成します...

このようにして、各ハンド オブジェクトを評価するルールを構築できるため、将来的により柔軟で拡張性が高くなります...たとえば、別のカード ゲームを作成したい場合や、ポーカーの別のバリエーションのサポートを追加したい場合など...

これらすべてを行うために正規表現を使用するのは、かなりお粗末な選択のようです。

于 2008-10-28T17:23:51.060 に答える
2

素数はそのための良い解決策だと思います。検討 :

//            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]

固有のカードは、色の素数 * ランクの素数で識別されます。(例: As of Diamonds : prime = 7 * 61)

したがって、ユニークなデッキまたはコンビナゾン全体は、プライム * プライム * プライム * プライム * プライムで識別されます。

ダイヤモンドのフラッシュがある場合、5 枚のカード デッキの素数 ID は、ダイヤモンドのフラッシュ ID (ダイヤモンドの色の素数が 7 であるため、7 ^ 5) で割り切れる (mod = 0) 必要があります。

于 2010-12-16T09:52:55.293 に答える
2

正規表現は悪い選択のように思われるという他の人たちに同意します。3 種類、4 種類のペアで機能する場合があります。しかし、フラッシュ、ストレート、2 ペアなどのハンドを見始めると、ややこしくなる (または不可能になる) かもしれません。

最善の解決策は、ここに示されているように、カードを最高の手から最低の手まで評価することであり、一致を見つけるとすぐにそれがあなたの手になると思います. これにより、4 種類を 2 ペアと間違えることがなくなります。または、ストレートのみのストレート フラッシュ、またはフラッシュのみ。mmattax を使用して、カード用のオブジェクトとハンド用のオブジェクトを作成すると、各ハンドのカードを評価して、各ハンドに必要な基準を満たしているかどうかを確認できます。

于 2008-10-28T17:40:46.890 に答える
1

手を表すために文字列を使用することは、不適切な決定のように思えます。私のお勧めは、Enum を使用してスーツを表し、別の Enum を使用してカードの数値を表すことです。

于 2008-10-28T17:50:45.890 に答える