Натягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — Хакер

Натягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — Хакер Квадрокоптеры

Что такое бот и чем он отличается от подсказчиков?

Покерный бот — специально разработанная программа, имитирующая живого игрока в онлайн-покер, но выполняющая все действия автоматически. Главная цель создания бота для покера — получение прибыли. Грубое нарушение правил покерных румов разработчиков не страшит.

Иногда ботов путают с другим способом обмана в онлайне — подсказчиками. Использование покерных подсказчиков также запрещено правилами покерных румов, но все же подсказчик и бот — не одно и тоже. Если бот полностью самостоятелен и принимает решения автоматически, то игра с подсказчиком без человека невозможна.

На кнопки жмет человек, но думает за него подсказчик.

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

Натягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — Хакер

Покер во многом игра математическая. Особенно большую часть математика занимает в играх онлайн, потому что мы не видим оппонента, не можем использовать так называемые «телзы» — подсказки которые дает нам поведение игрока. Все наши решения основываются на предполагаемом диапазоне карт соперника и как стоит наша рука против этого диапазона.

Для определения прибыльности того или иного действия используем понятие математического ожидания в денежном эквиваленте, или EV (англ. — Expected Value). Оно определяется как сумма всех возможных исходов события выраженных в деньгах умноженных на вероятность этого события:

EV = X1($)*PX1 X2($)*PX2 … Xn($)*PXn.

Для примера возьмем ситуацию: игра в безлимитный холдем с блайндами $1/$2, у нас в руках QНатягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — ХакерНатягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — ХакерНатягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — ХакерНатягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — Хакер

EVфолда всегда равно нулю.

Для расчета EVуравн примем допущения: если на флопе будет А или К, то мы сразу играем чек/фолд; если нет, то мы играем чек, оппонент ставит (пусть будет $25), мы делаем повышение и оппонент сбрасывается. Получаем два события и вероятность выхода А или К на флоп — 32%.

EVуравн = (40$ — 12$ 25$)*0,68 (-12$)*0,32 = 32,2$.

Что делать, если вы подозреваете оппонента в том, что он бот?

Вы внимательно понаблюдали за оппонентом, заметили в его игре 2 и более признака, указывающих на то, что он бот. Что делать дальше? Глубоко вздохнуть, пожать плечами и вывести деньги из онлайн-покера раз и навсегда? Написать в своем блоге о халатности службы безопасности покерного рума?

Попытаться подстроиться. Существуют игроки, которые найдут слабые места в стратегии бота и извлекут выгоду. Далеко не все искусственные интеллекты одинаково хороши и при должном изучении у них часто найдутся слабые места. А если хозяин бота страдает излишней самоуверенностью, то может не следить за «подопечным» часами, а то и днями. За это время есть все шансы забрать банкролл у мошенника.

Избегать игры за столами с вероятным ботом. Другой путь — избежать драки, в которой вам не победить. Мудрое и взвешенное решение от трезво мыслящих игроков. Зачем ввязываться в бесперспективные ситуации, где вы рискуете проиграть деньги боту и сверху заплатить рейк в пользу не самого ответственного рума. Садитесь за столы без сомнительных оппонентов.

Поделиться наблюдениями с другими игроками. Иногда у игроков есть обоснованные сомнения и реальные доказательства в виде статистики и наблюдений. В других случаях основанием для радикальных выводов служит только общее впечатление об игре оппонентов.

В таком случае рекомендуем рассказать о подозрениях своим коллегам. Если у кого-то из игроков возникли такие же мысли, то изучение статистики и обмен наблюдениями укрепят вашу позицию. Бывали забавные ситуации, когда на сообщение реагировал потенциальный бот и развеивал подозрения.

Есть и обратные примеры: на пост о покерных ботах приходили люди с 0 в графе сообщений на сайте и начальным статусом и начинали писать, что они не боты. Такие ответы от «настоящих игроков» только сильнее убеждали в том, что это владельцы ботов.

Написать в службу безопасности. Наиболее верное решение — обратиться в службу безопасности или техническую поддержку покерного рума.

При этом укажите ник подозрительного аккаунта, особенности его поведения. Если выводы основываются на истории рук, то расскажите и об этом. У службы безопасности есть набор инструментов, помогающий им выявлять покерных ботов. Мошенники не стоят на месте, поэтому могут придумать новые пути обхода правил и обмана СБ покерных румов.

На что обращает внимание служба безопасности?

Признаки бота, перечисленные выше, привлекают внимание не только игроков во время сессии, но и службы безопасности. У СБ покерных румов есть большое преимущество над обычными игроками в виде доступа ко всей информации, а также возможность задействовать нейронные сети и алгоритмы вычисления шаблонов поведения. Под «шаблонами» подразумеваются тайминги, линии ставок, продолжительность сессий и многое другое.

