forked from tanmayk28/crapstats
/
table.py
executable file
·132 lines (115 loc) · 4.32 KB
/
table.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
from log import Log
from dice import Dice
from plotter import *
CRAPS = (2, 3, 12)
BOXES = (4, 5, 6, 8, 9, 10)
NATURALS = (7, 11)
SEVEN = 7
YOLEVEN = 11
class Table(object):
def __init__(self, minimum, players, max_rolls, input_rolls):
self.players = players
self.dice = Dice()
self.input_rolls = input_rolls
self.minimum = minimum
self.max_rolls = max_rolls
# metadata
self.shooters = 1
self.rolls = 1
self.longest_roll = 0
self.points_made = 0
self.seven_outs = 0
self.come_out_naturals = 0
self.come_out_craps = 0
self.roll_history = []
self.roll_status = (0, 0, None)
self.table_status = []
def simulate(self):
while self.continue_playing():
self.shoot()
for player in self.players:
if self.continue_betting(player):
log = Log()
player.strategy(self)
log.pre_roll(self, player)
self.roll_status = self.evaluate_roll(player)
log.post_roll(self, player)
player.catalogue(self, log)
self.table_status.append(self.roll_status[2])
self.assess_post_roll()
for player in self.players:
player.collect_wager()
print player.__doc__
player.tabulate()
# self.log(player)
def evaluate_roll(self, player):
if player.point is None:
if self.dice.total in NATURALS:
delta = player.bet.assess_naturals(self.dice, player)
elif self.dice.total in CRAPS:
delta = player.bet.assess_craps(self.dice, player)
elif self.dice.total in BOXES:
delta = player.bet.assess_box(self.dice, player)
else:
raise Exception('Invalid Roll')
else:
if self.dice.total == SEVEN:
delta = player.bet.assess_seven_out(player)
elif self.dice.total == YOLEVEN:
delta = player.bet.assess_yoleven(self.dice, player)
elif self.dice.total in CRAPS:
delta = player.bet.assess_craps(self.dice, player)
elif self.dice.total in BOXES:
delta = player.bet.assess_box(self.dice, player)
else:
raise Exception('Invalid Roll')
player.log_bankroll()
return delta
def log(self, player):
line_plot(player.bankroll_history)
# pie_chart([2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], self.dice.history.values())
# bar_chart([2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], self.dice.history.values(), 11)
def assess_post_roll(self):
if self.table_status and len(set(self.table_status)) != 1:
raise Exception('Invalid Roll Calculation')
self.rolls += 1
if self.table_status[0] == 'POINT':
self.points_made += 1
elif self.table_status[0] == 'SEVEN_OUT':
self.update_seven_out_stats()
elif self.table_status[0] == 'NATURALS':
self.come_out_naturals += 1
elif self.table_status[0] == 'CRAPS':
self.come_out_craps += 1
self.table_status = []
def shoot(self):
if self.input_rolls is None:
self.dice.roll()
else:
self.dice.add_roll(self.input_rolls[self.rolls - 1])
return self.dice
def continue_betting(self, player):
if self.input_rolls is None:
if player.bankroll <= 0:
return False
else:
# wait for the current shooter to seven-out
if self.rolls >= self.max_rolls and self.dice.history[self.rolls - 1] == 7:
return False
else:
return True
else:
if player.bankroll <= 0 or self.rolls > len(self.input_rolls):
return False
else:
return True
def continue_playing(self):
play = False
for player in self.players:
play = play or self.continue_betting(player)
return play
def update_seven_out_stats(self):
self.seven_outs += 1
self.shooters += 1
self.longest_roll = max(self.longest_roll, self.dice.current_roll)
self.dice.current_roll = 0