In light of all the requests about poker evaluator/hand this hand that stuff in this forum, I decided that may be a semi-fun project to attempt.
I just started this last night. It is already 111 lines long. I obviously need to abstract a ton of this, but I'm okay with the extra visuals right now.
I guess it'll be done in about a month. Taking the next series of classes, which is on Scheme, so I won't be able to commit tons of time to this.
Code:
#Hold'em poker eval that is extensible to other variants:
import random
#createDeck():
#To create alternate deck, change deck size and/or (numSuits and suits):
#returns dictionary mapping of deck:
####{'hearts': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
##'clubs': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
##'spades': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
##'diamonds': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]}
def createDeck(deck = 52):
numSuits = deck/4
deck = {}
ranks = []
suits = 'clubs', 'hearts', 'spades', 'diamonds'
for i in range(1, numSuits + 1):
ranks.append(i)
for suitPlace in range(4):
deck[suits[suitPlace]] = ranks
return deck
#createDeck()
#Creates pseudo-random two-card hand for each player:
#converts numericals to trump-ranks.
#returns list with tuples:
#ex: [(8, 'hearts'), (7, 'spades')]
#To change hand-size, change handSize
#Only need to change ranked if deck in createDeck() is larger than 52
def createHand():
wholeDeck = createDeck()
handSize = 2
returnHand = []
while handSize > 0:
for n in range(handSize):
suited = random.choice(wholeDeck.keys())
ranked = random.choice(wholeDeck[suited])
## This is a bug that I'll get to fixing later:
## the attempt is to chop off the cards so I don't get doubles
## del wholeDeck[suited][ranked]
## print wholeDeck
if ranked == 1:
ranked = 'A'
elif ranked == 10:
ranked = 'T'
elif ranked == 11:
ranked = 'J'
elif ranked == 12:
ranked = 'Q'
elif ranked == 13:
ranked = 'K'
handSize -= 1
newHand = ranked, suited
returnHand.append(newHand)
return returnHand
##hand = createHand(1)
##print hand
#Initializes players and returns player hands:
def createPlayerHands(players = 1):
playerHand = {}
playerID = 0
for i in range(players):
playerID += 1
rawHand = createHand()
playerHand[playerID] = rawHand
return playerHand
#dealBoard decides how many cards to deal. Will create function later that asks what
#streets to deal.
def dealBoard(cardsUsed = 0):
cardsToDeal = 5 - cardsUsed
lessDeck = createDeck()
returnHand = []
for i in range(cardsToDeal):
suited = random.choice(lessDeck.keys())
ranked = random.choice(lessDeck[suited])
if ranked == 1:
ranked = 'A'
elif ranked == 10:
ranked = 'T'
elif ranked == 11:
ranked = 'J'
elif ranked == 12:
ranked = 'Q'
elif ranked == 13:
ranked = 'K'
newHand = ranked, suited
returnHand.append(newHand)
return returnHand
##showBoard = dealBoard(3)
##print showBoard
#play starts here:
##example output:
##how many players in this hand? 4
##player 1 : [(9, 'spades'), (4, 'hearts')]
##player 2 : [(7, 'spades'), ('J', 'diamonds')]
##player 3 : [(6, 'spades'), (6, 'diamonds')]
##player 4 : [(5, 'hearts'), (6, 'spades')]
numPlayers = int(raw_input('how many players in this hand? '))
playerHand = createPlayerHands(numPlayers)
for k, v in playerHand.iteritems():
print 'player', k, ':', v
#See the error message: tells me how many lines this thing is getting to be:
#createPlayerHan(4)