Другие инструменты анализа службы безопасности:

  • Во время игры клиент покерного рума сканирует ваш компьютер и запущенные программы. Работа запрещенных правилами программ во время игры считается нарушением. Некоторые покерные румы идут еще дальше — просто их наличие на вашем ПК рассматривается, как нарушение. PokerMatch и PokerDom блокируют пользователей за наличие конвертеров для других покерных румов. Памятка для добропорядочных игроков — перед началом сессии убедитесь, что отключили запрещенное ПО. За включенную Flopzilla вас сразу не заблокируют, но предупреждение пришлют точно.
  • Проверка движений курсора мышки по экрану вашего компьютера. Живой игрок двигает мышкой и перемещает курсор совсем не так, как это делает бот. Искусственному интеллекту сложно имитировать хаотичность движений обычного игрока. Клиент покерного рума способен считывать такую информацию.
  • Использование CAPTCHA. Всем пользователям поисковых систем хорошо знаком метод со случайным набором букв или символов, которые необходимо ввести, чтобы показать принадлежность к человеческому роду. Точно так же используют CAPTCHA и покерные румы. Происходит это редко и чаще под проверку попадают мультитейблеры, играющие по много часов подряд. У искусственного интеллекта с прохождением CAPTCHA возникают проблемы.
  • В 2022 году PokerStars попросил группу игроков сделать запись их игровой сессии. Требования к записи были суровыми: перед началом сессии нужно было показать свое лицо для идентификации, продемонстрировать рабочее место с обзором на 360 градусов, отыграть не менее 70 минут, стартовать сессию с пустого рабочего стола. Звук должен был быть включенным, а качество видео таковым, чтобы были видны все ваши действия во время игры. На подготовку и отправку видео давали 10 дней. Игроков отбирали на основании подозрений и жалоб от других пользователей и выводов службы безопасности. Такая проверка от PS не всем пришлась по душе. Поток шуток об анализе крове, тесте ДНК и иных решениях проблемы с ботами был плотным. Такие проверки иногда проводят и другие покерные румы. Не самый комфортный, но эффективный способ борьбы с мошенниками.

Несколько лет назад управляющий партнер Partypoker Роб Янг предложил покерным румам создать объединенный реестр, где шел бы обмен информацией о нарушениях (в том числе и о ботах).

При реализации такого подхода мошенников блокировали не только в пределах одного рума или сети, но и во всем онлайн-покере. Пока дальше инициативы дело не пошло.

Что есть покер?

В отличие от шахмат, покер — игра с неполной информацией. То есть, игроки не знают, какая карта есть на руках у оппонентов — они могут это лишь предполагать с определенной степенью вероятности. Правила покера просты — выигрывает тот, у кого на руках сильнейшая комбинация, составленная из его карт и тех, что на столе, или последний оставшийся игрок, если все остальные сбросили.

Всего в покере десять комбинаций: Роял-флеш, Стрит-флеш, Каре, Фулл-хаус, Флеш, Стрит, Сет/Трипс/Тройка, Две пары, Одна пара, Старшая карта.Существует много разных видов покера. Здесь мы будем рассматривать Texas Holdem No Limit Poker, он же турнирный покер.

Monica

Архитектура
Архитектура

Monica.client

Это фактически клиент, он отвечает за формирование данных в рантайм режиме с покерных столов. Передает данные на сервер, получает решение, и аппаратно нажимает на кнопки. Перед его запуском клиент покер рума, должен быть соответственно настроен вручную!

Scan Engine – Блок который парсит в рантайме экран каждые 0.1 сек. По косвенным признакам понимает когда у него решение, сравнивает по заранее нарезанным координатам картинки,  по алфавиту(который набивается для каждого рума отдельно, человеком) определяет имена деньги ставки и всю необходимую инфу.

Keyboard API mouse API – для ввода данных используется аппаратный эмулятор(там есть и клавиатура и мышь), работает через длл(написана на C ), имеет строгое API, оттестирован, работает мгновенно. На данный момент боты с такой технологией уже не создаются, мы перешли на новое поколение ввода информации, но старые продолжают работать без банов. Новое решение позволяет больше не устанавливать никаких программ на компьютере где находится PokerRoom.

API мыши и клавиатуры есть и программные тупо по winAPI. (не используются нигде только, если не ошибаюсь одна функция есть в 888).

Monica.proxy

Это основной блок системы. По сути является прокси-сервером, который обеспечивает взаимодействия клиента и AI. В основном весь проект написан на C#, есть немного С в ядре. Прокси осуществляет взаимодействие со всеми участниками процесса кроме покер рума(далее ПР).

Client API – фактически это набор контроллеров, в который на вход подаётся (JSON или XML) из нашего протокола. Мы передаем с клиента название функции, которая должна дать ответ и параметры. В момент обработки запроса, если все удачно произошло, вызывается нужная функция на сервере, а там уже происходит выполнение той или иной команды. Грубо говоря(RPC).

Смотрите про коптеры:  6 пар iFlight Nazgul T4030 4-дюймовый 2-Лопастной пропеллер Prop совместимый с XING 1404 мотор

ORM – основная база где хранится вся история действий клиента который был подсоединен 

