So close, yet so far. Need to calculate rake to output the side pots
line correctly.
This commit is contained in:
parent
7803f52307
commit
b37ddc5ace
152
pyfpdb/Hand.py
152
pyfpdb/Hand.py
|
@ -307,8 +307,13 @@ Add a raise on [street] by [player] to [amountTo]
|
||||||
|
|
||||||
|
|
||||||
self.totalpot = 0
|
self.totalpot = 0
|
||||||
|
#print "[POT] stack list"
|
||||||
|
#print dict([(player[1], Decimal(player[2])) for player in self.players])
|
||||||
|
players_who_act_preflop = set([x[0] for x in self.actions['PREFLOP']])
|
||||||
|
self.pot = Pot(players_who_act_preflop)
|
||||||
|
|
||||||
for street in self.actions:
|
#for street in self.actions:
|
||||||
|
for street in [x for x in self.streetList if x in self.actions]:
|
||||||
uncalled = 0
|
uncalled = 0
|
||||||
calls = [0]
|
calls = [0]
|
||||||
for act in self.actions[street]:
|
for act in self.actions[street]:
|
||||||
|
@ -317,18 +322,30 @@ Add a raise on [street] by [player] to [amountTo]
|
||||||
uncalled = Decimal(act[2]) # only the last bet or raise can be uncalled
|
uncalled = Decimal(act[2]) # only the last bet or raise can be uncalled
|
||||||
calls = [0]
|
calls = [0]
|
||||||
print "uncalled: ", uncalled
|
print "uncalled: ", uncalled
|
||||||
|
|
||||||
|
self.pot.addMoney(act[0], Decimal(act[2]))
|
||||||
|
|
||||||
elif act[1] == 'raises': # [name, 'raises', amountby, amountto, amountcalled]
|
elif act[1] == 'raises': # [name, 'raises', amountby, amountto, amountcalled]
|
||||||
print "calls %s and raises %s to %s" % (act[4],act[2],act[3])
|
print "calls %s and raises %s to %s" % (act[4],act[2],act[3])
|
||||||
self.totalpot += Decimal(act[2]) + Decimal(act[4])
|
self.totalpot += Decimal(act[2]) + Decimal(act[4])
|
||||||
calls = [0]
|
calls = [0]
|
||||||
uncalled = Decimal(act[2])
|
uncalled = Decimal(act[2])
|
||||||
print "uncalled: ", uncalled
|
print "uncalled: ", uncalled
|
||||||
|
|
||||||
|
self.pot.addMoney(act[0], Decimal(act[2])+Decimal(act[4]))
|
||||||
|
|
||||||
elif act[1] == 'calls': # [name, 'calls', amount]
|
elif act[1] == 'calls': # [name, 'calls', amount]
|
||||||
self.totalpot += Decimal(act[2])
|
self.totalpot += Decimal(act[2])
|
||||||
calls = calls + [Decimal(act[2])]
|
calls = calls + [Decimal(act[2])]
|
||||||
print "calls:", calls
|
print "calls:", calls
|
||||||
|
|
||||||
|
self.pot.addMoney(act[0], Decimal(act[2]))
|
||||||
|
|
||||||
elif act[1] == 'posts':
|
elif act[1] == 'posts':
|
||||||
self.totalpot += Decimal(act[3])
|
self.totalpot += Decimal(act[3])
|
||||||
|
|
||||||
|
self.pot.addMoney(act[0], Decimal(act[3]))
|
||||||
|
|
||||||
if act[2] == 'big blind':
|
if act[2] == 'big blind':
|
||||||
# the bb gets called by out-of-blinds posts; but sb+bb only calls bb
|
# the bb gets called by out-of-blinds posts; but sb+bb only calls bb
|
||||||
if uncalled == Decimal(act[3]): # a bb is already posted
|
if uncalled == Decimal(act[3]): # a bb is already posted
|
||||||
|
@ -343,14 +360,15 @@ Add a raise on [street] by [player] to [amountTo]
|
||||||
uncalled = Decimal(act[3])
|
uncalled = Decimal(act[3])
|
||||||
calls = [0]
|
calls = [0]
|
||||||
pass
|
pass
|
||||||
|
elif act[1] == 'folds':
|
||||||
|
self.pot.addFold(act[0])
|
||||||
if uncalled > 0 and max(calls+[0]) < uncalled:
|
if uncalled > 0 and max(calls+[0]) < uncalled:
|
||||||
|
|
||||||
print "DEBUG returning some bet, calls:", calls
|
print "DEBUG returning some bet, calls:", calls
|
||||||
print "DEBUG returned: %.2f from %.2f" % ((uncalled - max(calls)), self.totalpot,)
|
print "DEBUG returned: %.2f from %.2f" % ((uncalled - max(calls)), self.totalpot,)
|
||||||
self.totalpot -= (uncalled - max(calls))
|
self.totalpot -= (uncalled - max(calls))
|
||||||
print "DEBUG new totalpot:", self.totalpot
|
print "DEBUG new totalpot:", self.totalpot
|
||||||
|
print "DEBUG new Pot.total:", self.pot
|
||||||
|
|
||||||
if self.totalcollected is None:
|
if self.totalcollected is None:
|
||||||
self.totalcollected = 0;
|
self.totalcollected = 0;
|
||||||
|
@ -446,7 +464,8 @@ Map the tuple self.gametype onto the pokerstars string describing it
|
||||||
print >>fh, "DEBUG: what do they show"
|
print >>fh, "DEBUG: what do they show"
|
||||||
|
|
||||||
print >>fh, _("*** SUMMARY ***")
|
print >>fh, _("*** SUMMARY ***")
|
||||||
print >>fh, _("Total pot $%s | Rake $%.2f" % (self.totalpot, self.rake)) # TODO: side pots
|
print >>fh, "%s | Rake $%.2f" % (self.pot, self.rake)
|
||||||
|
#print >>fh, _("Total pot $%s | Rake $%.2f" % (self.totalpot, self.rake)) # TODO: side pots
|
||||||
|
|
||||||
board = []
|
board = []
|
||||||
for s in self.board.values():
|
for s in self.board.values():
|
||||||
|
@ -544,3 +563,128 @@ Map the tuple self.gametype onto the pokerstars string describing it
|
||||||
|
|
||||||
|
|
||||||
class FpdbParseError(Exception): pass
|
class FpdbParseError(Exception): pass
|
||||||
|
|
||||||
|
class Pot(object):
|
||||||
|
|
||||||
|
def __init__(self, contenders):
|
||||||
|
self.contenders = contenders
|
||||||
|
self.committed = dict([(player,Decimal(0)) for player in contenders])
|
||||||
|
self.total = Decimal(0)
|
||||||
|
|
||||||
|
def addFold(self, player):
|
||||||
|
self.contenders.remove(player)
|
||||||
|
|
||||||
|
def addMoney(self, player, amount):
|
||||||
|
self.committed[player] += amount
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
self.total = sum(self.committed.values())
|
||||||
|
committed = sorted([ (v,k) for (k,v) in self.committed.items()])
|
||||||
|
lastbet = committed[-1][0] - committed[-2][0]
|
||||||
|
if lastbet > 0: # uncalled
|
||||||
|
returnto = committed[-1][1]
|
||||||
|
#print "returning %f to %s" % (lastbet, returnto)
|
||||||
|
self.total -= lastbet
|
||||||
|
self.committed[returnto] -= lastbet
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# now: for those contenders still contending..
|
||||||
|
commitsall = sorted([(v,k) for (k,v) in self.committed.items() if v >0])
|
||||||
|
|
||||||
|
pots = []
|
||||||
|
while len(commitsall) > 0:
|
||||||
|
commitslive = [(v,k) for (v,k) in commitsall if k in self.contenders]
|
||||||
|
v1 = commitslive[0][0]
|
||||||
|
pots += [sum([min(v,v1) for (v,k) in commitsall])]
|
||||||
|
#print "all: ", commitsall
|
||||||
|
#print "live:", commitslive
|
||||||
|
commitsall = [((v-v1),k) for (v,k) in commitsall if v-v1 >0]
|
||||||
|
|
||||||
|
|
||||||
|
#print "[**]", pots
|
||||||
|
|
||||||
|
# TODO: I think rake gets taken out of the pots.
|
||||||
|
# so it goes:
|
||||||
|
# total pot x. main pot y, side pot z. | rake r
|
||||||
|
# and y+z+r = x
|
||||||
|
# for example:
|
||||||
|
# Total pot $124.30 Main pot $98.90. Side pot $23.40. | Rake $2
|
||||||
|
# so....... that's tricky.
|
||||||
|
if len(pots) == 1:
|
||||||
|
return "Main pot $%.2f" % pots[0]
|
||||||
|
elif len(pots) == 2:
|
||||||
|
return "Main pot $%.2f, side pot $%2.f" % (pots[0],pots[1])
|
||||||
|
elif len(pots) == 3:
|
||||||
|
return "Main pot $%.2f, side pot-1 $%2.f, side pot-2 $.2f" % (pots[0],pots[1],pots[2])
|
||||||
|
else:
|
||||||
|
return "too many pots.. fix me"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#def addMoney(self, player, amount):
|
||||||
|
#uncalled = max(self.committed.values()) - self.committed[player]
|
||||||
|
|
||||||
|
#if self.cap:
|
||||||
|
#overflow = self.committed[player] + amount - self.cap
|
||||||
|
#if overflow > 0:
|
||||||
|
#self.total += amount - overflow
|
||||||
|
#self.committed[player] = self.cap
|
||||||
|
#self.sidepot.addMoney(player, overflow)
|
||||||
|
#else:
|
||||||
|
## because it was capped, we can only be calling here.
|
||||||
|
#self.calls.append(min(uncalled,amount))
|
||||||
|
#self.committed[player] += amount
|
||||||
|
#self.total += amount
|
||||||
|
#else:
|
||||||
|
## no player is currently all-in.
|
||||||
|
|
||||||
|
#self.committed[player] += amount
|
||||||
|
#self.total += amount
|
||||||
|
|
||||||
|
## is this a new uncalled bet?
|
||||||
|
#r = amount - uncalled
|
||||||
|
#if r > 0:
|
||||||
|
#self.uncalled = (player, r)
|
||||||
|
#self.calls = [0]
|
||||||
|
#else:
|
||||||
|
#self.calls.append(amount + r)
|
||||||
|
|
||||||
|
## is this player all-in?
|
||||||
|
#if self.committed[player] == self.stacks[player]:
|
||||||
|
#self.cap = self.stacks[player]
|
||||||
|
#contenders = self.contenders[:]
|
||||||
|
#contenders.remove(player)
|
||||||
|
#sidepotstacks = dict([(player, self.stacks[player]-self.committed[player]) for player in contenders])
|
||||||
|
#self.sidepot = Pot(contenders, sidepotstacks, self.sidepotnum+1)
|
||||||
|
#elif self.committed[player] > self.stacks[player]:
|
||||||
|
#print "ERROR %s problem" % (player,)
|
||||||
|
#print self.committed[player], self.stacks[player]
|
||||||
|
#raise FpdbParseError
|
||||||
|
|
||||||
|
#def returnUncalled(self):
|
||||||
|
#print "[POT]"
|
||||||
|
#print "last bet", self.uncalled
|
||||||
|
#print "calls:", self.calls
|
||||||
|
#print
|
||||||
|
#if self.uncalled:
|
||||||
|
#if max(self.calls) < self.uncalled[1]:
|
||||||
|
#self.total -= self.uncalled[1]
|
||||||
|
#print "returned", self.uncalled[0],self.uncalled[1]-max(self.calls), "from", self.uncalled[1]
|
||||||
|
|
||||||
|
|
||||||
|
#def __str__(self):
|
||||||
|
#total = self.total
|
||||||
|
#if self.sidepotnum == 0:
|
||||||
|
#return "Main pot $%.2f%s" %(total, self.sidepot or '' )
|
||||||
|
#elif self.sidepotnum > 0:
|
||||||
|
#if self.sidepot:
|
||||||
|
#return ", side pot-%d $%.2f%s" % (self.sidepotnum, total, self.sidepot)
|
||||||
|
#else:
|
||||||
|
#return ", side pot $%.2f." % (total,)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user