Как сделать игру покер
Написание покерного бота
Внимание материал носит чисто ознакомительный характер, и автор не несет ответственности за закрытие аккаунтов покерными румами. По законам стран создание и использование ботов не запрещено, однако по правилам покерных румов они запрещены.
В данной статье полных исходных кодов не будет, только теоретически что и как можно использовать, и некоторые куски функций. Если ты интересуешься этим, тебе не составит собрать все в единую картину и написать свое. Так же не буду учить стратегиям игры, про термины или стратегии а так же правила можно в интернете найти много информации.
Немного истории.
Начал играть около 5 лет назад, за это время отыграно более 1 миллиона рук. В основном это No Limit Holdem (нелимитированный холдем) за короткими столами (от 2 до 6 человек за столом), есть опыт игры в Омаху, HU NL Holdem. Игра вроде как хобби и отдых. И вот как то с друзьями появилась идея написать бота, первая идея была написать под лимит холдем, и когда наполовину бот был написан, приняли закон запрещающий играть американцам в покер, в итоге с лимитом закинули бота. Первая версия была написано на нейронной сети с распознаванием образов, что это значит – обучили бота распознавать по снимкам с экрана карты, но это сами понимаете неточный метод, но при достаточно хорошем обучении распознавал с точностью 98-99%.Далее версии ботов уже работали на прямую с окнами румов, используя их ресурсы., а так же в тандеме с программами для анализа и сбора статистики игры.
Покер румы не спят.
Практически во всех покер румах есть та или иная защита и система обнаружения покерных ботов. Рассмотрим часть из них. Долгая игра – когда человек слишком долго играет, становится подозрительным, поэтому в некоторых румах могут появляться окошки с вопросами. Как защита не делать долгих сессий игры. Действия за столом – нажатие кнопок, выбор окон, действий не должно происходить не передвигая мышь, в свернутом окне. Траектории мыши лучше задать немного нелинейно, нажатия в разные места кнопок, скорость движения тоже не моментальная. Сканы запущенных процессов и скриншоты экрана – защита как говорил выше, не играть в свернутых окнах, процесс бота называть не покер-бот, и тому подобное, не оставлять окно бота развернутым на экране, имя процесса менять спустя какое то время (например через х минут перезапустить бота с новым именем процесса).
Схема покер бота.
Схему можно разделить на 3 части:
Блок 1 — блок взаимодействия с клиентом для игры в покер.
Блок 2 — блок принятия решения.
Блок 3 — блок сбора статистики, на мой взгляд лучше использовать сторонний софт, например PokerTracker3, отключив при этом вывод статистики на экран.
Далее рассмотрим каждый блок более подробно.
Блок 1 — блок взаимодействия с клиентом для игры в покер.
Этот блок служит для сбора информации на игровом столе и передачи в блок принятия решения, а так же получив ответ с решением выполнить то или иное действие как Fold, Raise, Call или All-In. Теперь рассмотрим этот блок. Часть этой части это взаимодействие с главным окном программы, это такие действия как выбор лимита, выбор стола за которым будем играть, это тоже большая часть, но на ней не будем останавливаться. Рассмотрим более подробно часть уже со столом. Сначала нам нужно найти хэндлы всех игровых открытых столов (окон), можно это сделать при помощи функции EnumWindows.
Функция EnumWindows перечисляет все окна верхнего уровня на экране, передавая дескриптор каждого окна, в свою очередь, в определяемую программой функцию повторного вызова. EnumWindows действует до тех пор, пока последнее окно верхнего уровня не будет перечислено, или пока функция повторного вызова не возвратит значение ЛОЖЬ (FALSE).
Параметры:
lpEnumFunc — указывает на определяемую программой функцию повторного вызова. Для получения дополнительной информации, см. функцию повторного вызова EnumWindowsProc.
lParam — устанавливает 32-разрядное, определяемое программой значение, которое будет передано в функцию повторного вызова.
Возвращаемые значения: если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение — ноль.
Если функция отработала успешно, мы можем получить имя окна GetWindowText, и проанализировав его понять нужное или нет окно, обычно в заголовке окна присутствует ваш ник, название покер рума и лимит. Далее не мешало бы хэндлы всех найденных окон сохранить, для дальнейшего использования, без повторного поиска, поиск нужно будет делать лишь в случае открытия нового окна.
Теперь когда мы имеем хэндл игрового окна мы можем вытягивать информацию о столе. Большая часть информации хранится в дилерском окне. Из него мы можем узнать все участников за столом, кто зашел, кто вышел со стола, кто сделал какое действие, карты на столе и свои карты. Для этого нам понадобится парсер текста, как его писать рассказывать не буду, это отдельная тема, главное что идея ясна J. Но перед парсером нам нужно сначала найти элементы окна, и среди них найти дилерское окошко. Очень часто дилерское окно это класс производный от Internet Explorer_Server, чтобы его найти воспользуемся функцией EnumChildWindows, а затем GetClassName.
EnumChildWindows перечисляет дочерние окна, которые принадлежат определенному родительскому окну, в свою очередь, передавая дескриптор каждого дочернего окна в функцию повторного вызова, определяемую программой. Функция EnumChildWindows работает до тех пор, пока не будет перечислено последнее дочернее окно или функция повторного вызова не возвратит значение ЛОЖЬ (FALSE).
Параметры:
hWndParent — идентифицирует родительское окно, чьи дочерние окна должны перечисляться.
lpEnumFunc — указывает на определяемую программой функцию повторного вызова. Для получения дополнительной информации относительно функции повторного вызова, см. функцию повторного вызова EnumChildProc.
lParam — устанавливает 32-разрядное, определяемое программой значение, которое будет передано в функцию повторного вызова.
Возвращаемые значения: если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение — ноль.
Теперь можно приступать и к парсингу текста. Наш ход или нет можно анализировать исходя из того какие кнопки доступны нам в данный момент. Это можно сделать как через ресурсы так и и просто по точкам на экране в этом окне. Далее если наш ход то передаем известные данные в блок принятия решения. При получении ответа делаем соответствующее действие. В этой части еще не рассмотрено как нажимать на кнопки, но это думаю и сами осилите.
Блок 2 — блок принятия решения
Этот блок, сердце всего бота, т.к. от него зависит насколько он успешен в игре, насколько правильные принимает решения. В журнале Хакер 137 от 06.2010 рассматривался пример полностью опирающийся на теорию вероятности и это хорошо, но чтобы получить достаточно достоверный результат надо провести достаточно много итераций. Чтобы играть достаточно уверенно против противника мы должны знать его диапазон и как он играет(это кусок привязан к статистике), так же есть определенные стратегии игры, зависящие от количества денег у вас, от количества игроков за столом, и самой стратегии игры. От всего этого зависит стартовый диапазон рук, и действия на последующих улицах, например человек играющий по стратегии коротких стеков (SSS) редко делает какие то ходы на ривере (когда выложена 5 карта на стол), т.к. к этому моменту он часто уже в Аллине (пошел в ва-банк). Оценка ситуаций так же идет в подсчете аутов, ауты это количество карт, которое улучшит наше положение на последующих улицах, отсюда вытекаю такие комбинации как стрит дро, стрит в дырку, флэшь дро и т.д. Дро это тоже комбинация и в зависимости от количества аутов имеет цену.И имея определенную комбинацию, даже в данный момент не победную, мы уже строим линию игры. Благодаря этим дополнительным данным мы уже можем принимать решения в зависимости от выбранной стратегии, если добавить поверх еще статистику игрока они будут еще точнее, а при добавлении полного просчета эту выборку еще можно дополнить. Надеюсь донес свою мысль о сокращении выборок и принятия решений, все это складывается на личном опыте игры и принятия решения, т.к. в несколько предложений не расскажешь теории игры в покер, которая издается во многих томах, о разных ситуациях, который бесчисленное множество, хотя можно и выделить по основным группам…
Сначала нам надо узнать ситуацию на столе, и узнать какая комбинация у нас имеется. Вот пример кода определения комбинации(переписал более понятно, но может не оптимально):
В итоге в соответствующих переменных мы имеем данные о текущем положении дел. При чем заметьте понятия как фул хауз нету, это производная из пара и трипс или сет. Тут еще нужен кусок который определяет готовность руки, т.е. готовая, не готовая, полуготовая. Например такой код:
Исходя из этих данных идем к части, которая получает статистику об оппонентах, расчеты о шансах банка и другие необходимые, принимаем решение о действии и переходим к первому блоку – выполнить действие.
Блок 3 — блок сбора статистики
Это немаловажный блок, помогающий в принятии решений, вы можете как сами собирать статистику, как воспользоваться сторонними программами. Я опишу пример запроса к PokerTracker3, программа для сбора и анализа статистики игры, параметров в программе более 100, но нам хотя бы для примера достаточно и нескольких основных. В PokerTracker3 база хранится в Postges базе. Пример запроса:
На выходе получим по определенному игроку выборку, сайтов на которых такой ник имеется в базе, можно сократить по нашему сайту только, количество рук оппонента (нужна для точности показаний), VPIP(% рук с которыми заходит в игру), PFR (preflop raise –префлоп рейз ), ATS (attemptto steel – сколько крадет блайндов на префлопе), CBET (c-bet on flop – ставка в продолжение на флопе),BBS (big blind steel –кража большого блайнда ), SBS (small blind steel – кража малого блайнда). Эти параметры в основном используются при расширенной стратегии коротких стеков, для полных стеков этих параметров мало, но в качестве примера как их получить хватит. Для чего все эти параметры нужны и как их использовать советую почитать соответствующие ресурсы.
После того как мы получили дополнительную статистику переходим ко второму блоку и корректируем наше решение об игре.
В заключение.
На написание этой статьи подвинули статьи из журнала Хакер 137 от 06.2010 «Натягиваем сетевые poker room’ы» и Хакер 139 от 08.2010 «Симуляция покерного оргазма». Так как с автором я не полностью согласен и тему считаю полностью не раскрытой и хотелось поделиться своим мнением.
Как научиться играть в покер с нуля дома
Число поклонников покера постоянно растет. Чтобы добиться успеха, нужно научиться играть в покер, как минимум выучить правила, выигрышные комбинации и трезво оценивать свои возможности. И на этом работа не прекращается, т.к. мастерство приходит вместе с опытом. Для игры необходима стратегия, которая приведет к победе.
Что такое покер
Игра существует более 400 лет, впервые о ней узнали в Европе. Теперь покер считается национальной игрой США. Постоянно проходят международные турниры и местные игры. Профессиональный игрок может получать хорошие деньги на своем хобби.
Покер считают азартной игрой. Хотя его можно отнести к спорту, т.к. выигрыш больше зависит от мастерства участника, а не от удачи.
Начиная освоение азов игры, новичкам следует разобраться с основной целью игры:
Как и на соревнованиях по бегу, прыжкам, перед покерной сессией игроку требуется специальная разминка, которая включает в себя медитацию, небольшой комплекс физических упражнений. В течение этого времени продумывается общая стратегия игры, определяется ее конечная цель. Опытные игроки выполняют разминку механически.
Терминология
Сложность у новичков вызывают покерные термины. Их довольно сложно освоить с нуля, особенно если вы играете самостоятельно дома. Но во время игр они автоматически запоминаются. Их не так много, но значение каждого необходимо запомнить.
Полный список терминов можно найти в специальной литературе. Незнание какого-либо из них способно привести к проигрышу. Быстрее значение понятий можно запомнить, если встречать их постоянно, поэтому на пользу пойдет общение с людьми, которые увлечены покером. Играют многие, причем самых разных возрастов.
Существует специальный покерный словарь, с ознакомления с которым начинается обучение.
Например, термином анте называют небольшую обязательную ставку в начале процесса, осуществить которую предписывают правила игры в покер. Бэкдором является комбинация, для завершения которой нужны еще две карты – терн и ривер.
Все эти термины необходимо заучивать, т.к. без этого невозможно будет понять, о чем идет речь во время игры.
При обучении рекомендуется запоминать названия в алфавитном порядке. Большинство терминов в покере пришло из английского языка и непривычно звучит для русского человека. Поэтому на первом этапе освоения игры требуется их механическое запоминание.
Особенности покерной колоды
Для игры в покер используется разное количество карт:
С какой колодой играть, каждый решает для себя сам.
Описание комбинаций карт
От комбинаций карт в покере зависит весь ход игры. Их требуется знать наизусть. Хороший результат запоминания и понимания выявит лишь практика.
Как научиться играть в покер профессионально
Опытным игроком в покер невозможно стать, лишь изучив досконально теорию. Важной частью подготовки профессионала является накопление опыта. Причем профессиональность определяется не по количеству выигранных сумм, а по подходу к игре.
Вся база знаний, которую с трудом постигают новички, у опытного игрока вбита в подсознание. Превращение из любителя в мастера требует упорного труда и большого количества игр за плечами. Учиться играть в покер с нуля лучше с профессионалами, которые укажут на ошибки.
С чего начать обучение
Хорошее знание правил в игре является важной составляющей частью победы. Перед началом практики их необходимо выучить досконально.
Самым важным разделом теории покера является знание существующих комбинаций. При поверхностном изучении правил (чем грешат многие новички) невозможно разработать свою стратегию, разобраться в аспектах игры и просчитать действия соперников.
Начинать изучение классического покера необходимо:
Важным фактором успеха является разумное сочетание практики с теорией. Поэтому обучение разумно начинать на тех столах, где нет денежных ставок. В этом случае полностью будет отсутствовать такой фактор, как денежные риски. Фишки в данной игре также являются условными.
Правила классического покера
К классическим видам покера относят в первую очередь техасский холдем. Он является наиболее простым и распространенным видом игры.
Главным правилом покера является то, что весь банк забирает игрок, имеющий наивысшую комбинацию. Таких может быть образовано 10, и все они регламентированы правилами.
Для игры в классический покер должны быть соблюдены следующие условия:
Раздавать карту должен дилер – в игорных заведениях эта роль отводится крупье, а в домашних условиях игроки сами выбирают, кто из них займет эту должность. В его обязанности входит тасовка карт и их раздача.
Торговля
Ход торговли полностью определяется правилами и имеет свои особенности. Используются следующие термины:
Торговля заканчивается, когда каждый человек, присутствующий за столом, или сделает ставку, или сбросит карты.
Как правильно торговаться
Ставки, сделанные нерационально, могут привести к проигрышу еще на первых этапах игры. Каждая новая ставка должна вести к победе и не стать причиной большого проигрыша при неправильно выбранной стратегии. Ставки – это инструмент давления на соперников, профессиональный игрок часто манипулирует сознанием других. При грамотном выставлении ставок противники будут сбрасывать карты в ходе игры.
Считается, что лучшие игроки в покер могут лишь по поведению противников и их ставкам выстроить стратегию игры, ведущую к победе.
В то же время покер относят к играм с повышенным риском. Без этого партия не может быть выиграна. Пассивная тактика приводит к потерям даже при наличии хороших карт.
В каких ситуациях разумно повышать ставку
Повышать ставки лучше при наличии на руках неплохих комбинаций. Такое поведение заставляет оппонентов нервничать и совершать ошибки. В то же время каждая ставка должна иметь цель:
Опытные игроки не советуют новичкам делать ставки, превышающие трех больших блайндов.
Ход игры
В условиях классического покера имеется такое понятие, как флоп, который обозначает наличие трех общих открытых карт на столе. По их комбинации определяется вся стратегия игры.
В позиции после завершения игрового раунда соперничество продолжается при условии, что осталось более одного участника. На игровой стол, в соответствии с правилами игры, добавляется еще одна общая карта, ее называют терном. Как и при флопе, после сдачи терна проводится еще один круг торговли.
Если после произошедшей раздачи остаются 2 и более игроков, добавляется еще одна карта – ривер. После него следует очередной этап торгов. Затем происходит открытие карт.
По правилам классического покера все возможные комбинации создаются с учетом двух закрытых и пяти открытых карт на столе.
Вот и все правила игры в покер, которые стоит знать. Остальное уже нарабатывается с опытом.
Ошибки новичков
Среди типичных ошибок, совершаемых новичками, называют участие в максимально большем числе раздач. Причиной такого поведения является полное отсутствие опыта и желание наиграться.
Еще одной проблемой становится отсутствие своего виденья игры. В этом случае ходы не обдумываются, а совершаются под влиянием момента. Игрок действует на нервах и ждет прихода выигрышной комбинации карт. Такие игроки руководствуются принципом: если оппонент в игре проявляет агрессию, значит, имеет на руках выигрышную комбинацию.
Также в самом начале при обучении сложно определить идеальный размер ставки. Для новичков характерно устанавливать суммы, в 5 раз превышающие блайнды. Такое поведение является нерациональным, т.к. удается сделать либо одну, либо 2 ставки. Каждая из них должна свести потери к минимуму и максимально увеличивать возможный выигрыш.
Избежать подобного поможет лишь опыт, который растет от одной игры к другой. Научиться хорошо играть в покер быстро невозможно. В то же время уровень чайника будет не всегда, по мере роста опыта придет и умение. Бесплатный курс поможет лишь на первых шагах обучения. На более высокие уровни лучше переходить, имея хорошего учителя.
Как научиться выигрывать в покер
О том, чтобы выигрывать в покер постоянно, мечтают все начинающие игроки, даже если собрались совсем неудачные карты. Но так не бывает. Об этом заявляют и профессионалы, которые тоже проигрывают. При таком раскладе карт важно не выиграть, а свести проигрыш к минимуму и уже в следующей партии возместить потери и получить прибыль.
Научиться играть в покер с нуля самостоятельно возможно, но это требует от новичка терпения и постоянной практики. Такая игра, как покер, научиться играть в которую несложно, требует уделять много времени практике. Поэтому любителей игры много, а настоящих профессионалов мало.
Где играть
Существует множество возможностей подобрать для себя подходящих соперников. Помимо практики, должен постоянно проходить разбор сыгранных партий и поиск возможных ошибок. Необходимо вначале играть ради удовольствия и лишь потом – ради заработка и престижа. Обучение с нуля дома лучше начинать с запоминания теории, постепенно переходя к практике. Бесплатно научиться играть в покер можно, т.к. имеется большое количество видеоуроков и книг по этой теме, позволяющих изучить материал самостоятельно.
Вы можете выучить правила и теорию об игре за один вечер, но уйдет несколько месяцев, чтобы научиться играть в покер как профессионал. Существует слишком много нюансов, схем, тактик и подводных камней, которые вы должны познать самостоятельно. В конце концов какая азартная игра обходится без риска?