к серверу использует MySQL. Сама ORM Devexpress. Используем DTO(DAL) подход. База с PostgreSQL пополняется сторонними программами, такими как PT4 и HoldemManager. Из неё просто тянем процедурами конкретные параметры. Вообще база postgresql становится архаизмом, так как изначально бот играл сессии только располагав столы стопкой, что не позволяло видеть рантайм картину за всеми столами одновременно. Сейчас у нас разрабатывается отдельный модуль мониторинга, который закроет эту задачу.

Monica.reader

Алгоритм моделирования

  1. Раздать случайные карты игрокам;
  2. Положить случайные карты на стол (если на столе еще не пять карт);
  3. Сравнить свою комбинацию с комбинациями других игроков;
  4. Если наша комбинация лучшая, то прибавляем к количеству выигранных раундов 1/<количество игроков с такой же комбинацией>;
  5. Повторяем шаги 1-4 нужное количество раз;
  6. Вероятность выигрыша равна <кол-во выигрышных раундов>/<общее кол-во раундов>. К коду я приложил unit-тесты, так что можно сразу проверить работоспособность всех методов.

Как вычислить бота во время игры?

Вычислить умелого шулера во время игры в живой покер нелегко. Речь даже не идет о мошенниках, умело использующих современные шпионские гаджеты. Часто сложной задачей становится выявить обычного жулика с «держателем карт». В онлайн-покере все еще сложнее.

Но сложнее не значит «невозможно». За последние годы покерное сообщество смогло обобщить признаки покерных ботов:

Одинаковое время на принятие решения. «Тайминги» часто служат хорошим ридсом против настоящих игроков, как в онлайне, так и в офлайне. Они могут указывать и на то, что ваш соперник — бот. Если перед любым действием оппонент тратит на принятие решения одинаковое количество времени, то, вероятнее всего, ваш соперник — бот.

Ключевой фактор — ему требуется равное количество времени для чека OOP на флопе и колла пуша на ривере в сложной ситуации. И в очевидных руках, и в очень сложных у вашего оппонента будут одинаковые тайминги. Лучшие боты для покера учитывают этот фактор, но менее совершенные программы часто выдают себя.

Как принимается решение во время расследования?

1. На начальном этапе изучения один из членов команды СБ проводит анализ с помощью всех доступных инструментов и данных. По итогам рассмотрения он готовит вывод;

2. Следующий этап — повторная проверка другим специалистом из службы безопасности и подготовка своего заключения;

3. Если их независимые выводы совпадают, то факт использования покерного бота или иное мошенничество считается установленным. В случае сомнений привлекается третий член команды и после его тщательной проверки выносится окончательное решение.

С процессом принятия решения определились, но что можно сказать о выявлении ботов. Как именно игрок становится подозрительным и оказывается в центре внимания Ока Саурона?!

Как работает покерный бот?

Чаще всего покерный бот состоит из двух элементов:

  • Стратегического движка. Отвечает за обработку информации и принятие решений. «Мозг» искусственного интеллекта.
  • Вспомогательного интерфейса. Дополнительные инструменты программы, необходимые для взаимодействия бота с клиентом покерного рума. «Руки» искусственного интеллекта.

«Написать» простого бота для покера — задача не сложная даже для не самого хорошего программиста. Вот только выигрывать за покерным столом деньги он не сможет. Его максимум — играть в 0 или слабый минус на NL2-NL5. А вот создать сильный искусственный интеллект для успешной игры — настоящий вызов. Для этого требуется много времени и сил, а также квалифицированные IT-специалисты.

Сама суть покера — игры с неполной информацией и невероятным количеством ситуаций за столом — создает барьер, который большинству мошенников не преодолеть. К сожалению, ключевое слово «большинство» указывает на то, что некоторые разработчики справляются с ним.

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

Сканирование экрана. В науке данный способ называется «Оптическое распознавание символов». Искусственный интеллект делает скриншот вашего экрана, затем приводит информацию в понятный для себя вид. По такому же принципу работают современные сканеры при распознавании и оцифровывании печатных документов.

Недостатки очевидны — бот не сможет точно считывать информацию, потому начнет принимать ошибочные решения на основе неверных данных. Одно всплывающее окно с рекламой турнира, который «начнется через 15 минут — спешите зарегистрироваться» отправят бота в аут.

Чтение чата. Во многих покерных румах информация о ходе розыгрыша отображается в чате в виде текста. Для покерного бота не составляет труда извлечь необходимые данные из окна с чатом. Парадоксально, но покерный рум сам помогает себя обманывать.

Перехват информации. Если сканирование экрана и чтение чата эксплуатируют открытую информацию из рума, то перехватывание команд или трафика — куда более сложный маневр. В основе этого способа получения информации — проникновение в код клиента покерного рума.

В зависимости от алгоритмов работы ботов можно разделить на 3 группы:

ГТО-боты. В основе работы лежит сбалансированная стратегия игры в покер. Несмотря на то, что в идеальных условиях GTO обеспечит вам игру в 0 против такого же сбалансированного оппонента, в реальной жизни сбалансированный бот приносит колоссальную прибыль.

