Module: PokerEngine::HandLevels

Defined in:
lib/poker_engine/hand_levels.rb

Defined Under Namespace

Classes: BaseLevel

Constant Summary collapse

HighCard =
Levels ======================================
Class.new(BaseLevel) do
  def self.owns?(_cards)
    true
  end
end
OnePair =
Class.new(BaseLevel) do
  def self.owns?(cards)
    cards.sorted_values
         .group_by(&:itself)
         .any? { |_, group| group.size == 2 }
  end
end
TwoPairs =
Class.new(BaseLevel) do
  def self.owns?(cards)
    cards.sorted_values
         .group_by(&:itself)
         .select { |_, group| group.size == 2 }
         .count
         .eql?(2)
  end
end
ThreeOfAKind =
Class.new(BaseLevel) do
  def self.owns?(cards)
    cards.sorted_values
         .group_by(&:itself)
         .one? { |_, group| group.size == 3 }
  end
end
Straight =
Class.new(BaseLevel) do
  def self.owns?(cards)
    cards.sorted_values
         .each_cons(2)
         .map { |a, b| a - b }
         .uniq
         .one?
  end

  def detail_compare(other)
    cards.sorted_values.first <=> other.cards.sorted_values.first
  end
end
Flush =
Class.new(BaseLevel) do
  def self.owns?(cards)
    cards.map(&:color).uniq.one?
  end
end
FullHouse =
Class.new(BaseLevel) do
  def self.owns?(cards)
    cards.map(&:value).uniq.count > 1 &&
      OnePair.owns?(cards) &&
      ThreeOfAKind.owns?(cards)
  end
end
FourOfAKind =
Class.new(BaseLevel) do
  def self.owns?(cards)
    cards.sorted_values
         .group_by(&:itself)
         .one? { |_, group| group.size == 4 }
  end
end
StraightFlush =
Class.new(BaseLevel) do
  def self.owns?(cards)
    Straight.owns?(cards) && Flush.owns?(cards)
  end

  def detail_compare(other)
    cards.sorted_values.first <=> other.cards.sorted_values.first
  end
end