Речь в данном случае идет о детерминированном покере; если, конечно, аффтор - полный профан в азартных играх - сумел правильно подобрать термин, т.е. о покере в открытую, на основе комбинаций классического покера / техасского холдема. Ну или напоминает работу покерного игрового автомата, если помните, стояли такие когда-то повсеместно на входах в метро во всех российских городах; не так давно покер ведь считался у нас видом спорта... затем перестал таковым считаться.
Играете? А умеете? Представьте, что завтра опять что-то в этом контексте диаметрально противоположно изменится... должно же в нашей российской жизни хоть что-то меняться, и хотя бы иногда - к лучшему. И - рраз! - а вы в покер к тому времени как раз научились играть. Круто, согласитесь. Можно будет горделиво сказать, что никогда в покер играть и не прекращали, держа втихаря фигу в кармане. Жизнь ведь динамична и полна неожиданностей, нельзя жить одним днем... одним словом, обыграть моего бота пока что очень несложно - пробуйте. Никаких азартных игр и вообще никаких денег, попросту в дождливый осенний вечер аффтору вдруг припомнился старый добрый фильм с Адриано Челентано и Энтони Куинном.
Написанный на 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