Add docstrings and doctests to deck.py + Python cleanups.
[poker.git] / DECK.py
diff --git a/DECK.py b/DECK.py
deleted file mode 100644 (file)
index cff2f71..0000000
--- a/DECK.py
+++ /dev/null
@@ -1,152 +0,0 @@
-from random import randint, choice, seed
-from combinations import *
-
-'''
-Cards in the deck is stored as (n,m), where n is the rank number 
-n=[0,12], m=[0,3], with n defined to be the card value and m as the suit. 
-
- Examples: 
- (0,1)  is a two of hearts, 
- (11,0) is a king of spades,
- (12,3) is an Ace of clubs
-'''
-
-DECK = dict().fromkeys(range(52))
-for c in DECK: DECK[c] = (c/4,c%4)
-
-''' Fisher-Yates shuffle from Knuth '''
-def shuffle(DECK):
-    for n in range(1,52)[::-1]:
-        k = randint(0,n-1)
-        DECK[k], DECK[n] = DECK[n], DECK[k]
-
-'''
-To determine which five card hand is stronger according to standard poker
-rules, each hand is given a score and a pair rank. The score cooresponds to
-the poker hand (Straight Flush=8, Four of a Kind=7, etc...). The pair score
-is used to break ties of score. The pair score creates a set of pairs then
-rank sorts within each set. Examples:
-
-Hand A: 7575K
-Hand B: 885A5
-
-Pair Score A: [ (2, [7,5]), (1, [K]) ]
-Pair Score B: [ (2, [8,5]), (1, [A]) ]
-
-Hand A: AKQJ2
-Hand B: 2345A
-
-Pair Score A: [ (1, [A,K,Q,J,2]) ]
-Pair Score B: [ (1, [A,5,4,3,2]) ]
-'''
-
-def pairScore(cards):
-    P = dict().fromkeys(cards,0)
-    for c in cards: P[c] += 1
-    V = sorted(set(P.values()))[::-1]
-    return [[v,sorted([c for c in set(P) if P[c]==v])[::-1]] for v in V]
-
-def top_pairScore(P1,P2):  # Only compare to cards with same score!
-    for p1, p2 in zip(P1,P2):
-        if   p1[1]>p2[1]: return  1
-        elif p1[1]<p2[1]: return -1
-    return 0
-
-def isFullHouse(P0): return P0==(3,2)
-def isPair4(P0):     return P0==(4,1)
-def isPair3(P0):     return P0==(3,1)
-def isdoublePair2(P0,P1): return P0==(2,1) and len(P1[0])==2
-def isPair2(P0,P1):       return P0==(2,1) and len(P1[0])==1
-def isFlush(suit): return len(set(suit)) == 1
-def isSt(cards)  :  # Handles the low Ace as well
-    cards = sorted(cards)
-    diff  = [(x2-x1) for x1,x2 in zip(cards,cards[1:])]
-    return len([x for x in diff if x==1])==4 or cards==[0,1,2,3,12]
-
-def handScore(H):
-    cards,suit = zip(*H)
-    P     = pairScore(cards)
-    P0,P1 = zip(*P)
-
-    score = 0
-    S,F   = isSt(cards), isFlush(suit)
-
-    if    isPair2(P0,P1)      : score = 1   
-    elif  isdoublePair2(P0,P1): score = 2
-    elif  isPair3(P0)         : score = 3
-    elif S and not F          : score = 4
-    elif F and not S          : score = 5
-    elif isFullHouse(P0)      : score = 6
-    elif isPair4(P0)          : score = 7
-    elif S and F              : score = 8
-    return [score, P]
-
-
-'''
- To determine who wins a poker hand, given two players hole cards, each player 
- determines the best hand they can make within their 7 choose 5 = 21 possible five 
- card combinations. Then each players best hands are put against each other. 1, -1 
- or 0 is returned if player A wins, B wins, or ties respectively. 
-'''
-
-# This function prevents call xunqiueCombinations a bajillon times
-HAND_COMBOS = list(xuniqueCombinations(range(7),5))
-def pull_hand(H): 
-    for L in HAND_COMBOS: yield [H[n] for n in L]
-
-def top_hand_reduce(P1,P2):
-    H1, A = P1
-    H2, B = P2
-    if   A[0]>B[0]: return  H1,A
-    elif A[0]<B[0]: return  H2,B
-    pairscore = top_pairScore(A[1],B[1])
-    if   pairscore > 0: return H1,A
-    elif pairscore < 0: return H2,B
-    return H1,A
-
-def top_hand_score(A,B):
-    A.score,B.score = handScore(A.score), handScore(B.score)
-    if   A.score[0]>B.score[0]: return  1
-    elif A.score[0]<B.score[0]: return -1
-    return top_pairScore(A.score[1],B.score[1])
-
-def HOLDEM_score(A, B, board): 
-    A.score = reduce(top_hand_reduce,[(H,handScore(H)) for H in pull_hand(A.hole+board)])[0]
-    B.score = reduce(top_hand_reduce,[(H,handScore(H)) for H in pull_hand(B.hole+board)])[0]
-    return top_hand_score(A,B)
-
-# ***************************************
-# Returns the hand in a human readable format (pretty-print)
-def pp_hand(cards):
-    S = ''
-    for c in cards:
-        if   c[0]==8:  S+='T'
-        elif c[0]==9:  S+='J'
-        elif c[0]==10: S+='Q'
-        elif c[0]==11: S+='K'
-        elif c[0]==12: S+='A'
-        else         : S+=str(c[0]+2)
-        
-        if   c[1]==0 : S+='s'
-        elif c[1]==1 : S+='d'
-        elif c[1]==2 : S+='c'
-        else         : S+='h'
-        S += ' '
-    return S
-
-def pp_score(A):
-    try:
-        S = ''
-        if A.score[0] == 0: S = 'HighCard '
-        elif A.score[0] == 1: S = 'Pair '
-        elif A.score[0] == 2: S = 'TwoKind '
-        elif A.score[0] == 3: S = 'ThreeKind '
-        elif A.score[0] == 4: S = 'Straight '
-        elif A.score[0] == 5: S = 'Flush '
-        elif A.score[0] == 6: S = 'FullHouse '
-        elif A.score[0] == 7: S = 'FourKind '
-        elif A.score[0] == 8: S = 'StFlush '
-        S += str(A.score[1])
-        return S
-    except:
-        return "INCOMPLETE"