Una biblioteca de evaluación de manos de póquer pura en Python
[ 3 ❤ ] , [ 3 ♠ ]
$ pip install treys
Treys es una versión Python 3 de Deuces. La mayor parte del trabajo se toma de la bifurcación de msaindon.
Treys (originalmente Deuces) fue escrito por Will Drevo para la competencia MIT Pokerbots. Es ligero y rápido. Todas las búsquedas se realizan con aritmética de bits y búsquedas de diccionario. Dicho esto, Treys no superará una implementación de C (~250k eval/s) pero es útil para situaciones donde se requiere Python o donde a los bots se les asigna un tiempo de pensamiento razonable (escala de tiempo humana).
Treys maneja búsquedas de manos de 5, 6 y 7 cartas. Las búsquedas de 6 y 7 cartas se realizan evaluando combinatoriamente las 5 opciones de cartas.
Treys es fácil de configurar y usar.
>> > from treys import Card
>> > card = Card . new ( 'Qh' )
Los objetos de tarjeta se representan como números enteros para mantener a Treys eficiente y liviano.
Ahora creemos el tablero y una mano de ejemplo de Texas Hold'em:
>> > board = [
>> > Card . new ( 'Ah' ),
>> > Card . new ( 'Kd' ),
>> > Card . new ( 'Jc' )
>> > ]
>> > hand = [
>> > Card . new ( 'Qs' ),
>> > Card . new ( 'Th' )
>> > ]
Bastante imprimir números enteros de la tarjeta al terminal:
>>> Card.print_pretty_cards(board + hand)
[ A ❤ ] , [ K ♦ ] , [ J ♣ ] , [ Q ♠ ] , [ T ❤ ]
Si tienes instalado termacolor
, también se colorearán.
De lo contrario, pasa directamente a evaluar la fuerza de tu mano:
>> > from treys import Evaluator
>> > evaluator = Evaluator ()
>> > print ( evaluator . evaluate ( board , hand ))
1600
La fuerza de la mano se valora en una escala del 1 al 7462, donde 1 es una Escalera Real y 7462 es un 7-5-4-3-2 inadecuado, ya que sólo hay 7642 manos claramente clasificadas en el póquer. Una vez más, consulte la publicación de mi blog para obtener una explicación matemática más completa de por qué esto es así.
Si quieres repartir cartas al azar de un mazo, también puedes hacerlo con Treys:
>> > from treys import Deck
>> > deck = Deck ()
>> > board = deck . draw ( 5 )
>> > player1_hand = deck . draw ( 2 )
>> > player2_hand = deck . draw ( 2 )
e imprimirlos:
>>> 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 ❤ ]
Evaluaremos la fuerza de ambas manos y luego las agruparemos en clases, una para cada tipo de mano (Carta alta, Pareja, 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 )
u obtenga una cadena amigable para los humanos para describir la partitura,
>>> 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)
O, lo mejor de todo, obtener un análisis paso a paso de las etapas del juego en relación con la fuerza de la mano:
>>> 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 Will Drevo
Por el presente se otorga permiso, sin cargo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para operar con el Software sin restricciones, incluidos, entre otros, los derechos de uso, copia, modificación, fusión. , publicar, distribuir, sublicenciar y/o vender copias del Software, y permitir que las personas a quienes se les proporciona el Software lo hagan, sujeto a las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.