Как забить все руки в техасском холдеме
Если у вас есть некоторый опыт игры в покер, вы, вероятно, знаете, что существует 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.
В моей следующей статье я покажу вам, как именно это сделать.
Нам просто нужно будет ввести наши карты, размер банка, количество игроков и цену ставок. Затем он решит, следует ли нам коллировать, повысить или сбросить карты, а также определит размер ставки.
Надеюсь, вам понравилось. Удачного кодирования!