機能するかどうかを判定するためにポーカー手である。
-
22-08-2019 - |
質問
のための学校の宿題与えられたということがわかったカードを持つクラスを列挙型のランクおよびスーツです。私に必要な"の二つのポーカー手に(それぞれの手には ArrayList
5カード)の発表をすることがあります。
の isStraight()
機能は本当に気にかから始めるカウントの後です。例えば、
クイーン、キングエースインターナショナルは、、、
が考えられていまし直進します。には、どうするのがベストなコードにこの機能性?
こちらはランク/スーツの列挙型コードが役立っています。
public enum Rank
{
TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9),
TEN(10), JACK(11), QUEEN(12), KING(13), ACE(14);
private final int points;
private Rank(int points)
{
this.points = points;
}
public int points()
{
return this.points;
}
}
public enum Suit
{
DIAMONDS, CLUBS, HEARTS, SPADES;
}
解決
あなたは、私が今までプレイしたりストレートを聞いたすべてのポーカーゲームのルールによって右包むことができないことを実現していますか?エースは[A、2,3,4,5]又は高い[10、J、Q、K、A〕低くすることができるが、それはラップすることができません。これらの規則によると、(あなたではない)私は前に似た何かを実装しました。基本的には、配列をソートし、それを歩いて、現在のカードが前回より1高くなっていることを確認すること。それがエースである場合には、第1の反復では、あなたが明示的にチェック[A、2,3,4,5]。それがある場合はtrueを返すと、そうでない場合は、通常のストレートのロジックを続行します。これは正しい方向にあなたを設定する必要があります。
他のヒント
素敵なアプローチ解消のためのポーカー手は、一般的に割り当てカードには少価値のビット(ランク-2)*2)ビットセットとビットスーツ+28)セット(2=1, 3=4, 4=16, など。上=0x1000000).追加したすべてのカードと結果'Sum'.計算V1=(和&0x2AAAAAA)>>1,V0=(和&0x1555555、V2=V1&V0.もとの値のカードは、計算V3=OrValue&0xF0000000;
- のためのペアで、V1てシングルビットセットV0して複数のビットセットV2がゼロになります。
- 二対V1持つビットセットV2と同様にゼロになります。
- 間の、V1てシングルビットセットは、V2と同様V1.
- のためのストレートV0は0x1000055も電力の二つの複数の0x155.
- のためのフラッシュ、V2て精密に一つのビットセットです。
- フルハウス、V1持つビットセットV2する非ゼロになります。
- のための四つのいずれかV1ますv0の両方を持つビットセットは、V0て正確には二つのビットセットV1がゼロになります。
- のためのストレートフラッシュを生成条件などに関して、フラッシュは満たさなければならない。
この試験に必要なこのアプローチすべき実行可能な本機をあたたかい場所に長時間常生活を送る上での必要最低限の分岐.
あなたは、可能なカードの数にもかかわらず、trueを返すために派手なアルゴリズムを書くことができますが、あなたがソートされた手でのみ10有効な組み合わせがある実現した場合、あなただけのこれらのためになります。
2-6, 3-7, 4-8, 5-9, 6-T, 7-J, 8-Q, 9-K, T-A, (2-5,A)
あなたのリストにある唯一の5枚のカードがありますので、あなたはそれをソートし、2枚の連続でカード間の差異を決定することができます。それはエースが含まれている場合は、低すぎるカードとしてそれを考慮する必要があります。すべての相違は、(ソート順に応じて、または-1)1であれば、あなたはあなたのストレートを持っています。
私はストレートのみACE.points()の最大で始めることができ、RANKのその定義与えられたことを主張したい - 。4
あなたがあなたの手をソートし、最低ランクは> ACE.points(あるのであれば) - 4あなたはそうあなただけの各カードは、<前のRANK + 1であることを確認するために手を反復、ストレートを持つことができません/ P>
ACEが高いか低い可能性があれば、SHSが答えたものと行きます。
内部ループでは、それは非常に簡単ですが、課題は内部ループせずにそれを行うことであろう...
あなたがあなたの先生を理解したり、教師が誤解(または詐称)場合は、また、それはゲームのルールに依存します。
私はちょうど配列[2..14]を作成し、そのランクに対応する位置にカードを配置するように誘惑されると思います。あなたは重複をヒットした場合、それはまっすぐではありませんし、完了したら、あなたは、行の8つのスペースを持っている必要があります。あなたは、行で8つの未満のスペースを持っている場合、それはまっすぐではありません。
私が思い付くことができます他のすべてのソリューションは、内側のループを必要 - と内側のループはあなたがあなたが立派なプログラマであることを行っていることができればいつでも避けるために必要なものを、ずさんなプログラミングものの一つです。
編集:あなたが先生を誤解してのみラッピング条件は「10、J、Q、K、」(実際のルールのように)である場合も、あなたは追加試験2の場合はすべてのことを必要とし、13及び14が設定され、それはまた、故障(2-AKラップアラウンド)です。
(再読み込み質問の後に14とエースのための1を交換するために再編集)
私は私が名前付き定数を好むが、私は「14」に「ACE」から行くこと。
自明であると仮定します、列挙ずっと使いいけません私は、実際のJavaコードを記述するのが面倒だ(あなたが実際にあなたの宿題を^^行う必要があるの横に)
check if the list has 5 cards
convert card names to a card number list named array
sort the list array
for i=1 to 4
if not (array[i] + 1) % 13 == (array[i+1]) % 13
then it is not a straight
%演算子はモジュロので(15%13)== 2と呼ばれています 私は「オーバーラップ」の挑戦に直面するたびに、私はこの演算子を使用
編集:あなたの質問を再読み込みした後、私の解決策は、箱から出して動作することはできません。あなたの列挙型を並べ替える必要がありますので、TWO == 0
私はカードを表現するためにビットベクトルを使用することをお勧めします。これは、ソートする必要がなくなります。あなたは)エースビットは2が設定されているかどうかをチェックする前に設定されているかどうかをチェックすることにより、特殊なケースの出発状況をすることができます(王として一回1などの他の回)を2回エースを追加したりすることができます。あなたはスピードの問題であれば、大きなルックアップテーブルを構築することができます。このアプローチは、手の残りの部分(フラッシュ、2ペア、完全な家、旅行など)を見つけるために、スケールをクリーニングします。また、与えられたストレートが他よりも高い場合に把握することが容易になります。そして、それは7カード評価にきれいに展開します。
擬似コードでは、それは非常に一般的なケースのために、このようになります(あなたがカードの任意の番号を持つことができます。これは、最初のストレートを返す)
long cardBitMask
for each card in hand
setBit in cardBitMask
hearts = mask(cardBitMask)
diamonds = mask(cardBitMask)
clubs = mask(cardBitMask)
spades = mask(cardBitMask)
// find straight
uniqueCards = hearts|diamonds|clubs|spades
int cardsInaRow = 0
if uniqueCards&AceCardMask:
cardsInaRow = 1
for card = 2...King
if uniqueCards&(1<<card)
cardsInARow++
else
if cardsInARow == 5
break
cardsInARow = 0
if cardsInARow==5:
return true
return false
を2回、リストするためにすべてのランクを追加します。その後、手がまっすぐであるかどうかを確認するために、手がそのリストのサブリストであるかどうかを確認後、ランクによって手をソートします。
あなたは、特定のカードの値にすべてのカードを変換するクラスを書くことができます。
ジョーカー= 11 女王= 12 キング= 13 エース= 0又は14
それは非常に簡単にカードの取り扱いを行い、可能な手を探しています。