PokerKit est une bibliothèque de logiciels open source, écrite en Python pur, permettant de simuler des jeux, d'évaluer des mains et de faciliter l'analyse statistique, développée par le groupe de recherche étudiant sur le poker informatique de l'Université de Toronto. PokerKit prend en charge une large gamme de variantes de poker et fournit une architecture flexible permettant aux utilisateurs de définir leurs jeux personnalisés. Ces fonctionnalités sont exposées via une API programmatique intuitive et unifiée de haut niveau. La bibliothèque peut être utilisée dans une variété de cas d'utilisation, du développement de l'IA de poker à la création d'outils, en passant par la mise en œuvre d'un casino de poker en ligne. La fiabilité de PokerKit a été établie grâce à une vérification de type statique, des doctests approfondis et des tests unitaires, atteignant une couverture de code de 99 %.
La bibliothèque PokerKit nécessite Python version 3.11 ou supérieure et peut être installée en utilisant pip :
pip install pokerkit
Des exemples d'utilisation de PokerKit sont présentés ci-dessous.
Ci-dessous montre la main à 4 points entre Phil Hellmuth et le Loose Cannon Ernest Wiggins.
Lien : https://youtu.be/cnjJv7x0HMY?si=4l05Ez7lQVczt8DI&t=638
Notez que les stacks de départ pour certains joueurs sont définis sur math.inf
car ils ne sont pas mentionnés.
from math import inf
from pokerkit import Automation , Mode , NoLimitTexasHoldem
state = NoLimitTexasHoldem . create_state (
# Automations
(
Automation . ANTE_POSTING ,
Automation . BET_COLLECTION ,
Automation . BLIND_OR_STRADDLE_POSTING ,
Automation . HOLE_CARDS_SHOWING_OR_MUCKING ,
Automation . HAND_KILLING ,
Automation . CHIPS_PUSHING ,
Automation . CHIPS_PULLING ,
),
False , # Uniform antes?
{ - 1 : 600 }, # Antes
( 200 , 400 , 800 ), # Blinds or straddles
400 , # Min-bet
( inf , 116400 , 86900 , inf , 50000 , inf ), # Starting stacks
6 , # Number of players
mode = Mode . CASH_GAME ,
)
Vous trouverez ci-dessous les transactions et actions pré-flop.
state . deal_hole ( 'JsTh' ) # Tony G
state . deal_hole ( 'Ah9d' ) # Hellmuth
state . deal_hole ( 'KsKc' ) # Wiggins
state . deal_hole ( '5c2h' ) # Negreanu
state . deal_hole ( '6h5h' ) # Brunson
state . deal_hole ( '6s3s' ) # Laak
state . fold () # Negreanu
state . complete_bet_or_raise_to ( 2800 ) # Brunson
state . fold () # Laak
state . check_or_call () # Tony G
state . complete_bet_or_raise_to ( 12600 ) # Hellmuth
state . check_or_call () # Wiggins
state . check_or_call () # Brunson
state . check_or_call () # Tony G
Vous trouverez ci-dessous les distributions et les actions du flop.
state . burn_card ( '??' )
state . deal_board ( '9hTs9s' )
state . check_or_call () # Tony G
state . complete_bet_or_raise_to ( 17000 ) # Hellmuth
state . complete_bet_or_raise_to ( 36000 ) # Wiggins
state . fold () # Brunson
state . fold () # Tony G
state . complete_bet_or_raise_to ( 103800 ) # Hellmuth
state . check_or_call () # Wiggins
Vous trouverez ci-dessous la sélection du nombre de sorties.
state . select_runout_count ( 4 ) # Hellmuth
state . select_runout_count ( None ) # Wiggins
Ci-dessous, le premier runout.
state . burn_card ( '??' )
state . deal_board ( 'Jh' ) # Turn
state . burn_card ( '??' )
state . deal_board ( 'Ad' ) # River
Ci-dessous, le deuxième runout.
state . burn_card ( '??' )
state . deal_board ( 'Kh' ) # Turn
state . burn_card ( '??' )
state . deal_board ( '3c' ) # River
Ci-dessous se trouve le troisième runout.
state . burn_card ( '??' )
state . deal_board ( '7s' ) # Turn
state . burn_card ( '??' )
state . deal_board ( '8s' ) # River
Ci-dessous se trouve le quatrième runout.
state . burn_card ( '??' )
state . deal_board ( 'Qc' ) # Turn
state . burn_card ( '??' )
state . deal_board ( 'Kd' ) # River
Vous trouverez ci-dessous les piles finales.
print ( state . stacks ) # [inf, 79400, 149700, inf, 37400, inf]
Ci-dessous, le premier pot télévisé d'un million de dollars entre Tom Dwan et Phil Ivey.
Lien : https://youtu.be/GnxFohpljqM
Notez que la pile de départ de Patrik Antonius est définie sur math.inf
car elle n'est pas mentionnée.
from math import inf
from pokerkit import Automation , NoLimitTexasHoldem
state = NoLimitTexasHoldem . create_state (
# Automations
(
Automation . ANTE_POSTING ,
Automation . BET_COLLECTION ,
Automation . BLIND_OR_STRADDLE_POSTING ,
Automation . HOLE_CARDS_SHOWING_OR_MUCKING ,
Automation . HAND_KILLING ,
Automation . CHIPS_PUSHING ,
Automation . CHIPS_PULLING ,
),
True , # Uniform antes?
500 , # Antes
( 1000 , 2000 ), # Blinds or straddles
2000 , # Min-bet
( 1125600 , inf , 553500 ), # Starting stacks
3 , # Number of players
)
Vous trouverez ci-dessous les transactions et actions pré-flop.
state . deal_hole ( 'Ac2d' ) # Ivey
state . deal_hole ( '????' ) # Antonius
state . deal_hole ( '7h6h' ) # Dwan
state . complete_bet_or_raise_to ( 7000 ) # Dwan
state . complete_bet_or_raise_to ( 23000 ) # Ivey
state . fold () # Antonius
state . check_or_call () # Dwan
Vous trouverez ci-dessous les distributions et les actions du flop.
state . burn_card ( '??' )
state . deal_board ( 'Jc3d5c' )
state . complete_bet_or_raise_to ( 35000 ) # Ivey
state . check_or_call () # Dwan
Vous trouverez ci-dessous le tour de distribution et les actions.
state . burn_card ( '??' )
state . deal_board ( '4h' )
state . complete_bet_or_raise_to ( 90000 ) # Ivey
state . complete_bet_or_raise_to ( 232600 ) # Dwan
state . complete_bet_or_raise_to ( 1067100 ) # Ivey
state . check_or_call () # Dwan
Ci-dessous se trouve la rivière.
state . burn_card ( '??' )
state . deal_board ( 'Jh' )
Vous trouverez ci-dessous les piles finales.
print ( state . stacks ) # [572100, inf, 1109500]
Ci-dessous montre une main all-in entre Xuan et Phua.
Lien : https://youtu.be/QlgCcphLjaQ
from pokerkit import Automation , NoLimitShortDeckHoldem
state = NoLimitShortDeckHoldem . create_state (
# Automations
(
Automation . ANTE_POSTING ,
Automation . BET_COLLECTION ,
Automation . BLIND_OR_STRADDLE_POSTING ,
Automation . HOLE_CARDS_SHOWING_OR_MUCKING ,
Automation . HAND_KILLING ,
Automation . CHIPS_PUSHING ,
Automation . CHIPS_PULLING ,
),
True , # Uniform antes?
3000 , # Antes
{ - 1 : 3000 }, # Blinds or straddles
3000 , # Min-bet
( 495000 , 232000 , 362000 , 403000 , 301000 , 204000 ), # Starting stacks
6 , # Number of players
)
Vous trouverez ci-dessous les transactions et actions pré-flop.
state . deal_hole ( 'Th8h' ) # Badziakouski
state . deal_hole ( 'QsJd' ) # Zhong
state . deal_hole ( 'QhQd' ) # Xuan
state . deal_hole ( '8d7c' ) # Jun
state . deal_hole ( 'KhKs' ) # Phua
state . deal_hole ( '8c7h' ) # Koon
state . check_or_call () # Badziakouski
state . check_or_call () # Zhong
state . complete_bet_or_raise_to ( 35000 ) # Xuan
state . fold () # Jun
state . complete_bet_or_raise_to ( 298000 ) # Phua
state . fold () # Koon
state . fold () # Badziakouski
state . fold () # Zhong
state . check_or_call () # Xuan
Ci-dessous se trouve la distribution du flop.
state . burn_card ( '??' )
state . deal_board ( '9h6cKc' )
Ci-dessous se trouve le tour de distribution.
state . burn_card ( '??' )
state . deal_board ( 'Jh' )
Ci-dessous se trouve la rivière.
state . burn_card ( '??' )
state . deal_board ( 'Ts' )
Vous trouverez ci-dessous les piles finales.
print ( state . stacks ) # [489000, 226000, 684000, 400000, 0, 198000]
Vous trouverez ci-dessous le plus gros pot de poker en ligne jamais joué entre Patrik Antonius et Viktor Blom.
Lien : https://youtu.be/UMBm66Id2AA
from pokerkit import Automation , PotLimitOmahaHoldem
state = PotLimitOmahaHoldem . create_state (
# Automations
(
Automation . ANTE_POSTING ,
Automation . BET_COLLECTION ,
Automation . BLIND_OR_STRADDLE_POSTING ,
Automation . HOLE_CARDS_SHOWING_OR_MUCKING ,
Automation . HAND_KILLING ,
Automation . CHIPS_PUSHING ,
Automation . CHIPS_PULLING ,
),
True , # Uniform antes?
0 , # Antes
( 500 , 1000 ), # Blinds or straddles
1000 , # Min-bet
( 1259450.25 , 678473.5 ), # Starting stacks
2 , # Number of players
)
Vous trouverez ci-dessous les transactions et actions pré-flop.
state . deal_hole ( 'Ah3sKsKh' ) # Antonius
state . deal_hole ( '6d9s7d8h' ) # Blom
state . complete_bet_or_raise_to ( 3000 ) # Blom
state . complete_bet_or_raise_to ( 9000 ) # Antonius
state . complete_bet_or_raise_to ( 27000 ) # Blom
state . complete_bet_or_raise_to ( 81000 ) # Antonius
state . check_or_call () # Blom
Vous trouverez ci-dessous les distributions et les actions du flop.
state . burn_card ( '??' )
state . deal_board ( '4s5c2h' )
state . complete_bet_or_raise_to ( 91000 ) # Antonius
state . complete_bet_or_raise_to ( 435000 ) # Blom
state . complete_bet_or_raise_to ( 779000 ) # Antonius
state . check_or_call () # Blom
Ci-dessous se trouve le tour de distribution.
state . burn_card ( '??' )
state . deal_board ( '5h' )
Ci-dessous se trouve la rivière.
state . burn_card ( '??' )
state . deal_board ( '9c' )
Vous trouverez ci-dessous les piles finales.
print ( state . stacks ) # [1937923.75, 0.0]
Ci-dessous montre un bad beat entre Yockey et Arieh.
Lien : https://youtu.be/pChCqb2FNxY
from pokerkit import Automation , FixedLimitDeuceToSevenLowballTripleDraw
state = FixedLimitDeuceToSevenLowballTripleDraw . create_state (
# Automations
(
Automation . ANTE_POSTING ,
Automation . BET_COLLECTION ,
Automation . BLIND_OR_STRADDLE_POSTING ,
Automation . HOLE_CARDS_SHOWING_OR_MUCKING ,
Automation . HAND_KILLING ,
Automation . CHIPS_PUSHING ,
Automation . CHIPS_PULLING ,
),
True , # Uniform antes?
0 , # Antes
( 75000 , 150000 ), # Blinds or straddles
150000 , # Small-bet
300000 , # Big-bet
( 1180000 , 4340000 , 5910000 , 10765000 ), # Starting stacks
4 , # Number of players
)
Vous trouverez ci-dessous les transactions et actions pré-flop.
state . deal_hole ( '7h6c4c3d2c' ) # Yockey
state . deal_hole ( '??????????' ) # Hui
state . deal_hole ( '??????????' ) # Esposito
state . deal_hole ( 'AsQs6s5c3c' ) # Arieh
state . fold () # Esposito
state . complete_bet_or_raise_to () # Arieh
state . complete_bet_or_raise_to () # Yockey
state . fold () # Hui
state . check_or_call () # Arieh
Ci-dessous le premier tirage au sort et les actions.
state . stand_pat_or_discard () # Yockey
state . stand_pat_or_discard ( 'AsQs' ) # Arieh
state . burn_card ( '??' )
state . deal_hole ( '2hQh' ) # Arieh
state . complete_bet_or_raise_to () # Yockey
state . check_or_call () # Arieh
Vous trouverez ci-dessous le deuxième tirage et les actions.
state . stand_pat_or_discard () # Yockey
state . stand_pat_or_discard ( 'Qh' ) # Arieh
state . burn_card ( '??' )
state . deal_hole ( '4d' ) # Arieh
state . complete_bet_or_raise_to () # Yockey
state . check_or_call () # Arieh
Vous trouverez ci-dessous le troisième tirage et les actions.
state . stand_pat_or_discard () # Yockey
state . stand_pat_or_discard ( '6s' ) # Arieh
state . burn_card ( '??' )
state . deal_hole ( '7c' ) # Arieh
state . complete_bet_or_raise_to () # Yockey
state . check_or_call () # Arieh
Vous trouverez ci-dessous les piles finales.
print ( state . stacks ) # [0, 4190000, 5910000, 12095000]
Vous trouverez ci-dessous un exemple de main de badugi tiré de Wikipédia.
Lien : https://en.wikipedia.org/wiki/Badugi
Notez que les piles de départ sont définies comme étant math.inf
car elles ne sont pas mentionnées.
from math import inf
from pokerkit import Automation , FixedLimitBadugi
state = FixedLimitBadugi . create_state (
# Automations
(
Automation . ANTE_POSTING ,
Automation . BET_COLLECTION ,
Automation . BLIND_OR_STRADDLE_POSTING ,
Automation . HAND_KILLING ,
Automation . CHIPS_PUSHING ,
Automation . CHIPS_PULLING ,
),
True , # Uniform antes?
0 , # Antes
( 1 , 2 ), # Blinds or straddles
2 , # Small-bet
4 , # Big-bet
inf , # Starting stacks
4 , # Number of players
)
Vous trouverez ci-dessous les transactions et actions pré-flop.
state . deal_hole ( '????????' ) # Bob
state . deal_hole ( '????????' ) # Carol
state . deal_hole ( '????????' ) # Ted
state . deal_hole ( '????????' ) # Alice
state . fold () # Ted
state . check_or_call () # Alice
state . check_or_call () # Bob
state . check_or_call () # Carol
Ci-dessous le premier tirage au sort et les actions.
state . stand_pat_or_discard ( '????' ) # Bob
state . stand_pat_or_discard ( '????' ) # Carol
state . stand_pat_or_discard ( '??' ) # Alice
state . burn_card ( '??' )
state . deal_hole ( '????' ) # Bob
state . deal_hole ( '????' ) # Carol
state . deal_hole ( '??' ) # Alice
state . check_or_call () # Bob
state . complete_bet_or_raise_to () # Carol
state . check_or_call () # Alice
state . check_or_call () # Bob
Vous trouverez ci-dessous le deuxième tirage et les actions.
state . stand_pat_or_discard ( '??' ) # Bob
state . stand_pat_or_discard () # Carol
state . stand_pat_or_discard ( '??' ) # Alice
state . burn_card ( '??' )
state . deal_hole ( '??' ) # Bob
state . deal_hole ( '??' ) # Alice
state . check_or_call () # Bob
state . complete_bet_or_raise_to () # Carol
state . complete_bet_or_raise_to () # Alice
state . fold () # Bob
state . check_or_call () # Carol
Vous trouverez ci-dessous le troisième tirage et les actions.
state . stand_pat_or_discard ( '??' ) # Carol
state . stand_pat_or_discard () # Alice
state . burn_card ( '??' )
state . deal_hole ( '??' ) # Carol
state . check_or_call () # Carol
state . complete_bet_or_raise_to () # Alice
state . check_or_call () # Carol
Ci-dessous, la confrontation.
state . show_or_muck_hole_cards ( '2s4c6d9h' ) # Alice
state . show_or_muck_hole_cards ( '3s5d7c8h' ) # Carol
Vous trouverez ci-dessous les piles finales.
print ( state . stacks ) # [inf, inf, inf, inf]
print ( state . payoffs ) # [-4, 20, 0, -16]
PokerKit propose une couverture de tests étendue, réussit la vérification de type statique mypy en mode strict et a été validé par une utilisation intensive dans des scénarios réels.
Les contributions sont les bienvenues ! Veuillez lire notre Guide de contribution pour plus d’informations.
PokerKit est distribué sous la licence MIT.
Si vous utilisez PokerKit dans vos recherches, veuillez citer notre bibliothèque :
@ARTICLE { 10287546 ,
author = { Kim, Juho } ,
journal = { IEEE Transactions on Games } ,
title = { PokerKit: A Comprehensive Python Library for Fine-Grained Multi-Variant Poker Game Simulations } ,
year = { 2023 } ,
volume = { } ,
number = { } ,
pages = { 1-8 } ,
doi = { 10.1109/TG.2023.3325637 } }