きっかけ
@paraizo2424
Rubyでちょっとずつポーカーを実装する その1
こちらを見たときにいいチャレンジだな~と思いコメントを入れたのですが
はたして自分はアドバイスできるほどの技術力があるのだろうか?
まだまだアドバイスをもらう側ではないのか?
と考えたときに、自分ならどう設計・実装するのか?を改めて整理しながら
自分との見つめ合い ということで作ってみようと思いました
仕事でrubyを使っていますが、入社当初はruby何それ?って名前くらいしか知らないレベルだったため
そういう意味も込めて振り返れたらなと思います
まずポーカーのルールを整理
参考: https://playingcards.jp/game_rules/drawpoker_rules.html
使用カード
- 全スートの1~13 + ジョーカーあり?
- 今回はjoker無しで行きます
- もしかしたら追加するかも?
プレイヤー
-
2..7
人
ルール
- 各プレイヤーに山札から5枚ずつ配る
- 各プレイヤーは5枚を周りに見せない
- 各プレイヤー順番に、1回のみ好きな枚数カードの交換が可能
- 各プレイヤー手札を見せ、手札の組み合わせ(役)に応じて勝敗が決まる
- 本来はここにベット(掛け金)があり、これを得るための勝負となる
- 今回はひとまずベットも無しとする
役
- 下記の上から順番に強い役となる
- ロイヤルストレートフラッシュ
- 同じマークの10、J、Q、K、Aをそろえる
- ストレートフラッシュ
- 同じマークで、5枚の数字が連続する
- フォーカード
- 同じ数字のカードが4枚ある
- フルハウス
- スリーカードとワンペアが1組ずつできる
- フラッシュ
- 同じマークのカードが5枚ある
- ストレート
- マークに関係なく5枚の数字が連続する
- (10-J-Q-K-AはストレートとなるがQ-K-A-2-3はストレートにならない
- すなわちKとAは連続するがK-A-2含むものはストレートにはならない)
- スリーカード
- 同じ数字のカードが3枚ある
- ツーペア
- 同じ数字のカードが2組ある
- ワンペア
- 同じ数字のカードが1組だけある
- ロイヤルストレートフラッシュ
- 2人のプレイヤーが同じ役を作った場合は、役を構成しているカードの強い方が勝ちとなる
- カードの強い順位は、A・K・Q・J・10~2
- スートの強い順位は、スペード・ハート・ダイヤ・クローバー
- 役を構成しているカードも同じ場合は、役に使われていないカードが強い方が勝ちとなる
疑問点
- 捨てたカードは公開する?
- 公開しないらしい
- フルハウス同士の比較は?
- フルハウス同士の場合は、3 枚 1 組のカードのランク
- ストレート同士の比較は?
- 一番強いカードで比較
- ストレートの小技
-
注意: エースに限りランクが一番上または一番下のカードとして使用できます。 最も強いストレートは A-K-Q-J-T (エースハイ)、最も弱いストレートは 5-4-3-2-A (ファイブハイ) です。
-
参考
- https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11159415671
- https://www.pokerstars.com/ja/poker/games/rules/hand-rankings/?no_redirect=1
今回の実装範囲の決定
- ベットが無いため連続した勝負とはせず1回の勝負の実行とする
- 画面などの作り込むのは面倒なのとrubyのクラス設計・実装などを目的とするため、コンソールでの実行とする
- 全プレイヤーが交換を行うようにしないと最初の5枚で勝負というのは厳しいと思うため、全プレイヤーを実行者が操作するものとする(勝負の意味w)
実装環境の決定
- ruby2.6.5を使用
- test-unitを使用
- 普段は仕事ではrspecしか使用していないためせっかくなので触ってみる
登場人物の整理
なんと表現するのが適切かわかりませんが、モノと、モノではないもの(= 概念)という意味で分けてみる
モノ
- カード
- プレイヤー
概念
- 山札
- カード全て
- 手札
- 山札から配られた各プレイヤーの手札(5枚)
- 役
- 手札の中の組み合わせ
- 下記を持つ
- 役の種別
- 役の中での強さ
ソース
これから作っていくため、まだ空で作成したのみです。
ここから。楽しみ。