Sign in

Зарегистрируйтесь, чтобы стать полноправным участником сообщества Masterpro.ws.

Poker. Nostalgia

Продолжаем игру в покер... да, "теперь можно сыгрануть и в покер", как говорил в русском дубляже всеми любимый киногерой.

 

Речь в данном случае идет о детерминированном покере; если, конечно, аффтор - полный профан в азартных играх - сумел правильно подобрать термин, т.е. о покере в открытую, на основе комбинаций классического покера / техасского холдема. Ну или напоминает работу покерного игрового автомата, если помните, стояли такие когда-то повсеместно на входах в метро во всех российских городах; не так давно покер ведь считался у нас видом спорта... затем перестал таковым считаться.

 

Рабочий пример описанного в статье кода, в числе других Rails Examples - всегда возможно найти в тестовом блоге автора на herokuapp.com, welcome.

 

Играете? А умеете? Представьте, что завтра опять что-то в этом контексте диаметрально противоположно изменится... должно же в нашей российской жизни хоть что-то меняться, и хотя бы иногда - к лучшему. И - рраз! - а вы в покер к тому времени как раз научились играть. Круто, согласитесь. Можно будет горделиво сказать, что никогда в покер играть и не прекращали, держа втихаря фигу в кармане. Жизнь ведь динамична и полна неожиданностей, нельзя жить одним днем... одним словом, обыграть моего бота пока что очень несложно - пробуйте. Никаких азартных игр и вообще никаких денег, попросту в дождливый осенний вечер аффтору вдруг припомнился старый добрый фильм с Адриано Челентано и Энтони Куинном.

Написанный на ruby алгоритм (иными словами - бот, ваш виртуальный оппонент) руководствуется на данный момент крайне нехитрой стратегией, оставляя после первой раздачи карты, составляющие законченную комбинацию, остальные карты меняет, предпочитая накрайняк сбросить все: рисковать не пробует совершенно. Затем следуют подсчет и сравнение комбинаций, при необходимости для определения выигравшего учитываются high card и kicker, в самых редких редком случае идет split pot. Все понятно? Удачи вам.

Здесь же, в рамках зауми для фанатов программирования, хотелось бы поделиться не ахти какими сложными секретами написанного на платформе ruby on rails приложения. И начнем, как водится... натурально, с самого начала. С раздачи колоды карт. " — Пусть она останется у вас на память! — прокричал Фагот. — Недаром же вы говорили вчера за ужином, что кабы не покер, то жизнь ваша в Москве была бы совершенно несносна."

Раздавать карты будет у нас вот такой несложный класс:

 

class Card
  attr_accessor :suit
  attr_accessor :value
 
  def initialize (suit = rand(1..4), value = rand(1..13))
    self.suit = suit
    self.value = value
  end
 
  def inspect
    "Card(suit:#{suit}, value:#{value})"
  end
end

 

, и к нему мы добавим еще один (подробнее), чтобы гарантированно обеспечить уникальность значений карт:

 

class CardComparable < Card
  include Comparable
 
  def <=>(other)
    suit <=> other.suit && value <=> other.value
  end
 
  def eql?(other)
    self.class == other.class && self == other
  end
 
  def hash
    suit.hash + value.hash
  end
end

 

Как видите, совсем не бином Ньютона... ах ты черт, ну как всегда. Чуть было не забыл самое важное. Проверяем полученный результат:

  

require 'test_helper'
class PokerControllerTest < ActionDispatch::IntegrationTest
  def test_to_string
    assert_equal('Card(suit:1, value:1)', Card.new(1, 1).inspect)
  end

  def test_simple_array_size
    cards = []
    cards << Card.new(1, 1)
    cards << Card.new(1, 2)
    cards << Card.new(1, 3)
    cards << Card.new(1, 1)
 
    assert_equal(4, cards.size)
    assert_equal(4, cards.uniq.size)
  end
 
  def test_comparable_array_size
    cards = []
    cards << CardComparable.new(1, 1)
    cards << CardComparable.new(1, 2)
    cards << CardComparable.new(1, 3)
    cards << CardComparable.new(1, 1)
 
    assert_equal(4, cards.size)
    assert_equal(3, cards.uniq.size)
  end
end

 

Ну вот как-то так.

 

# Running:
...
Finished in 0.319597s, 9.3868 runs/s, 15.6447 assertions/s.
3 runs, 5 assertions, 0 failures, 0 errors, 0 skips

Оставить комментарий

Добавьте ваш комментарий