Как забить все руки в техасском холдеме

Если у вас есть некоторый опыт игры в покер, вы, вероятно, знаете, что существует 2 598 960 различных рук, которые можно собрать, выполнив 5 комбинаций карт из колоды из 52 карт.

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

Прежде всего, нам нужно собрать нашу колоду из 52 карт. Это так же просто, как создать два списка (один с 4 мастями, а другой с числами от 2 до 14) и объединить их следующим образом:

Теперь давайте создадим функцию, которая возвращает все возможные комбинации из 5 карт с учетом того, что порядок в покере не имеет значения. Я сделаю это, используя библиотеку itertools вместе с Numpy fromiter, которая позволяет создавать массив из нашего списка комбинаций itertools. Как вы, наверное, знаете, массивы Numpy быстрее списков Python:

Хорошо, до сих пор это было довольно просто. Мы создали все возможные руки, но теперь нам нужно реализовать систему, чтобы оценивать эти руки в соответствии со всеми правилами покера.

Я уверен, что есть много способов сделать это, поэтому я просто придумал свой: я даю оценки от 0 до 135. Это так, потому что в покере есть 10 разных типов рук и 14 разных чисел в каждой масти, поэтому оценки выглядят так:

Тип руки → Оценка

Высокая карта → от 0 до 14

Пара → от 15 до 29

Две пары → от 30 до 44

3 вида → с 45 на 59

Прямой → 60 на 74

Промывка → от 75 до 89

Фул-хаус → с 90 на 104

Четверка → 105 к 1

Стрит-флеш → от 120 до 134

Роял Флеш → 135

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

Это мои маленькие функции:

Отлично, поэтому с помощью этих функций мы уже можем создать нашу окончательную функцию подсчета очков.

Сначала он проверит, есть ли в руке 5 одномастных карт, если это правда, он перейдет к определению, с каким именно типом руки мы имеем дело, а затем присвоит ему оценку.

Если в руке нет 5 одномастных карт, функция проверяет номера карт. Он проверяет, сколько раз повторяется каждое число, определяет тип руки, а затем снова дает оценку руке.

Функция такая:

Круто, теперь мы можем забить любую возможную комбинацию в покере.

Давайте запустим уже написанный код и несколькими руками проверим, работает ли он:

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

На данный момент имеет смысл использовать ВСЕ! и забей все возможные руки в Покере

Давайте объединим функции, которые мы создали до сих пор, и добавим еще одну функцию, которая создает список со всеми руками и их значениями оценок, отсортированными так, чтобы он выглядел лучше:

И вуаля! Наконец-то мы подсчитали и отсортировали результаты всех наших рук в красивом фрейме данных Pandas:

Если вы хотите загрузить полный код моего скрипта, вы можете найти мое репозиторий на GitHub здесь.

Эти данные очень полезны для игрока в покер, так как теперь мы можем видеть частоту каждого типа рук.

Ниже приведены шансы получить каждую руку:

  • флеш-рояль = 0,000154%
  • стрит-флеш = 0,00139%
  • каре = 0,024%
  • фулл-хаус = 0,1441%
  • промывка = 0,1965%
  • прямой = 0,3925%
  • тройка = 2,1118%
  • две пары = 4,7539%
  • пара = 42,2569%
  • высокая карта = 50,1177%

Другими словами, шансы получить пару или высокую карту составляют 92,3746%, а шансы получить стрит или больше - всего 0,7597%.

Пока это было хорошо.

Теперь самое интересное в том, что мы можем использовать наши оценки для создания калькулятора ожидаемого значения Python.

В моей следующей статье я покажу вам, как именно это сделать.

Нам просто нужно будет ввести наши карты, размер банка, количество игроков и цену ставок. Затем он решит, следует ли нам коллировать, повысить или сбросить карты, а также определит размер ставки.

Надеюсь, вам понравилось. Удачного кодирования!