Une bibliothèque d'évaluation de mains de poker purement Python
[ 3 ❤ ] , [ 3 ♠ ]
$ pip install treys
Treys est un portage Python 3 de Deuces. La majeure partie du travail provient de la fourchette de msaindon.
Treys (à l'origine Deuces) a été écrit par Will Drevo pour le concours MIT Pokerbots. Il est léger et rapide. Toutes les recherches sont effectuées avec des recherches arithmétiques sur bits et dans le dictionnaire. Cela dit, Treys ne battra pas une implémentation C (~ 250 000 évaluations/s), mais il est utile dans les situations où Python est requis ou où les robots disposent d'un temps de réflexion raisonnable (échelle de temps humaine).
Treys gère les recherches de mains de 5, 6 et 7 cartes. Les recherches de 6 et 7 cartes sont effectuées en évaluant de manière combinatoire les 5 choix de cartes.
Treys est facile à configurer et à utiliser.
>> > from treys import Card
>> > card = Card . new ( 'Qh' )
Les objets cartes sont représentés sous forme d'entiers pour que Treys reste performant et léger.
Créons maintenant le tableau et un exemple de main de Texas Hold'em :
>> > board = [
>> > Card . new ( 'Ah' ),
>> > Card . new ( 'Kd' ),
>> > Card . new ( 'Jc' )
>> > ]
>> > hand = [
>> > Card . new ( 'Qs' ),
>> > Card . new ( 'Th' )
>> > ]
Jolie impression des entiers de la carte sur le terminal :
>>> Card.print_pretty_cards(board + hand)
[ A ❤ ] , [ K ♦ ] , [ J ♣ ] , [ Q ♠ ] , [ T ❤ ]
Si termacolor
est installé, ils seront également colorés.
Sinon, passez directement à l’évaluation de la force de votre main :
>> > from treys import Evaluator
>> > evaluator = Evaluator ()
>> > print ( evaluator . evaluate ( board , hand ))
1600
La force des mains est évaluée sur une échelle de 1 à 7 462, où 1 correspond à une quinte flush royale et 7 462 à un 7-5-4-3-2 inadapté, car il n'y a que 7 642 mains distinctement classées au poker. Encore une fois, reportez-vous à mon article de blog pour une explication plus mathématiquement complète des raisons pour lesquelles il en est ainsi.
Si vous souhaitez distribuer les cartes au hasard dans un jeu, vous pouvez également le faire avec Treys :
>> > from treys import Deck
>> > deck = Deck ()
>> > board = deck . draw ( 5 )
>> > player1_hand = deck . draw ( 2 )
>> > player2_hand = deck . draw ( 2 )
et imprimez-les :
>>> 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 ❤ ]
Évaluons la force des deux mains, puis regroupons-les en classes, une pour chaque type de main (High Card, Paire, 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 obtenez une chaîne conviviale pour décrire la partition,
>>> 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, le plus cool de tous, obtenez une analyse coup par coup des étapes du jeu en relation avec la force de la main :
>>> 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
L'autorisation est accordée par la présente, gratuitement, à toute personne obtenant une copie de ce logiciel et des fichiers de documentation associés (le « Logiciel »), d'utiliser le Logiciel sans restriction, y compris, sans limitation, les droits d'utilisation, de copie, de modification, de fusion. , publier, distribuer, accorder des sous-licences et/ou vendre des copies du Logiciel, et permettre aux personnes à qui le Logiciel est fourni de le faire, sous réserve des conditions suivantes :
L'avis de droit d'auteur ci-dessus et cet avis d'autorisation doivent être inclus dans toutes les copies ou parties substantielles du logiciel.
LE LOGICIEL EST FOURNI « TEL QUEL », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS MAIS SANS LIMITATION LES GARANTIES DE QUALITÉ MARCHANDE, D'ADAPTATION À UN USAGE PARTICULIER ET DE NON-VIOLATION. EN AUCUN CAS LES AUTEURS OU LES TITULAIRES DES DROITS D'AUTEUR NE SERONT RESPONSABLES DE TOUTE RÉCLAMATION, DOMMAGES OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS UNE ACTION CONTRACTUELLE, DÉLIT OU AUTRE, DÉCOULANT DE, DE OU EN RELATION AVEC LE LOGICIEL OU L'UTILISATION OU D'AUTRES TRANSACTIONS DANS LE LOGICIEL.