Advertisement
GoodiesHQ

Craps.py

Nov 3rd, 2016
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.49 KB | None | 0 0
  1. from random import SystemRandom
  2. from itertools import count
  3.  
  4.  
  5. class Craps:
  6.     random = SystemRandom()
  7.  
  8.     class Holder:  # simple class for holding a value so I can assign and retrieve it inside of a while loop
  9.         def __init__(self): self.val = None
  10.         def set(self, val): self.val = val; return val
  11.         def get(self): return self.val
  12.  
  13.     def print(self, *data, **kwargs):
  14.         if self.verbose:
  15.             for datum in data:
  16.                 print(datum, **kwargs)
  17.  
  18.     def __init__(self, starting_balance, verbose=False):
  19.         self.wallet = starting_balance
  20.         self.wins, self.losses = 0, 0
  21.         self.random = SystemRandom()
  22.         self.verbose = verbose
  23.         self.holder = Craps.Holder()
  24.         self.rolls = {i + 1: 0 for i in range(12)}
  25.         self.roll_cnt = 0
  26.  
  27.     def roll(self):
  28.         r1, r2 = self.random.randint(1, 6), self.random.randint(1, 6)
  29.         r = r1 + r2
  30.         self.print("Rolled {} and {} ({}).".format(r1, r2, r))
  31.         return r
  32.  
  33.     def play(self, bet):
  34.         assert isinstance(bet, int)
  35.         while self.holder.set(self.roll()) in {2, 3, 12}:
  36.             pass  # keep rolling until you get a 4-11.
  37.         r = self.holder.get()
  38.         self.rolls[r] += 1
  39.         self.print("Continuing to second roll.")
  40.         while self.holder.set(self.roll()) in {4, 5, 6, 7, 8, 9, 10, 11}:
  41.             r = self.holder.get()
  42.             self.rolls[r] += 1
  43.             if r in (7, 11):
  44.                 self.wallet += bet
  45.                 return True
  46.         r = self.holder.get()
  47.         self.rolls[r] += 1
  48.         self.wallet -= bet
  49.         return False
  50.  
  51.     @staticmethod
  52.     def safe_cast(new_type, val, default=None):
  53.         try:
  54.             default = new_type(val)
  55.         finally:
  56.             return default
  57.  
  58.     def run(self, cnt=None):
  59.         assert cnt is None or isinstance(cnt, int)
  60.         iterations = count() if cnt is None else range(cnt)
  61.         for _ in iterations:
  62.             bet = None
  63.             while bet is None or (isinstance(bet, int) and bet > self.wallet):
  64.                 bet = self.safe_cast(int, input("Enter a bet (Cash: ${}): ".format(self.wallet)))
  65.                 if bet is None:
  66.                     print("Invalid. ")
  67.                 elif bet > self.wallet:
  68.                     print("You only have %{}".format(self.wallet))
  69.             self.play(bet)
  70.             if self.wallet == 0:
  71.                 print("You crapped out.")
  72.                 return
  73.  
  74. c = Craps(100, True)
  75. c.run(None)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement