ポーカーの役判定

麻雀の役判定に比べればちょろいもんだぜ。

ジョーカーの取扱について

パックの中に何枚入っていても構わないアルゴリズムを作る。もちろん、0でも普通に動く。ジョーカーは入っても1枚だろうが、世の中には阿呆なルールでプレイする人がいないとも限らない。ジョーカー入り5パックでプレイとかさ。

ステップその1:分類

手のカードをルールに従ってカウントする。
a.数で分類する。Aは何枚、2は何枚……Kは何枚、JOKERは何枚か。
b.スートで分類する。スペードは何枚……ハートは何枚、スート無(ジョーカー)は何枚か。
a表には頻度表を作っておく。

ステップその2:ストレート系判定。

「その手は、nで始まるストレートか?」と言う問いを、最大13回繰り返す。nは10から始まり、13の次は1で、9で終わる。成立すれば「ストレートフラグ」を立てる。さらに、n=10の時に成立すれば、「ロイヤルフラグ」を立てる。
「その手は、nで始まるストレートか?」は五つの問いに分解される。ただし、事前にジョーカーの枚数をコピーした「仮ジョーカー残り枚数」を作っておき、また「ストレート可能性フラグ」を立てておく。
「(n+m-1)mod13+1について調べる。2以上であれば、ストレートではない。1であればストレート可能性フラグを維持。0であれば、仮ジョーカー残り枚数を調べる。0であればストレートではない。そうでなければ、仮ジョーカー残り枚数を1減少させて、ストレート可能性フラグを維持」(0〜m〜4)
問を5回繰り返した時に、ストレート可能性フラグが立ったままならば、ストレートである。その場合、ストレートフラグを立てる。

ステップその3:フラッシュ系判定。

ジョーカーを除くb表を調べ、最大値を割りだす。その最大値+ジョーカー枚数が5であれば、フラッシュである。フラッシュフラグを立てる。

ステップその4:ペア系判定

まず、ストレートフラグを調べる。ストレートフラグが立っていれば、それはペア系ではないのでここでペア系判定を終わる。
ストレートフラグが立っていなければ、以下、順次ファイブカードから調べていく。

ファイブカードか否か。

ジョーカーを除くa頻度表を調べ、最大値を割りだす。その最大値+ジョーカー枚数が5であれば、ファイブカードである。ファイブカードフラグを立てて、ペア系判定を終わる。

フォーカードか否か。

ジョーカーを除くa頻度表を調べ、最大値を割りだす。その最大値+ジョーカー枚数が4であれば、フォーカードである。フォーカードフラグを立てて、ペア系判定を終わる。

フルハウスか否か。その1

ジョーカーを除くa頻度表を調べ、最大値と最小値を割りだす。それぞれが3と2であれば、フルハウスである。フルハウスフラグを立てて、ペア系判定を終わる。

フルハウスか否か。その2

ジョーカーを除くa頻度表を調べ、最大値と最小値を割りだす。それがどちらも2であり、なおかつジョーカー枚数が1以上であれば、フルハウスである。フルハウスフラグを立てて、ペア系判定を終わる。

スリーカードか否か。

ジョーカーを除くa頻度表を調べ、最大値を割りだす。その最大値+ジョーカー枚数が3であれば、スリーカードである。スリーカードフラグを立てて、ペア系判定を終わる。

ツーペアか否か。

ジョーカー枚数が0でなければ、ツーペアは発生しない。
ジョーカーを除くa頻度表を調べ、2が2回、1が1回出ていれば、ツーペアである。

ワンペアか否か。

ジョーカーを除くa頻度表を調べ、最大値を割りだす。その最大値+ジョーカー枚数が2であれば、ワンペアである。ワンペアフラグを立てて、ペア系判定を終わる。

ステップその5:最終判定

ストレートフラグ(ロイヤルフラグ)、フラッシュフラグ、ペア系フラグのいずれか、これらの中でどれも立っていなければ、ブタである。
通常、フラッシュ系とペア系の役は両立しないが、最初に行ったようにパックを複数混ぜて使うような場合、フラッシュ系とペア系が両立することはある。
※なお、気が向いたらこの文章全体を何度も書き直します。