純粋な Python ポーカー ハンド評価ライブラリ
[ 3 ❤ ] , [ 3 ♠ ]
$ pip install treys
Treys は Deuces の Python 3 移植版です。作業のほとんどは msaindon のフォークから取得されます。
Treys (元々は Deuces) は、MIT ポーカーボット コンペティションのために Will Drevo によって書かれました。軽くて速いです。すべての検索はビット算術検索と辞書検索で行われます。そうは言っても、Treys は C 実装 (~250k eval/s) に勝るものではありませんが、Python が必要な状況や、ボットに妥当な思考時間 (人間の時間スケール) が割り当てられている状況では役立ちます。
Treys は 5、6、7 のカード ハンド ルックアップを処理します。 6 枚と 7 枚のカードの検索は、5 枚のカードの選択肢を組み合わせて評価することによって行われます。
Treys はセットアップも使用も簡単です。
>> > from treys import Card
>> > card = Card . new ( 'Qh' )
Trey のパフォーマンスと軽量性を維持するために、カード オブジェクトは整数として表されます。
次に、ボードとテキサス ホールデム ハンドの例を作成しましょう。
>> > 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 のスケールで評価されます。ポーカーには明確にランク付けされたハンドが 7642 個しかないため、1 はロイヤル フラッシュ、7462 は不向きな 7-5-4-3-2 です。繰り返しになりますが、なぜそうなるのかについて数学的に完全に説明するには、私のブログ投稿を参照してください。
デッキからカードをランダムに配りたい場合は、Trey を使用してそれを行うこともできます。
>> > 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 ❤ ]
両方のハンドの強さを評価し、ハンド タイプ (ハイ カード、ペアなど) ごとに 1 つのクラスに分けてみましょう。
>> > 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
著作権 (c) 2013 ウィル ドレボ
本ソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手した人には、使用、コピー、変更、マージする権利を含むがこれらに限定されない、制限なくソフトウェアを取り扱う許可が、ここに無償で与えられます。 、以下の条件を条件として、本ソフトウェアのコピーを出版、配布、サブライセンス、および/または販売すること、および本ソフトウェアが提供される人物にそれを許可すること。
上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは主要部分に含まれるものとします。
ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。ソフトウェア。