Заскриптованные боты. Бот играет по сценарию, который в него заложил разработчик. Классическая последовательность «Если…то». Если у вас в руках карманная пара АА на большом блайнде и перед вами был рейз, то вы всегда делаете 3-бет.

Вот именно на основе таких правил и работают заскриптованные боты. Подобный подход — наиболее простой при создании бота и наименее эффективный. Уровень игры такого искусственного интеллекта будет зависеть от навыков игры разработчика. А предвидеть все сценарии невозможно.

Поэтому создателю приходится обобщать алгоритмы. Такие боты прибыльны только на низких лимитах. Профессиональные игроки со средних и высоких лимитов быстро раскусят «оппонента» и обнулят. На покерных сайтах игроки регулярно описывают ситуации, где они находили уязвимость в стратегии бота и начинали использовать ее в каждой руке.

Эксплуатационные боты. Наиболее опасные и эффективные покерные боты играют по эксплуатирующей стратегии. В этом аспекте искусственный интеллект ничем принципиально не отличается от живого игрока. Кроме одного единственного фактора — они безжалостны и не берут в плен.

Если живой человек может не заметить слабости в вашей игре из-за нехватки скилла, невнимательности, мультитейблинга либо усталости, то бот не упустит ничего. Машина будет постоянно оказывать давление и забирать ваши деньги. При создании такого бота есть 2 опции: 1) адаптировать стратегию игры под конкретного оппонента; 2) заложить алгоритмы игры против разных типов соперников. В обоих случаях работа ИИ зависит от базы данных.

Как службы безопасности выявляют ботов?

Работа служб безопасности покерных румов редко выходит на первый план. В большинстве случаев мы узнаем о результатах косвенно, когда видим уведомление о возврате на ваш счет средств, которые были выиграны незаконно. Деньги конфискуются с заблокированного счета мошенника и распределяются между пострадавшими пользователями.

Борьба с ботами, подсказчиками и другими нарушениями — важное направление работы любого покерного рума. Сообщения от пользователей о возможных ботах помогают службам безопасности, но составляют малый процент от общего количества выявленных нарушений.

Сам процесс вычисления мошенников и ботов никогда не освещается сотрудниками службы безопасности. Причина — нежелание давать подсказки нарушителям, чтобы они совершенствовали свои методы и уходили от наказания.

Иногда покерные румы все же делятся информацией о борьбе с ботами и другими нарушителями. В конце 2022 PokerStars выпустил большой отчет, который можно взять за основу.

В отдел честной игры PS входит свыше 60 специалистов. Среди них: программисты, исследователи баз данных и бывшие профессиональные игроки в онлайн-покер.

Кодируем расчет вероятности

На данный момент можно найти множество библиотек для расчета вероятности выигрыша. Есть как бесплатные, так и платные версии. А мы изобретем свой велосипед. Почему? Чтобы разобраться в этом вопросе детальнее и из-за желания сделать полностью своего бота.

Замечания по кодированию карт:

Всего 52 карты = 4 масти x 13 карт каждой масти. Масть текущей карты = <порядковый номер карты>/4 (/ — целочисленное деление).

Достоинство текущей карты = <порядковый номер карты> (% остаток от деления). Собственно, у нас должно быть 10 функций по определению комбинации. Назовем их так:

isHighCard, isOnePair, isTwoPair, isSet, isStraight, isFlush, isFullHouse, isQuads, isStraightFlush, isRoyalFlush.

Объединяет эти функции следующее — на входе подается набор карт, а на выходе — число от -1 до 12, где -1 — комбинация не найдена, от 0 до 12 — старшая карта в комбинации. 0 это двойка, 1 — тройка, и так до 12 — туз. Масть не важна. Набор карт может быть любой длины — от 1 до 7.

Это сделано для того, чтобы можно было легко рассчитать вероятности и в пре-флопе (когда карты на стол еще не положили, но раздали карты игрокам), и в терне и ривере (когда на стол положили четыре и пять карт соответственно). То есть теперь нам нужно будет дать функции список всех карт, которые лежат на столе и у игрока, а функция из этого набора карт выделит комбинацию.

Чтобы оптимизировать определение комбинаций, мы сделаем следующее:

  1. Упорядочим комбинации по убыванию достоинства карт;
  2. Разделим входной массив карт на три: массив с достоинствами карт, массив с мастями карт и массив с количеством карт каждой масти.

Эти действия будет выполнять функция sortHand. Входной параметр — массив hand, в котором хранится список карт. Выходные параметры — массивы card (достоинства карт), suite (масти карт), suiteCount (количество карт каждой масти). В первой части функции происходит простая сортировка заменой (можно заменить ее на быструю сортировку).

Смотрите про коптеры:  Управление роботом может происходить разными способами.

Тут есть маленький нюанс — сортируются не сами карты, а их достоинства. Чтобы узнать достоинство карты, нужно узнать остаток от деления на 13. Дальше, если достоинства карт одинаковы, то проверяем, чтобы карты с большим порядковым номером (карты, у которых номер масти больше) были «левее» карт с меньшим номером.

Математическая сторона принятия решений в покере

