Help us understand the problem. What is going on with this article?

rubyでドローポーカーを作ってみる~準備編~

きっかけ

@paraizo2424
Rubyでちょっとずつポーカーを実装する その1

こちらを見たときにいいチャレンジだな~と思いコメントを入れたのですが
はたして自分はアドバイスできるほどの技術力があるのだろうか?
まだまだアドバイスをもらう側ではないのか?

と考えたときに、自分ならどう設計・実装するのか?を改めて整理しながら
自分との見つめ合い ということで作ってみようと思いました

仕事でrubyを使っていますが、入社当初はruby何それ?って名前くらいしか知らないレベルだったため
そういう意味も込めて振り返れたらなと思います

まずポーカーのルールを整理

参考: https://playingcards.jp/game_rules/drawpoker_rules.html

使用カード

  • 全スートの1~13 + ジョーカーあり?
    • 今回はjoker無しで行きます
    • もしかしたら追加するかも?

プレイヤー

  • 2..7

ルール

  1. 各プレイヤーに山札から5枚ずつ配る
    • 各プレイヤーは5枚を周りに見せない
  2. 各プレイヤー順番に、1回のみ好きな枚数カードの交換が可能
  3. 各プレイヤー手札を見せ、手札の組み合わせ(役)に応じて勝敗が決まる
    • 本来はここにベット(掛け金)があり、これを得るための勝負となる
    • 今回はひとまずベットも無しとする

  • 下記の上から順番に強い役となる
    • ロイヤルストレートフラッシュ
      • 同じマークの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枚)
    • 手札の中の組み合わせ
    • 下記を持つ
    • 役の種別
    • 役の中での強さ

ソース

https://github.com/rytkmt/ruby_poker

これから作っていくため、まだ空で作成したのみです。
ここから。楽しみ。

続き


rubyでドローポーカーを作ってみる~test-unit準備編~

r12tkmt
vimとruby関連が多いかと思います :)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away