Poker クラス

Poker クラス

Poker クラスには、以下のメソッドがあります。

  • check
  • flush?
  • straight?

class Poker < Game#ポーカーはトランプゲームのサブクラス
  #定数
  HANDS = [#役の種類
    'No Pair',
    'One Pair',
    'Two Pair',
    'Three of a Kind',
    'Straight',
    'Flush',
    'Full House',
    'Four of a Kind',
    'Straight Flush',
    'Royal Straight Flush'
  ]

  #クラス変数
  #なし

  #クラスメソッド
  #役を確認する
  def self.check(player)
    npair = 0                             #ペアの数
    s     = Array.new(Card::SUITS.size, 0)#印毎の枚数
    n     = Array.new(13,               0)#数字毎の枚数
    flag  = Hash.new                      #確認フラグ

    player.each do |x|
      #番号をカードに換算し、印と数字の枚数を追加する
      s[Card.suit  (x)] += 1
      n[Card.number(x)] += 1
    end

    #フラッシュ系
    flag['flush'] = flush?(player, s)#フラッシュの確認フラグ

    #ストレート系
    0.upto(9) do |i|#ストレートの低位の数字は 1 から 10 まで
      if (straight?(player, i, n))
        if (flag['flush'])
          if (i == 9)
            return(9)#ロイヤル・ストレート・フラッシュ
          else
            return(8)#ストレート・フラッシュ
          end
        else
          return(4)#ストレート
        end
        break
      end
    end
    return(5) if (flag['flush'])#フラッシュ

    #ペア系
    flag['three'] = false#スリーカードの確認フラグ
    0.upto(12) do |i|
      if    (n[i] == 4)
        return(7)#フォーカード
      elsif (n[i] == 3)
        flag['three'] = true
      elsif (n[i] == 2)
        npair += 1
      end
    end
    if (flag['three'])
      if (npair == 1)
        return(6)#フルハウス
      else
        return(3)#スリーカード
      end
    else
      if    (npair == 2)
        return(2)#ツーペア
      elsif (npair == 1)
        return(1)#ワンペア
      end
    end
    return(0)#ノーペア
  end

  def self.flush?(player, s)
    0.upto(s.size - 1) do |i|
      return(true) if (s[i] == player.size)
    end
    return(false)
  end

  def self.straight?(player, i, n)
    0.upto(player.size - 1) do |j|
      return(false) if (n[(i + j) % 13] != 1)#13 は 1 と連なる
    end
    return(true)
  end

  #インスタンスメソッド
  #なし

  #アクセスメソッド(アクセサ)
  #なし
end