Формула принятия решений в покере чрезвычайно проста: p*pot = win, где p — вероятность выигрыша с текущими картами (на руках и на столе), pot — размер банка на момент принятия решения, win — выигрыш, который мы получим, если будем разыгрывать множество партий с этими картами.

Если win < bet_cur, то Fold

Если bet_cur SB > win >= bet_cur, то Call (или Check)

Если win >= bet_cur SB, то Raise (или Bet)

bet_cur — это все деньги, которые мы положили в банк за текущую игру (НЕ только за один круг торговли), плюс те деньги, которые нужно сейчас поставить.Пояснения к bet_cur:

Если на первом круге торговли мы поставили всего $10, а на втором круге мы должны поставить $5, и в этот момент мы принимаем решение, то bet_cur равно $15 (10 5). SB (Small Blind) — размер малого блайнда «(первая ставка вслепую — прим. ред.)». Это значение прибавляется к bet_cur во втором условии, так как мы можем увеличивать ставку только на число, кратное малому блайнду.

Следовательно, если win > bet_cur, но при этом win < bet_cur SB, то увеличивать ставку нам не выгодно, так как пришлось выставить bet_cur SB. BB (Big Blind) – размер большого блайнда.Стоит также добавить, что эта формула может использоваться только в компьютерной игре — в жизни за столом вряд ли будет возможность самому вычислять вероятность выигрыша и все это считать.

Название карт в покере

Карта записывается двумя латинскими символами. Первый символ — достоинство карты, второй — масть. Карты от 2 до 9 так и записываются. T — десять (хотя иногда и просто 10), J — валет, Q — дама, K — король, A — туз. Трефы — c, пики — s, бубны — d, червы — h.

Как видно из кода, сначала функция складывает карты на руках и карты на столе в один массив, потом сортирует его, а далее по порядку определяет комбинации.

Определение идет от сильнейшей комбинации (флеш-рояль) к слабейшей (старшая карта). Чтобы комбинации отличались друг от друга, они имеют область действия — набор значений карт, находящихся в этой комбинации. Так, комбинации High card (старшая карта) соответствуют значения от 0 до 12, где 0 — это High card со старшей «двойкой», а 12 — со старшим тузом. А комбинации «пара» соответствуют значения от 13 до 25, где 13 — «пара» со старшей «двойкой», а 25 — со старшим тузом.

И, наконец, сделаем функцию для опреде ления вероятности выигрыша (getProbabilityOfWin). Параметры этой функции следующие: свои карты, карты на столе (если есть) и количество игроков. Далее все просто — раздаем случайные карты остальным игрокам, выкладываем карты на стол (если их еще нет или не хватает) и проверяем комбинации.

Маленькое замечание по моделированию: карты игрокам лучше выдавать случайно, а не мешать колоду, а потом выдавать, так как в первом случае будет быстрее.

О законности создания покер-ботов

По законам РФ и других государств создание и использование покер-ботов (и ботов для других игр) не запрещено. А по правилам всех известных мне покер-румов — запрещено.Что это значит? Если ты попался на использовании бота, то самое страшное, что тебе грозит — это бан аккаунта и списание с него всех средств. Все.

Объяснение формулы

Из этой формулы мы получаем математическое ожидание выигрыша (в нашей формуле это win). Иначе говоря, разыгрывая много раз игру с такой вероятностью (с такими же картами у нас на руках и на столе) и таким банком, мы получим такой выигрыш. Следовательно, чтобы оставаться в плюсе, мы должны ставить не больше этого выигрыша (на рисунке это bet1).

Если поставим больше, то окажемся в минусе — выиграем меньше, чем будем ставить (на рисунке это bet2). Стоит сделать замечание к формуле — так как покер-румы берут комиссию с каждого банка, то нужно размер банка уменьшить на величину этой комиссии. Формула с комиссией будет такова:

p*pot*0,91 = win

Примечание о теории вероятности

В реальной жизни она применяется в основном для расчета отказоустойчивости механизмов, но ее можно очень хорошо применять также в играх с неполной информацией и большим количеством раундов: рулетка, покер, блэкджек и др. В теории вероятности есть несколько парадоксов, которые не соотносятся с нашим жизненным опытом, но, тем не менее, являются правдой. Это, например, парадоксы Монти-Холла и Паррондо.

Принятие решений в покере

Как правило, во время каждого хода игрок может принять три решения: Fold, Call, Raise. Есть еще All-in — когда денег для продолжения игры нет, и придется поставить все. Существует множество алгоритмов принятия решений: DIVAT анализ, дерево решений, различные эмпирические алгоритмы (кстати, большинство из этих алгоритмов используют вероятность выигрыша). Мы будем использовать в принятии решений беспристрастную математику, а точнее — теорию вероятности.

Простая схема покер-бота

Из каких блоков будет состоять наш робот? Рассмотрим по пунктам:

  • Logic — Блок логики принятия решений (Fold, Call, Raise)
  • Negotiator — Блок взаимодействия с программой для игры в покер;
  • Statistics — Блок обработки и накопления статистики по игрокам.

