Библиотека оценки покерных комбинаций на чистом Python
[ 3 ❤ ] , [ 3 ♠ ]
$ pip install treys
Treys — это порт Deuces на Python 3. Большая часть работы взята из форка msaindon.
Treys (первоначально Deuces) был написан Уиллом Древо для конкурса MIT Pokerbots. Он легкий и быстрый. Все поиски выполняются с помощью битовой арифметики и поиска по словарю. Тем не менее, Treys не превзойдет реализацию C (~ 250 тыс. оценок в секунду), но он полезен в ситуациях, когда требуется Python или когда ботам выделяется разумное время на размышление (человеческая шкала времени).
Treys обрабатывает поиск комбинаций из 5, 6 и 7 карт. Поиск по 6 и 7 картам осуществляется путем комбинаторной оценки выбора из 5 карт.
Treys прост в настройке и использовании.
>> > from treys import Card
>> > card = Card . new ( 'Qh' )
Объекты карточек представлены в виде целых чисел, чтобы обеспечить производительность и легкость Treys.
Теперь давайте создадим доску и пример руки в Техасском Холдеме:
>> > board = [
>> > Card . new ( 'Ah' ),
>> > Card . new ( 'Kd' ),
>> > Card . new ( 'Jc' )
>> > ]
>> > hand = [
>> > Card . new ( 'Qs' ),
>> > Card . new ( 'Th' )
>> > ]
Симпатичная печать целых чисел карты на терминале:
>>> Card.print_pretty_cards(board + hand)
[ A ❤ ] , [ K ♦ ] , [ J ♣ ] , [ Q ♠ ] , [ T ❤ ]
Если у вас установлен termacolor
, они тоже будут окрашены.
В противном случае сразу переходите к оценке силы вашей руки:
>> > from treys import Evaluator
>> > evaluator = Evaluator ()
>> > print ( evaluator . evaluate ( board , hand ))
1600
Сила руки оценивается по шкале от 1 до 7462, где 1 — это флеш-рояль, а 7462 — разномастная комбинация 7-5-4-3-2, поскольку в покере всего 7642 руки с определенным рейтингом. Еще раз обратитесь к моему сообщению в блоге за более математически полным объяснением того, почему это так.
Если вы хотите случайным образом раздавать карты из колоды, вы также можете сделать это с помощью Трея:
>> > from treys import Deck
>> > deck = Deck ()
>> > board = deck . draw ( 5 )
>> > player1_hand = deck . draw ( 2 )
>> > player2_hand = deck . draw ( 2 )
и распечатайте их:
>>> Card.print_pretty_cards(board)
[ 4 ♣ ] , [ A ♠ ] , [ 5 ♦ ] , [ K ♣ ] , [ 2 ♠ ]
>>> Card.print_pretty_cards(player1_hand)
[ 6 ♣ ] , [ 7 ❤ ]
>>> Card.print_pretty_cards(player2_hand)
[ A ♣ ] , [ 3 ❤ ]
Давайте оценим силу обеих рук, а затем разделим их на классы, по одному для каждого типа руки (старшая карта, пара и т. д.).
>> > p1_score = evaluator . evaluate ( board , player1_hand )
>> > p2_score = evaluator . evaluate ( board , player2_hand )
>> > p1_class = evaluator . get_rank_class ( p1_score )
>> > p2_class = evaluator . get_rank_class ( p2_score )
или получите удобную для пользователя строку для описания оценки,
>>> print("Player 1 hand rank = %d (%s)n" % (p1_score, evaluator.class_to_string(p1_class)))
Player 1 hand rank = 6330 (High Card)
>>> print("Player 2 hand rank = %d (%s)n" % (p2_score, evaluator.class_to_string(p2_class)))
Player 2 hand rank = 1609 (Straight)
или, что самое крутое, получить детальный анализ этапов игры в зависимости от силы рук:
>>> hands = [player1_hand, player2_hand]
>>> evaluator.hand_summary(board, hands)
========== FLOP ==========
Player 1 hand = High Card, percentage rank among all hands = 0.893192
Player 2 hand = Pair, percentage rank among all hands = 0.474672
Player 2 hand is currently winning.
========== TURN ==========
Player 1 hand = High Card, percentage rank among all hands = 0.848298
Player 2 hand = Pair, percentage rank among all hands = 0.452292
Player 2 hand is currently winning.
========== RIVER ==========
Player 1 hand = High Card, percentage rank among all hands = 0.848298
Player 2 hand = Straight, percentage rank among all hands = 0.215626
========== HAND OVER ==========
Player 2 is the winner with a Straight
Copyright (c) 2013 Уилл Древо
Настоящим бесплатно любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), предоставляется разрешение на работу с Программным обеспечением без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.