0

私は Python で簡単で汚いポーカー ゲームを作成していますが、どのプレーヤーがハンドに勝つかを判断するのに苦労しています。カードを配り、0 ~ 8 がハイ カード (ストレート フラッシュ) に対応するようにハンドの「価値」を決定し、次に各ハンドをユニークにする重要な要素を決定する関数があります。

私が問題を抱えているのは、同じハンド タイプ (ペア、ツー ペアなど) のプレイヤーが 2 人以上いる場合にどちらが勝つかを判断することです。キッカー。

データを保存し、必要に応じてすべてを比較する良い方法を判断するのに苦労しています。ハンドの値などをチェックする関数をすべて含めたくはありません。長くなりすぎるからです。私は、このデータをどのように保存して比較するかについて人々の考え、特に同様の値を持つ手 (太字のもの) について言及されていることに本当に興味があります。

各プレーヤーの手札は、次の形式のプレーヤー番号でキー付けされた辞書エントリによって表されます。

mydict = {(1 :(2,'Spades)), (2 :(3,'Diamonds')), etc}

players = 5
# Creates deck of cards and deals to each player
Cards = Shuffle_Deck(Suits,Values,1)
All_Players, Cards = deal_hand(players,5,Cards)

# scores and orders hands
def order_hands(All_Players):
    rank_hands = []
    for i in range(1,len(All_Players)+1):
        rank_hands.append([i,score_hand(All_Players[i],printhand=False,printvalue=False)])
    sorted_hands = rank_hands[:]
    sorted_hands.sort(key=lambda x: x[1][0],reverse=True)
    return sorted_hands

Sorted_Hands = order_hands(All_Players)
#print Sorted_Hands
def who_Wins(Sorted_Hands):
    Tied_Hands = []
    winning_index = Sorted_Hands[0][1][0]
    for i in range(len(Sorted_Hands)):
        if Sorted_Hands[i][1][0] == winning_index:
#            print Sorted_Hands[i]
            Tied_Hands.append([Sorted_Hands[i][0],Sorted_Hands[i][1][1:]])

    return winning_index,Tied_Hands

winning_index,Tied_Hands = who_Wins(Sorted_Hands)
Tied_Hands.sort(key=lambda x: x[1], reverse=True)
print Tied_Hands
for i in range(len(Tied_Hands)):
    vals = [val for (val,suit) in All_Players[Tied_Hands[i][0]]]
    print 'vals',sorted(vals,reverse=True)
#for hands in Tied_Hands:
#    if
print Tied_Hands[0][0]
4

2 に答える 2

4

これが私が書いた例です:

http://www.paulgriffiths.net/program/python/pcards.php

_set_score()メソッドはトリックを行うものです。私が思いついた解決策は、ハンドのコンポーネントをリストでスコア付けすることでした。たとえば、フルハウスの場合、リストの最初の項目はハンド全体のスコアです (例: フルハウスはペアを打ち、ストレートはスリーカードを打ちます)、リストの 2 番目の項目はスリーオブザカインドのランクです。リストの 3 番目の項目はペアのランクです。そうすれば、通常の <、>、<=、>= 演算子を使用してあるハンドと別のハンド (つまり、あるリストと別のリスト) を比較するだけで、任意のハンドを非常に簡単に比較でき、Python がすべての面倒な作業を行います。満員の家の場合、リストを比較すると、Python は各項目を順番に調べます。両方の手がフルハウスの場合、スリーカードを比較し、最も高い 3 人が勝ちます。スリーが同じ場合、ペアを比較します。最高のペアが勝ちます。スリーとペアが等しい場合、両手は等しいです。この方法は一般的に機能し、リストを比較するだけで任意の 2 つのハンドを比較できます。

于 2013-06-15T05:13:34.470 に答える
3

評価関数を次のように構成します。

1) まず、ハンドの種類を決定します (最高位のカード、ペア、ツー ペア... ロイヤル フラッシュ)。ハンド タイプは、ワーストからベストへと並べられた列挙型である必要があります。

2) 次に、ハンドのカードを並べ替えます。ハンド タイプを構成するカードが最初に配置されます (特に、フルハウスの場合、スリーカードがツーカードの前に最初に配置されます)。最高から最低までのカード。

3) ハンド タイプと並べ替えられたカードをタプルします。これはハンドの良さの評価です。

比較関数を次のように構成します。

1) まず、手の種類を比較します。どちらかが高い場合、そのハンドが優れています。

2) それ以外の場合は、並べ替えられたハンドの最初のカードを比較します。どちらかが高い場合、そのハンドが優れています。

3) 各カードで 2) を続けます。

これで、コンパレーターを使用して、たとえば、任意の数のハンドを最悪のハンドから最良のハンドの順に並べ替えることができます。

また、各ハンドのスコアを作成し、整数を比較することもできます。たとえば、最悪 (最下位という意味で) のカード + 2 番目に悪いカード *11 + 3 番目のカード *11^2 + 4 番目のカード *11^3 です。 + ベストカード*11^4 + ハンドタイプ*11^5

于 2013-06-15T05:03:30.473 に答える