Из Negotiator в Logic поступает информация о текущих действиях на столе. Из Logic в Negotiator — информация о своих действиях, которые нужно совершить (сделать Fold, Call или Raise). Из Negotiator в Statistics — информация о действиях игрока за столом для последующей обработки и хранения. Из Statistics в Logic — информация о статистических данных игроков.

Совершенствование алгоритмов

Базовые алгоритмы — это основа для улучшенной стратегии, будет очень полезно разнообразить игру бота приемами, которые часто используют другие игроки и позволяют запутать соперника своими действиями. В целом поговорим о блефе, а точнее частных его случаях.

Продолженная ставка — ставка на следующей улице при проявлении агрессии на предыдущих (рейз, ререйз). Очень популярный прием, часто применяется на флопе если на префлопе мы повышаем хорошей картой (например АК), но не попали в доску и все равно делаем ставку, показывая что у нас хорошая карта (скажем высокая пара).

Для бота, чтобы его игра не была слишком читаема, можно ввести продолженную ставку в 70-80% случаев. Размер ставки нужно выбирать таким же как и ставку с картами в руках, чтобы нельзя было определить блеф. Для продвинутой продолженной ставки можно выбирать подходящие для нее флопы. Т.к. цель этого приема — заставить сброситься оппонента, то нам нужно выбирать флопы в которые оппонент вероятнее не попал.

Агрессивный розыгрыш дро — вариант полу-блефа, когда мы можем получить комбинацию монстр на следующих улицах. Имеет смысл для двухстороннего стрит-дро (у нас QJ, на столе KT4 — туз и 9-ка дают нам стрит), флеш-дро (у нас AhTh, на столе 9h5h3c — любая чирва дает нам натсовый флеш) и любых монстр-дро.

Прием выполняется в расчете на то что оппонент сбросится и даже при продолжении борьбы у нас есть шанс получить лучшую руку. При чем наш монстр будет замаскирован, потому что мы проявляли агрессию, когда еще не было возможности флеша или стрита. При программировании бота можно использовать этот прием, скажем, в 60-70% случаев.

Маскировка — здесь хотелось бы упомянуть о том как можно попытаться замаскировать поведение нашего бота. Определить программу по достаточной истории рук не так сложно — шаблонные действия на префлопе и постфлопе будут ее выдавать. Чтобы избежать этого можно ввести элемент случайности в выбор разыгрываемых карт.

Например, если у нас в диапазоне есть розыгрыш пар JJ , то можно играть валеты в 80% и, например, десятки в 20% случаев. Или варьировать варианты колла и рейза, скажем 50/50. Еще полезно иногда разыгрывать вообще случайные карты (как это бывает часто у людей), тогда нельзя будет выделить точный диапазон разыгрываемых карт и определить шаблонность действий.

Функция определения силы комбинации

int getCombination(int[] hand, int[] board) {int[] allCard;if ((board == null) || (board.length == 0)) {allCard = new int[hand.length];System.arraycopy(hand,0,allCard,0,hand.length);} else {allCard = new int[hand.length board.length];System.arraycopy(hand,0,allCard,0,hand.length);System.arraycopy(board,0,allCard,hand.length,board.length);}int[] card = new int[allCard.length];int[] suite = new int[allCard.length];int[] suiteCount = new int[4];

sortHand(allCard, card, suite, suiteCount);if (isRoyalFlush(card, suite, suiteCount) != -1) {return 117;}int result = isStraightFlush(card, suite,suiteCount);if (result != -1) {return 104 result;}result = isQuads(card);if (result != -1)

{return 91 result;}result = isFullHouse(card);if (result != -1) {return 78 result;}result = isFlush(card, suite, suiteCount);if (result != -1) {return 65 result;}result = isStraight(card);if (result != -1)

{return 52 result;}result = isSet(card);if (result != -1) {return 39 result;}result = isTwoPair(card);if (result != -1) {return 26 result;}result = isOnePair(card);if (result != -1) {return 13 result;}return isHighCard(card);}

Далее сделаем функцию, которая возвращает абсолютную силу карточной комбинации (я назвал ее getCombination). Всего таких разных по силе комбинаций будет 118: девять комбинаций со старшими картами (по 13 старших карт в каждой комбинации), и одна комбинация без старшей карты (флеш-рояль, в котором старшая карта — всегда туз) — 9×13 1=118.

Хотя в комбинации «две пары» может быть только 12 старших карт (двойка в этой комбинации не может являться старшей), чтобы не нарушать порядок, мы это не учитываем. Эта функция нужна для последующего удобного сравнения комбинаций между собой — она возвращает число, и чем оно больше, тем сильнее комбинация.

Смотрите про коптеры:  Nestopia Как настроить джойстик. По эмулятору Настройки и Тех. Помощь Секреты Пароли Чит-Коды

Функция сортировки массива карт

