-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathround.py
65 lines (51 loc) · 2 KB
/
round.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
import hashlib
import os
import random
CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
class UnacceptableBetError(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return self.message
def generate_seed():
return ''.join(random.choice(CHARS) for i in range(15))
class Round(object):
def __init__(self, payout_limit=None):
self.seed = generate_seed()
self.proof = hashlib.md5(self.seed.encode('utf-8')).hexdigest()[0:8]
random.seed(self.seed)
self.random_state = random.getstate()
self.bets = []
self.to_confirm_bets = []
self.draws = []
self.payout_limit = payout_limit
self.status = 'open'
@property
def total_round_payout(self):
"""Returns the max possible payout at the end of this round"""
return sum(b.max_payout for b in self.bets)
def add_bet(self, bet):
if self.total_round_payout + bet.max_payout > self.payout_limit:
raise UnacceptableBetError(
'Non posso accettare questa puntata, mi farebbe superare il '
'limite di payout (possibile vincita) di questo round.\n'
'Payout rimanente: <b>{}</b>'.format(
self.payout_limit - self.total_round_payout))
self.bets.append(bet)
self.to_confirm_bets.append(bet)
def cancel_last_bet(self, player):
bets = list(b for b in self.bets if b.player.name == player.name)
if len(bets) == 0:
return None
else:
self.bets.remove(bets[-1])
return bets[-1]
def go(self):
"""Make alle the necessary draws"""
i = 0 # failsafe to avoid infinite loop
while any(b.must_draw(self.draws) for b in self.bets) and i < 100:
random.setstate(self.random_state)
self.draws.append(random.randint(1, 6))
self.random_state = random.getstate()
i += 1
return self.draws