Uma biblioteca de avaliação de mãos de pôquer em Python puro
[ 3 ❤ ] , [ 3 ♠ ]
$ pip install treys
Treys é uma versão Python 3 do Deuces. A maior parte do trabalho é retirada do garfo de msaindon.
Treys (originalmente Deuces) foi escrito por Will Drevo para a competição MIT Pokerbots. É leve e rápido. Todas as pesquisas são feitas com pesquisas aritméticas e de dicionário. Dito isso, Treys não superará uma implementação C (~250k avaliação/s), mas é útil para situações em que Python é necessário ou onde os bots recebem um tempo de pensamento razoável (escala de tempo humano).
Treys lida com pesquisas de mãos de 5, 6 e 7 cartas. As pesquisas de 6 e 7 cartas são feitas avaliando combinatoriamente as 5 opções de cartas.
Treys é fácil de configurar e usar.
>> > from treys import Card
>> > card = Card . new ( 'Qh' )
Os objetos de cartão são representados como números inteiros para manter o desempenho e a leveza do Treys.
Agora vamos criar o tabuleiro e um exemplo de mão de Texas Hold'em:
>> > board = [
>> > Card . new ( 'Ah' ),
>> > Card . new ( 'Kd' ),
>> > Card . new ( 'Jc' )
>> > ]
>> > hand = [
>> > Card . new ( 'Qs' ),
>> > Card . new ( 'Th' )
>> > ]
Imprima os números inteiros do cartão no terminal:
>>> Card.print_pretty_cards(board + hand)
[ A ❤ ] , [ K ♦ ] , [ J ♣ ] , [ Q ♠ ] , [ T ❤ ]
Se você tiver termacolor
instalado, eles também serão coloridos.
Caso contrário, vá direto para a avaliação da força da sua mão:
>> > from treys import Evaluator
>> > evaluator = Evaluator ()
>> > print ( evaluator . evaluate ( board , hand ))
1600
A força da mão é avaliada em uma escala de 1 a 7.462, onde 1 é um Royal Flush e 7.462 é um 7-5-4-3-2 inadequado, já que existem apenas 7.642 mãos com classificações distintas no pôquer. Mais uma vez, consulte a postagem do meu blog para uma explicação matematicamente mais completa de por que isso acontece.
Se quiser distribuir cartas aleatoriamente de um baralho, você também pode fazer isso com Treys:
>> > from treys import Deck
>> > deck = Deck ()
>> > board = deck . draw ( 5 )
>> > player1_hand = deck . draw ( 2 )
>> > player2_hand = deck . draw ( 2 )
e imprima-os:
>>> 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 ❤ ]
Vamos avaliar a força de ambas as mãos e, em seguida, dividi-las em classes, uma para cada tipo de mão (carta alta, par, etc.)
>> > 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 )
ou obtenha uma string amigável para descrever a pontuação,
>>> 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)
ou, o mais legal de tudo, faça uma análise passo a passo das etapas do jogo em relação à força das mãos:
>>> 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
Direitos autorais (c) 2013 Will Drevo
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e/ou vender cópias do Software e permitir que as pessoas a quem o Software seja fornecido o façam, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão serão incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.