void sortHand(int[] hand, int[] card,int[] suite, int[] suiteCount) {for (int i = 0; i < hand.length; i ) {for (int j = 0; j < hand.length – 1; j ) {int t;if (hand[j] % 13 < hand[j 1] % 13) {t = hand[j 1];

hand[j 1] = hand[j];hand[j] = t;}if ((hand[j] % 13 == hand[j 1] % 13) &&(hand[j] < hand[j 1])) {t = hand[j 1];hand[j 1] = hand[j];hand[j] = t;}}}for (int i = 0; i < hand.length; i ) {card[i] = hand[i] % 13;suite[i] = hand[i] / 13;suiteCount[suite[i]] ;}}

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

isHighCard

Возвращаем первую карту массива.

isOnePair

Ищем две одинаковые карты, идущие подряд, и возвращаем достоинство этих карт.

isTwoPair

Ищем две одинаковые карты, идущие подряд, ищем еще две одинаковых карты и из двух достоинств этих карт возвращаем максимальное.

isSet

Ищем три одинаковые карты, идущие подряд, и возвращаем достоинство этих карт.

isStraight

Подсчитываем, сколько карт подряд идет с убыванием достоинства. Если таких карт пять, то возвращаем достоинство старшей.

isFlush

Проверяем, чтобы было пять карт одной масти, и возвращаем достоинство старшей карты этой масти.

isFullHouse

Ищем три карты одного достоинства и еще две одинаковые карты. Возвращаем достоинство трех карт.

isQuads

Ищем две карты одного достоинства, идущие подряд. Возвращаем достоинство этих карт.

isStraightFlush

Проверяем, чтобы было пять или более карт одной масти, и чтобы эти карты шли по порядку. Возвращаем достоинство старшей карты.

isRoyalFlush

Проверяем, чтобы в комбинации были Туз, Король, Дама, Валет, 10, 9 одной масти. Возвращаем 12 (порядковый номер достоинства туза).

Кстати, еще можно оптимизировать определение комбинации — совместить проверку нескольких комбинаций в одной функции (например, проверку на две пары и пару), изменить кодирование (представление) карт в программе, перенести эти функции на C и скомпилировать в native библиотеку и т.д.

Чем боты опасны для онлайн-покера?

На заре онлайн покера самые популярные мнения о ботах звучали так:

  • «Искусственный интеллект никогда не сможет конкурировать с человеком при игре в покер, так как покер — игра с неполной информацией и вычислительных мощностей просто не хватит»;
  • «Я — отличный игрок и потому с легкостью вычислю и переиграю покерного бота (Вы думаете я вас не переиграю?! Я вас уничтожу!)»;
  • «Машина не сможет подстроиться под мою стратегию»;
  • «Бот не сможет играть лучше, чем свой создатель. А зачем отличному игроку в покер тратить годы жизни на создание ИИ, если он может выигрывать огромные деньги самостоятельно прямо сейчас?».

Любопытно, что такие мысли высказывали не только обычные регуляры, но и топовые игроки того времени. Том Дван даже предлагал заключить пари Бену «123Sauce» Сульски, на случай, если тот будет играть против покерного бота. Он готов был поставить на Сульски в HU матче на продолжительной дистанции и считал искусственный интеллект откровенным аутсайдером.

Парадоксально, но все игроки в покер знали о том, что именно боты похоронили шахматы и нарды в онлайне. Из-за невероятного количества мошенников люди попросту отказались от идеи играть на деньги в интернете. Да, разработка выигрывающего в покере искусственного интеллекта — более сложная задача. Однако не настолько, чтобы самоуверенно отбрасывать такую вероятность.

С ростом вычислительных мощностей компьютеров увеличивались и шансы встретить за столом ботов. Сперва выявить и переиграть их было легко. Да и сами разработчики не стремились сделать их плюсовыми. В конце 2000-х у многих покерных румов программа лояльности давала возможность зарабатывать большие деньги за счет бонусов и рейкбека. В той же iPoker Network давали рейкбек в 100% и более.

Технический прогресс не стоял на месте и потому все более мощные компьютеры становились доступны широким массам. В том числе и разработчикам ботов для покера. В какой-то момент существование плюсовых ботов стало очевидно всем. Тут-то даже у самых сильных игроков поубавилось самоуверенности. Потери от ботов исчислялись миллионами долларов.

Главная проблема с ботами в покере состоит не в том, что настоящие игроки проигрывают деньги или теряют часть своего дохода. И даже не в миллионах долларов, которые выкачивают из покера мошенники. Ключевая угроза — утрата доверия. Если любитель знает, что быстро проиграет все свои деньги мошенникам, использующим покерных ботов, то он предпочтет не играть вовсе.

Тогда в проигрыше останутся профессиональные игроки, лишившиеся основного источника дохода от рекреационных игроков. Не лучше ситуация будет и у покерных румов, потому что уменьшатся объемы игры, с ними — количество рейка и конечный доход. В итоге эта лавина похоронит под собой весь онлайн-покер.

Ярким примером «убийства» покера можно считать HU кэш-столы. Дисциплина была очень популярна на заре онлайн-покера. В любом покерном руме были десятки столов на низких, средних, а иногда — на высоких лимитах. А потом появились покерные боты и в HU Cash вскоре перестали играть даже плюсовые регуляры.

