ポーカー役判定
(other/poker_hands.hpp)
ポーカー役判定
ポーカーの役を判定する。
struct card
各カードを扱う構造体である。
char suit
はカードのスートを表す文字である。各スートにどの文字を割り当てるかは自由に決められる。
int rank
はカードのランクを表す数である。2~10 のカードの rank
はその数と同じである。J (ジャック)、Q (クイーン)、K (キング)、A (エース) の rank
はそれぞれ 11, 12, 13, 14
である。
カードを std::istream
から operator>>
を用いて入力できる。入力は以下の形式で行われる。
- 2 文字の文字列を入力する。
- 文字列の 1 文字目はカードのスートを表す。
- 文字列の 2 文字目はカードのランクを表す。
- 2~9 の文字はそれぞれランクが 2~9 のカードとして扱われる。
-
T, J, Q, K, A
はそれぞれ 10、J (ジャック)、Q (クイーン)、K (キング)、A (エース) のカードとして扱われる。
enum poker_hand
ポーカーの役の種類を表す。
poker_hand
の要素と役の対応は以下のようである。
poker_hand の要素 |
役 |
HIGH_CARD |
ハイカード |
ONE_PAIR |
ワンペア |
TWO_PAIR |
ツーペア |
THREE_OF_A_KIND |
スリー・オブ・ア・カインド |
STRAIGHT |
ストレート |
FLUSH |
フラッシュ |
FULL_HOUSE |
フルハウス |
FOUR_OF_A_KIND |
フォー・オブ・ア・カインド |
STRAIGHT_FLUSH |
ストレートフラッシュ |
ROYAL_STRAIGHT_FLUSH |
ロイヤルストレートフラッシュ |
poker_hand
の各要素には、上の表で示した順に 0~9 の整数が割り当てられている。
vector<int> hand(array<card, 5> C)
手札を表す 5 枚のカードの配列 C
が与えられたとき、そのカードの役と役のうちの相対的な強さを表す配列を返す。ただし、スートもランクも同じカードが 2 枚含まれることはないことを仮定する。
返り値の最初の整数は poker_hand
の要素であり、役の種類を表す。残りの要素は、その役のうちの相対的な強さを表す。
それぞれの役に対し、返り値は以下のようになる。
ロイヤルストレートフラッシュ
{ROYAL_STRAIGHT_FLUSH}
を返す。
ストレートフラッシュ
手札のうち最も大きい rank
を a としたとき、{STRAIGHT_FLUSH, a}
を返す。ただし、手札のランクが A,2,3,4,5 のとき、{STRAIGHT_FLUSH, 5}
を返す。
フォー・オブ・ア・カインド
4 枚ある rank
を a、残りのカードの rank
を b としたとき、{FOUR_OF_A_KIND, a, b}
を返す。
フルハウス
3 枚ある rank
を a、残りの 2 枚のカードの rank
を b としたとき、{FULL_HOUSE, a, b}
を返す。
フラッシュ
5 枚のカードの rank
を大きい順に a, b, c, d, e としたとき、{FLUSH, a, b, c, d, e}
を返す。
ストレート
手札のうち最も大きい rank
を a としたとき、{STRAIGHT, a}
を返す。ただし、手札のランクが A,2,3,4,5 のとき、{STRAIGHT, 5}
を返す。
スリー・オブ・ア・カインド
3 枚ある rank
を a、残りの 2 枚のカードの rank
を大きい順に b, c としたとき、{THREE_OF_A_KIND, a, b, c}
を返す。
ツーペア
2 枚ある rank
を大きい順に a, b、残りのカードの rank
を c としたとき、{TWO_PAIR, a, b, c}
を返す。
ワンペア
2 枚ある rank
を a、残りの 3 枚のカードの rank
を大きい順に b, c, d としたとき、{ONE_PAIR, a, b, c, d}
を返す。
ハイカード
5 枚のカードの rank
を大きい順に a, b, c, d, e としたとき、{HIGH_CARD, a, b, c, d, e}
を返す。
hand
の返り値は、2 つの手札に対する hand
の返り値を辞書順に比較した結果が役の強さの比較と一致するようになっている。
Verified with
Code
Back to top page