Покер бот: скачать робот для игры в онлайн-покер, описание возможностей

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

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

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

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

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

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

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

Если win {amp}lt; bet_cur, то Fold

Если bet_cur SB {amp}gt; win {amp}gt;= bet_cur, то Call (или Check)

Покер бот: скачать робот для игры в онлайн-покер, описание возможностей

Если win {amp}gt;= bet_cur SB, то Raise (или Bet)

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

Следовательно, если win {amp}gt; bet_cur, но при этом win {amp}lt; 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). Параметры этой функции следующие: свои карты, карты на столе (если есть) и количество игроков. Далее все просто — раздаем случайные карты остальным игрокам, выкладываем карты на стол (если их еще нет или не хватает) и проверяем комбинации.

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

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

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

Покер бот: скачать робот для игры в онлайн-покер, описание возможностей

Покер-румы строго следят за проблемой «ботоводства» и, к счастью, имеют достаточно инструментов в своем арсенале.

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

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

С другой стороны в борьбе с ИИ выступают сами игроки. Опытные игроки обращают внимание на следующие закономерности в игре соперников:

  • Использование идентичного размера ставки.
  • Одинаковый интервал времени на принятие решения;
  • Неоднократное использование определенной линии действий (в частности необычных);
  • Участие в сессиях в примерно одинаковое время;
  • Игнорирование вопросов в чате;
  • Нетипичные значения отдельных статистических показателей при плюсовой игре.

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

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

Покер бот: скачать робот для игры в онлайн-покер, описание возможностей

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

Если же окажется, что вы действительно противостояли покерной программе, и даже проиграли немало денег, всегда существует вероятность того, что покер-рум компенсирует вам средства.

Известно немало историй с положительной концовкой. Взять к примеру случай с участием покериста и тренера Пола Отто. Тому удалось обнаружить ботов на просторах популярной сети MicroGaming: ботов забанили, а пользователям, которое понесли материальный ущерб, руководство вернуло средства.

Другой пример произошел в малоизвестном шведском операторе Svenska Spel. Обнаружив факты ботоводства, компенсировал пострадавшим игрокам почти 4 млн шведских крон, что равно около $590 тысячам. Оказалось, что в сеть ботоводов входило порядка 10-ти аккаунтов, которые активно играли в покер-руме на лимитах от $50 до $500 в течение полугода.

Не совсем.

В некоторых случаях разработчиками ботов выступают ученые. Они не преследуют цель зарабатывать с помощью программы деньги в покере. Главная задача такого разработчика — общее изучение  искусственного интеллекта.

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

Одним из таких крупных исследований стал резонансный поединок людей с покерным ИИ под названием «Brains Vs. Artificial Intelligence: Upping the Ante» (в переводе “Мозги против Искусственного Интеллекта”).

В ходе 20-дневной игры один на один в Fix Limit Holdem программа «Libratus» соревновался против участников команды профи, в состав которой входили Донг Ким, Джейсон Лес, Даниэль Макоули и Джимми Чу. После 120 тысяч сыгранных раздач с гигантским отрывом в 1,7 млн условных фишек победила программа, разработанная учеными из университета Карнеги-Меллона.

Теория

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

Смотрите про коптеры:  IRB 6640 - Промышленные роботы

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

Однако при этом стоит заметить, что очень многое в настоящей игре зависит ещё и от размера ставок, которые мы будем делать. Ведь профессиональный покер – это не только и даже не столько математика, сколько психология игроков, принимающих участие в раздаче. Если мы хотим стать успешным игроком (или написать действительно мощного покер бота), то мы должны уметь отсортировывать своих соперников по категориям, выделяя “акул” и откровенных “рыб”. Само собой, программе это сделать намного сложнее…

Немного истории

Если обратиться к истории, то выяснится, что покер-боты уже давно пытались создавать самые “прогрессивные” умы человечества. Так, одним из самых первых ботов, о которых мы знаем, стала программа под названием “Orac”, которую создал профессионал в мире карточных игр Майк Каро. Отличительной особенностью данной программы было то, что она могла не только высчитывать возможность составления той или иной комбинации, но и могла определять вероятность блефа противника!

Разумеется, тот алгоритм не мог обыгрывать настоящих профессионалов в покере, и когда его проверили на практике в 90-х годах, выяснилось, что люди, в отличие от программ, умеют подстраиваться под игру соперника. И те люди, которые играли против “Orac”, очень быстро поняли, как можно обманывать программу, заставляя её “думать” не в том направлении.

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

p*pot*0,91 = win

Расчет вероятности

Покер бот: скачать робот для игры в онлайн-покер, описание возможностей

Если размер банка и размер ставки величины вполне известны, то как узнать вероятность выигрыша? На этот вопрос есть несколько ответов:

  1. Узнать, сколько комбинаций хуже нашей текущей руки, и разделить это число на количество комбинаций;
  2. Промоделировать несколько сотен тысяч раз ситуацию со своими картами на руках и на столе и со случайными картами у оппонентов, затем разделить число выигрышных раундов на их общее количество (набор методов, в которых используются случайные числа и большое число повторений, называются методами Монте-Карло. Да, да название произошло от знаменитого казино в Лас-Вегасе).

Плюс первого метода — самая высокая точность. Минусы — большое потребление памяти и сложность предварительного расчета. Так как всего комбинаций может быть 2.598.960 (число сочетаний 5 карт из 52), в памяти это будет занимать примерно 10Мб (из расчета, что на одну комбинацию отводится 4 байта для хранения вероятности).

Плюс второго метода — простота реализации.

Минусы — при малом числе раундов не очень точен, а большое число раундов требует больше ресурсов процессора.

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

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

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. Дальше, если достоинства карт одинаковы, то проверяем, чтобы карты с большим порядковым номером (карты, у которых номер масти больше) были «левее» карт с меньшим номером. После сортировки вычисляем достоинства карт (массив card), масти карт (массив suite) и количество карт каждой масти (массив suiteCount).

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

isHighCard

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

isOnePair

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

Покер бот: скачать робот для игры в онлайн-покер, описание возможностей

isTwoPair

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

isSet

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

isStraight

Покер бот: скачать робот для игры в онлайн-покер, описание возможностей

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

isFlush

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

isFullHouse

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

isQuads

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

isStraightFlush

Покер бот: скачать робот для игры в онлайн-покер, описание возможностей

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

isRoyalFlush

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

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

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 !

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector