Added 'and is all-in' logic.

Altered to read actions in correct street order. hand.streetList must be
set correctly for different types of games.
This commit is contained in:
Matt Turnbull 2008-12-16 04:29:11 +00:00
parent 9c5d0f4598
commit 988a7e3eb5
3 changed files with 33 additions and 16 deletions

View File

@ -209,11 +209,10 @@ class Everleaf(HandHistoryConverter):
if __name__ == "__main__": if __name__ == "__main__":
c = Configuration.Config() c = Configuration.Config()
if sys.argv[0] == '': if len(sys.argv) == 1:
testfile = "regression-test-files/everleaf/Speed_Kuala_full.txt" testfile = "regression-test-files/everleaf/Speed_Kuala_full.txt"
else: else:
testfile = sys.argv[1] testfile = sys.argv[1]
print "Converting: ", testfile
e = Everleaf(c, testfile) e = Everleaf(c, testfile)
e.processFile() e.processFile()
print str(e) print str(e)

View File

@ -28,6 +28,7 @@ import codecs
from decimal import Decimal from decimal import Decimal
import operator import operator
from time import time from time import time
from copy import deepcopy
class Hand: class Hand:
# def __init__(self, sitename, gametype, sb, bb, string): # def __init__(self, sitename, gametype, sb, bb, string):
@ -38,7 +39,7 @@ class Hand:
self.gametype = gametype self.gametype = gametype
self.string = string self.string = string
self.streetList = ['BLINDS','PREFLOP','FLOP','TURN','RIVER'] # a list of the observed street names in order self.streetList = ['PREFLOP','FLOP','TURN','RIVER'] # a list of the observed street names in order
self.handid = 0 self.handid = 0
self.sb = gametype[3] self.sb = gametype[3]
@ -78,6 +79,8 @@ class Hand:
# dict from player names to lists of hole cards # dict from player names to lists of hole cards
self.holecards = {} self.holecards = {}
self.stacks = {}
# dict from player names to amounts collected # dict from player names to amounts collected
self.collected = {} self.collected = {}
@ -106,6 +109,7 @@ chips (string) the chips the player has at the start of the hand (can be None)
If a player has None chips he won't be added.""" If a player has None chips he won't be added."""
if chips is not None: if chips is not None:
self.players.append([seat, name, chips]) self.players.append([seat, name, chips])
self.stacks[name] = Decimal(chips)
self.holecards[name] = set() self.holecards[name] = set()
for street in self.streetList: for street in self.streetList:
self.bets[street][name] = [] self.bets[street][name] = []
@ -176,7 +180,9 @@ Card ranks will be uppercased
# if player is None, it's a missing small blind. # if player is None, it's a missing small blind.
if player is not None: if player is not None:
self.bets['PREFLOP'][player].append(Decimal(amount)) self.bets['PREFLOP'][player].append(Decimal(amount))
self.actions['PREFLOP'] += [(player, 'posts', blindtype, amount)] self.stacks[player] -= Decimal(amount)
print "DEBUG %s stack %s" % (player, self.stacks[player])
self.actions['PREFLOP'] += [(player, 'posts', blindtype, amount, self.stacks[player]==0)]
if blindtype == 'big blind': if blindtype == 'big blind':
self.lastBet['PREFLOP'] = Decimal(amount) self.lastBet['PREFLOP'] = Decimal(amount)
elif blindtype == 'small & big blinds': elif blindtype == 'small & big blinds':
@ -191,7 +197,9 @@ Card ranks will be uppercased
if amount is not None: if amount is not None:
self.bets[street][player].append(Decimal(amount)) self.bets[street][player].append(Decimal(amount))
#self.lastBet[street] = Decimal(amount) #self.lastBet[street] = Decimal(amount)
self.actions[street] += [(player, 'calls', amount)] self.stacks[player] -= Decimal(amount)
self.actions[street] += [(player, 'calls', amount, self.stacks[player]==0)]
def addRaiseTo(self, street, player, amountTo): def addRaiseTo(self, street, player, amountTo):
"""\ """\
@ -208,14 +216,20 @@ Add a raise on [street] by [player] to [amountTo]
self.lastBet[street] = Decimal(amountTo) self.lastBet[street] = Decimal(amountTo)
amountBy = Decimal(amountTo) - amountToCall amountBy = Decimal(amountTo) - amountToCall
self.bets[street][player].append(amountBy+amountToCall) self.bets[street][player].append(amountBy+amountToCall)
self.actions[street] += [(player, 'raises', amountBy, amountTo, amountToCall)] self.stacks[player] -= (Decimal(amountBy)+Decimal(amountToCall))
print "DEBUG %s stack %s" % (player, self.stacks[player])
self.actions[street] += [(player, 'raises', amountBy, amountTo, amountToCall, self.stacks[player]==0)]
def addBet(self, street, player, amount): def addBet(self, street, player, amount):
self.checkPlayerExists(player) self.checkPlayerExists(player)
self.bets[street][player].append(Decimal(amount)) self.bets[street][player].append(Decimal(amount))
self.actions[street] += [(player, 'bets', amount)] self.stacks[player] -= Decimal(amount)
print "DEBUG %s stack %s" % (player, self.stacks[player])
self.actions[street] += [(player, 'bets', amount, self.stacks[player]==0)]
self.lastBet[street] = Decimal(amount) self.lastBet[street] = Decimal(amount)
def addFold(self, street, player): def addFold(self, street, player):
self.checkPlayerExists(player) self.checkPlayerExists(player)
self.folded.add(player) self.folded.add(player)
@ -246,9 +260,10 @@ Add a raise on [street] by [player] to [amountTo]
self.totalpot += reduce(operator.add, self.bets[street][player], 0) self.totalpot += reduce(operator.add, self.bets[street][player], 0)
print "conventional totalpot:", self.totalpot print "conventional totalpot:", self.totalpot
self.totalpot = 0 self.totalpot = 0
print self.actions
for street in self.actions: for street in self.actions:
uncalled = 0 uncalled = 0
calls = [0] calls = [0]
@ -278,6 +293,7 @@ Add a raise on [street] by [player] to [amountTo]
self.totalpot -= (uncalled - max(calls)) self.totalpot -= (uncalled - max(calls))
print "new totalpot:", self.totalpot print "new totalpot:", self.totalpot
if self.totalcollected is None: if self.totalcollected is None:
self.totalcollected = 0; self.totalcollected = 0;
for amount in self.collected.values(): for amount in self.collected.values():
@ -421,11 +437,11 @@ Map the tuple self.gametype onto the pokerstars string describing it
elif act[1] == 'checks': elif act[1] == 'checks':
print >>fh, _("%s: checks " %(act[0])) print >>fh, _("%s: checks " %(act[0]))
if act[1] == 'calls': if act[1] == 'calls':
print >>fh, _("%s: calls $%s" %(act[0], act[2])) print >>fh, _("%s: calls $%s%s" %(act[0], act[2], ' and is all-in' if act[3] else ''))
if act[1] == 'bets': if act[1] == 'bets':
print >>fh, _("%s: bets $%s" %(act[0], act[2])) print >>fh, _("%s: bets $%s%s" %(act[0], act[2], ' and is all-in' if act[3] else ''))
if act[1] == 'raises': if act[1] == 'raises':
print >>fh, _("%s: raises $%s to $%s" %(act[0], act[2], act[3])) print >>fh, _("%s: raises $%s to $%s%s" %(act[0], act[2], act[3], ' and is all-in' if act[5] else ''))
# going to use pokereval to figure out hands at some point. # going to use pokereval to figure out hands at some point.
# these functions are copied from pokergame.py # these functions are copied from pokergame.py

View File

@ -115,13 +115,15 @@ class HandHistoryConverter:
print "\nInput:\n"+hand.string print "\nInput:\n"+hand.string
self.readHandInfo(hand) self.readHandInfo(hand)
self.readPlayerStacks(hand) self.readPlayerStacks(hand)
print "DEBUG", hand.stacks
self.markStreets(hand) self.markStreets(hand)
self.readBlinds(hand) self.readBlinds(hand)
self.readHeroCards(hand) # want to generalise to draw games self.readHeroCards(hand) # want to generalise to draw games
self.readCommunityCards(hand) # read community cards self.readCommunityCards(hand) # read community cards
self.readShowdownActions(hand) self.readShowdownActions(hand)
# Read action (Note: no guarantee this is in hand order.
for street in hand.streets.groupdict(): # Read actions in street order
for street in hand.streetList: # go through them in order
if hand.streets.group(street) is not None: if hand.streets.group(street) is not None:
self.readAction(hand, street) self.readAction(hand, street)