Independent chip model (icm)

ICM – это математическая модель которая применяется в играх Sit-n-go (СНГ) и успешно применяется в поздней стадии этих турниров, так называемый пуш-фолд. Обычно эта стадия наступает когда в стеке становится меньше 10 ББ и нет смыла вступать в игру рейзом или коллом, а есть только два варианта розыгрыша: пуш или фолд.

В турнирах кроме EV (или chipEV, cEV) необходимо ввести понятие $EV – денежная стоимость EV (сколько стоят фишки в призовых деньгах), потому что в турнирах они не совпадают. Довольно четко это видно в начальной стадии, когда удвоение фишек (EV) никак не приведет к удвоению $EV.

Дальше небольшая врезка со скучной математикой ICM, кому не интересно, могут пропустить этот раздел.

В ICM для расчета $EV – ожидаемого дохода игрока с учетом текущего количества фишек, используется следующий способ: вычислятся вероятность с который игрок займет определенное место, потом каждая из вероятностей умножается на денежный эквивалент за это место и суммируется. Вероятность занять первое место определяется как соотношение кол-ва фишек игрока и всех фишек в турнире. Для наглядности будем использовать пример: в СНГ-турнире на 10 человек, стоимостью 10$ (распределение призов между первыми 3-мя местами: 5$, 3$, 2$) осталось 3 игрока со стеками: А=7500, B=4500, C=3000 (для простоты и наглядности расчетов не будем учитывать что блайнды уже поставлены и не находятся в стеках игроков). Таким образом вероятность занять первое место для игрока B:

PB1 = VB/(VALL) = 4500/(7500 4500 3000) = 30%.

Для определения вероятности игроком B занять 2-е место, нужно определить ее для случая, если выиграет игрок А (РА1 = 50%) и если выиграет игрок С (РС1 = 20%) и просуммировать их. При этом стек победителя не учитывается:

PB2 = PA1 * PB2,C3 PC1 * PB2,A3 =

= 0,5 * 4500 / (4500 3000) 0,2 * 4500 / (4500 7500) = 0,395 = 39,5%.

Получаем PB3 = 1 – PB1 – PB2 = 1 – 0,3 – 0,395 = 0,305 = 30,5%.

Итак $EVB = PB1 * V1$ PB2 * V2$ PB3 * V3$ =

= 0,3 * $5 0,395 * $3 0,305 * $2 = $3,30.

Теперь, когда мы знаем как рассчитывать $EV мы можем определять выгодность нашего хода. Уточним наш пример — игрок B на позиции малого блайнда с AНатягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — ХакерTНатягиваем сетевые poker Room’ы: кодинг покер-бота — логика принятия решений — Хакер в руках, игрок А сбрасывает. Посчитаем какой ход выгоднее: пуш или фолд.

При фолде ничего не меняется и игрок B имеет все те же $EVфолд = $3,30.

При пуше есть три варианта:

  1. 1. Игрок C примет нашу ставку и проиграет. Допустим он будет коллировать с диапазоном: 88 , A9s , AТo, KTs , KQo (10% спектра), тогда проиграет он в 42% случаев. Вероятность такого исхода — 10%*42% = 4,2%, а $EVB после него составит $4.
  2. 2. Игрок С примет нашу ставку и выиграет. Вероятность этого исхода 10%*58% = 5,8%, а $EVB = $2.47.
  3. 3. Игрок С сбросится в 90% случаев и EVB останется равным $3,30.

Получаем итог $EVпуш с учетом всех возможных исходов:

$EVпуш = 0,042 * $4 0.058 *$2,47 0,9 * $3,295 = $3,28. Т.е. наша доля в турнире после этого пуша в итоге уменьшится, получается он невыгоден. На самом деле разница незначительная, поэтому можно назвать этот пуш пограничным, т.е. с лучшими руками нам это делать выгодно, а с худшими нет. В расчетах не учитывались блайнды, чтобы не путать лишними цифрами, а был понятен сам принцип расчета.

Если с математикой все понятно, то остается одна относительная величина — диапазон карт с которыми будет отвечать или рейзить соперник, который нам необходим для расчета наших шансов на победу. Для этого можно использовать заранее определенные средние диапазоны колла и пуша для разных уровней стека относительно блайндов.

Например, для 9-10 ББ можно принять диапазон пуша из ранней позиции: 77 , AJs, AQo, KQs; а колла: TT , AQ. Чем меньше блайндов в стеке, тем шире диапазон. Готовые таблицы стадии пуш-фолд можно найти и использовать на многих покерных сайтах, можно их принять за диапазоны среднестатистического игрока. А если хорошо поработать с этими диапазонами, то можно получить достаточно плюсового бота.

Заключение

В принципе, описанную вероятность уже можно использовать для игры в покер в интернете. Можно разыгрывать руки, вероятность выигрыша которых достаточно высока. Для этого я написал простой калькулятор, который на основе карт на руках и на столе, а также количестве игроков вычисляет вероятность выигрыша. Кстати, таких калькуляторов в Сети много и они более функциональны.

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector