Advertisement
Guest User

Untitled

a guest
Feb 10th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.51 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. from random import Random
  4. colors_support = True
  5. try:
  6. from colorama import init, Fore
  7. init()
  8. except:
  9. colors_support = False
  10. print "For colors install colorama"
  11.  
  12.  
  13. hint_table = \
  14. {('5',): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  15. ('6',): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  16. ('7',): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  17. ('8',): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  18. ('9',): {'A': 'h', '10': 'h', '3': 'd', '2': 'h', '5': 'd', '4': 'd', '7': 'h', '6': 'd', '9': 'h', '8': 'h'},
  19. ('10',): {'A': 'h', '10': 'h', '3': 'd', '2': 'd', '5': 'd', '4': 'd', '7': 'd', '6': 'd', '9': 'd', '8': 'd'},
  20. ('11',): {'A': 'h', '10': 'd', '3': 'd', '2': 'd', '5': 'd', '4': 'd', '7': 'd', '6': 'd', '9': 'd', '8': 'd'},
  21. ('12',): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 's', '4': 's', '7': 'h', '6': 's', '9': 'h', '8': 'h'},
  22. ('13',): {'A': 'h', '10': 'h', '3': 's', '2': 's', '5': 's', '4': 's', '7': 'h', '6': 's', '9': 'h', '8': 'h'},
  23. ('14',): {'A': 'h', '10': 'h', '3': 's', '2': 's', '5': 's', '4': 's', '7': 'h', '6': 's', '9': 'h', '8': 'h'},
  24. ('15',): {'A': 'h', '10': 'h', '3': 's', '2': 's', '5': 's', '4': 's', '7': 'h', '6': 's', '9': 'h', '8': 'h'},
  25. ('16',): {'A': 'h', '10': 'h', '3': 's', '2': 's', '5': 's', '4': 's', '7': 'h', '6': 's', '9': 'h', '8': 'h'},
  26. ('17',): {'A': 's', '10': 's', '3': 's', '2': 's', '5': 's', '4': 's', '7': 's', '6': 's', '9': 's', '8': 's'},
  27. ('18',): {'A': 's', '10': 's', '3': 's', '2': 's', '5': 's', '4': 's', '7': 's', '6': 's', '9': 's', '8': 's'},
  28. ('19',): {'A': 's', '10': 's', '3': 's', '2': 's', '5': 's', '4': 's', '7': 's', '6': 's', '9': 's', '8': 's'},
  29. ('20',): {'A': 's', '10': 's', '3': 's', '2': 's', '5': 's', '4': 's', '7': 's', '6': 's', '9': 's', '8': 's'},
  30. ('2', 'A'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'd', '4': 'h', '7': 'h', '6': 'd', '9': 'h', '8': 'h'},
  31. ('3', 'A'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'd', '4': 'h', '7': 'h', '6': 'd', '9': 'h', '8': 'h'},
  32. ('4', 'A'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'd', '4': 'd', '7': 'h', '6': 'd', '9': 'h', '8': 'h'},
  33. ('5', 'A'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'd', '4': 'd', '7': 'h', '6': 'd', '9': 'h', '8': 'h'},
  34. ('6', 'A'): {'A': 'h', '10': 'h', '3': 'd', '2': 'h', '5': 'd', '4': 'd', '7': 'h', '6': 'd', '9': 'h', '8': 'h'},
  35. ('7', 'A'): {'A': 'h', '10': 'h', '3': 'd', '2': 's', '5': 'd', '4': 'd', '7': 's', '6': 'd', '9': 'h', '8': 's'},
  36. ('8', 'A'): {'A': 's', '10': 's', '3': 's', '2': 's', '5': 's', '4': 's', '7': 's', '6': 's', '9': 's', '8': 's'},
  37. ('9', 'A'): {'A': 's', '10': 's', '3': 's', '2': 's', '5': 's', '4': 's', '7': 's', '6': 's', '9': 's', '8': 's'},
  38. ('A', 'A'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  39. ('2', '2'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  40. ('3', '3'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  41. ('4', '4'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  42. ('5', '5'): {'A': 'h', '10': 'h', '3': 'd', '2': 'd', '5': 'd', '4': 'd', '7': 'd', '6': 'd', '9': 'd', '8': 'd'},
  43. ('6', '6'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  44. ('7', '7'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  45. ('8', '8'): {'A': 'h', '10': 'h', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 'h', '6': 'h', '9': 'h', '8': 'h'},
  46. ('9', '9'): {'A': 's', '10': 's', '3': 'h', '2': 'h', '5': 'h', '4': 'h', '7': 's', '6': 'h', '9': 'h', '8': 'h'},
  47. ('10', '10'): {'A': 's', '10': 's', '3': 's', '2': 's', '5': 's', '4': 's', '7': 's', '6': 's', '9': 's', '8': 's'}}
  48.  
  49.  
  50. def color(color):
  51. if colors_support:
  52. if color is "green":
  53. return Fore.GREEN # @UndefinedVariable
  54. elif color is "red":
  55. return Fore.RED # @UndefinedVariable
  56. elif color is "white":
  57. return Fore.WHITE # @UndefinedVariable
  58. elif color is "yellow":
  59. return Fore.YELLOW # @UndefinedVariable
  60. elif color is "blue":
  61. return Fore.BLUE # @UndefinedVariable
  62. else:
  63. return Fore.WHITE # @UndefinedVariable
  64. else:
  65. return ''
  66.  
  67.  
  68. class Bookie(object):
  69.  
  70. def __init__(self, credit=1000):
  71. self.credit = credit
  72. self.bet = None
  73. self.previous_bet = None
  74.  
  75. def place_bet(self, bet=None, ratio=2):
  76. if bet is None and self.previous_bet is None:
  77. raise Exception("No bet was specified")
  78. if bet is None and self.previous_bet is not None:
  79. # Using the last bet
  80. bet = self.previous_bet
  81. if bet > self.credit:
  82. raise Exception("There is only {0} in credit\
  83. , can't place bet of {1}".format(self.credit, bet))
  84. self.ratio = ratio
  85. self.previous_bet = bet
  86. self.bet = bet
  87.  
  88. def report_win(self):
  89. if self.bet is None:
  90. raise Exception("No bet was placed")
  91. self.credit += self.bet * self.ratio - self.bet
  92.  
  93. def report_lose(self):
  94. if self.bet is None:
  95. raise Exception("No bet was placed")
  96. self.credit -= self.bet
  97.  
  98. def double_bet(self):
  99. if self.bet is None:
  100. raise Exception("No bet was placed")
  101. self.bet *= 2
  102.  
  103. def half_bet(self):
  104. if self.bet is None:
  105. raise Exception("No bet was placed")
  106. self.bet /= 2
  107.  
  108. def abort_bet(self):
  109. self.bet = 0
  110.  
  111.  
  112. class Deck(object):
  113. def __init__(self, num_of_decks):
  114. self.cards = []
  115. self.rand = Random()
  116. for deck_num in range(num_of_decks * 4):
  117. self.cards.extend(range(2, 11))
  118. self.cards.extend(['J'] * 4 * num_of_decks)
  119. self.cards.extend(['Q'] * 4 * num_of_decks)
  120. self.cards.extend(['K'] * 4 * num_of_decks)
  121. self.cards.extend(['A'] * 4 * num_of_decks)
  122.  
  123. def get_card(self):
  124. card_num = self.rand.randint(0, len(self.cards) - 1)
  125. card = self.cards[card_num]
  126. del self.cards[card_num]
  127. return card
  128.  
  129.  
  130. class Player(object):
  131. def __init__(self, deck):
  132. self.cards = []
  133. self.deck = deck
  134.  
  135. def draw_card_from_deck(self):
  136. self.cards.append(self.deck.get_card())
  137.  
  138. def get_sum_of_cards(self):
  139. sum_of_cards = 0
  140. aces = 0
  141. for card in self.cards:
  142. # Each one of the faces card is 10
  143. if card is 'J' or card is 'Q' or card is 'K':
  144. sum_of_cards += 10
  145. elif card is 'A':
  146. aces += 1
  147. elif card is 'X':
  148. # Hidden card
  149. continue
  150. else:
  151. sum_of_cards += card
  152. # We need to see how to handle aces
  153. if aces > 0:
  154. temp_sum = 11 + (aces - 1) + sum_of_cards
  155. if temp_sum <= 21:
  156. sum_of_cards = temp_sum
  157. else:
  158. sum_of_cards += aces
  159. return sum_of_cards
  160.  
  161. def get_cards(self):
  162. return self.cards
  163.  
  164.  
  165. class MachinePlayer(Player):
  166.  
  167. def __init__(self, deck):
  168. super(MachinePlayer, self).__init__(deck)
  169. self.hidden_card = None
  170.  
  171. def should_take_another_card(self, player):
  172. if self.get_sum_of_cards() < 17 or\
  173. (self.get_sum_of_cards() is 17 and
  174. self.cards.count('A') is 1):
  175. return True
  176. return False
  177.  
  178. def draw_card_from_deck(self):
  179. if len(self.cards) is 1 and self.hidden_card is None:
  180. # The second card should be hidden
  181. self.hidden_card = self.deck.get_card()
  182. self.cards.append('X')
  183. elif self.hidden_card is not None:
  184. # At the third time, the hidden card is shown
  185. self.cards.remove('X')
  186. self.cards.append(self.hidden_card)
  187. self.hidden_card = None
  188. else:
  189. self.cards.append(self.deck.get_card())
  190.  
  191.  
  192. class Result(object):
  193.  
  194. def __init__(self, machine, player):
  195. self.machine = machine
  196. self.player = player
  197. self._player_surrended = False
  198.  
  199. def calculate(self, no_more_moves=False):
  200. if self._player_surrended:
  201. self.winner = "dealer"
  202. self.result_type = "surrended"
  203. self.is_ended = True
  204. self._player_surrended = False
  205. return self
  206.  
  207. player_score = self.player.get_sum_of_cards()
  208. dealer_score = self.machine.get_sum_of_cards()
  209.  
  210. self.is_ended = False
  211. self.winner = None
  212. if player_score is 21 and dealer_score is not 21:
  213. self.winner = "player"
  214. self.result_type = "21"
  215. elif dealer_score is 21 and player_score is not 21:
  216. self.winner = "dealer"
  217. self.result_type = 21
  218. elif dealer_score > 21 and player_score <= 21:
  219. self.winner = "player"
  220. self.result_type = "busting"
  221. elif player_score > 21 and dealer_score <= 21:
  222. self.winner = "dealer"
  223. self.result_type = "busting"
  224. elif no_more_moves:
  225. if player_score > dealer_score:
  226. self.winner = "player"
  227. self.result_type = "score"
  228. elif dealer_score > player_score:
  229. self.winner = "dealer"
  230. self.result_type = "score"
  231. elif dealer_score is player_score:
  232. self.winner = "tie"
  233. self.result_type = "push"
  234. if self.winner is not None:
  235. self.is_ended = True
  236. return self
  237.  
  238. def player_surrended(self):
  239. self._player_surrended = True
  240.  
  241.  
  242. class Game(object):
  243.  
  244. def __init__(self, bookie, num_of_decks=4):
  245. self.deck = Deck(num_of_decks)
  246. self.round = 0
  247. self.bookie = bookie
  248.  
  249. def print_status(self):
  250. self.round += 1
  251. print color("white") + "Round {0}".format(self.round)
  252. print "Dealer got {0} ({1})".format(self.machine.get_cards(),
  253. self.machine.get_sum_of_cards())
  254. print "You got {0} ({1})".format(self.player.get_cards(),
  255. self.player.get_sum_of_cards())
  256.  
  257. def start_game(self):
  258. self.machine = MachinePlayer(self.deck)
  259. self.player = Player(self.deck)
  260. self.result = Result(self.machine, self.player)
  261.  
  262. self.player.draw_card_from_deck()
  263. self.machine.draw_card_from_deck()
  264.  
  265. self.player.draw_card_from_deck()
  266. self.machine.draw_card_from_deck()
  267. self.print_status()
  268.  
  269. def is_game_ended(self, no_more_moves=False):
  270. if self.result.calculate(no_more_moves).is_ended:
  271. if self.result.winner is "player":
  272. print color("green")
  273. self.bookie.report_win()
  274. elif self.result.winner is "dealer":
  275. print color("red")
  276. self.bookie.report_lose()
  277. elif self.result.winner is "tie":
  278. print color("yellow")
  279. self.bookie.abort_bet()
  280. if self.result.winner is not "tie":
  281. print "{0} won due to {1}".\
  282. format(self.result.winner, self.result.result_type)
  283. else:
  284. print "Push"
  285. return self.result.is_ended
  286.  
  287. def dealer_turn(self):
  288. self.machine.draw_card_from_deck()
  289. self.print_status()
  290. while self.machine.should_take_another_card(self.player):
  291. self.machine.draw_card_from_deck()
  292. self.print_status()
  293.  
  294. def give_hint(self):
  295. def normalize(card):
  296. if card == "J" or card == "Q" or card == "K":
  297. return str(10)
  298. return str(card)
  299.  
  300. tuple_sum = str(self.player.get_sum_of_cards()),
  301. card1 = normalize(self.player.cards[0])
  302. card2 = normalize(self.player.cards[1])
  303. tuple_cards = tuple(sorted([card1, card2]))
  304. if tuple_cards in hint_table:
  305. hint_raw = hint_table[tuple_cards]
  306. elif tuple_sum in hint_table:
  307. hint_raw = hint_table[tuple_sum]
  308. else:
  309. return "No hint found"
  310. return hint_raw.get(normalize(self.machine.cards[0]))
  311.  
  312. def player_turn(self):
  313. first = True
  314. ans = None
  315. while self.player.get_sum_of_cards() < 20 and ans != "s":
  316. if first:
  317. ans = raw_input(color("yellow") + "[H]it, [s]tand, su[r]render,\
  318. [d]ouble or h[e]lp?: ")
  319. else:
  320. ans = raw_input(color("yellow") + "[H]it or [s]tand?: ")
  321. if ans == "h":
  322. self.player.draw_card_from_deck()
  323. self.print_status()
  324. elif ans == "e" and first:
  325. print "The hint is: {0}".format(self.give_hint())
  326. # He can still use the first round options
  327. continue
  328. elif ans == "d" and first:
  329. self.bookie.double_bet()
  330. self.player.draw_card_from_deck()
  331. print "Betting on ${0}".format(self.bookie.bet)
  332. self.print_status()
  333. break
  334. elif ans == "r" and first:
  335. self.result.player_surrended()
  336. self.bookie.half_bet()
  337. break
  338. else:
  339. # In case no valid answer we want
  340. # The first status to be kept
  341. continue
  342. first = False
  343.  
  344. def place_bet(self):
  345. bet = None
  346. while True:
  347. ans = raw_input(color("white") + "How much would you like to bet? \
  348. (1, 5, 10, 50, 100, [s]ame): ")
  349. if ans is 's' or ans is '':
  350. if self.bookie.previous_bet is None:
  351. print "No previous bet was made"
  352. continue
  353. if self.bookie.credit < self.bookie.previous_bet:
  354. print "You don't have enough credit for this bet"
  355. continue
  356. bet = self.bookie.previous_bet
  357. break
  358. try:
  359. bet = int(ans)
  360. except:
  361. print "{0} is not a valid bet".format(ans)
  362. continue
  363. if [1, 5, 10, 50, 100].count(bet) is not 1:
  364. print "{0} is not a valid bet".format(ans)
  365. continue
  366. elif bet > self.bookie.credit:
  367. print "You only have {0} in credit".format(self.bookie.credit)
  368. continue
  369. break
  370. print "Betting on: ${0}".format(bet)
  371. self.bookie.place_bet(bet)
  372.  
  373. def play(self):
  374. self.place_bet()
  375. self.start_game()
  376. if self.is_game_ended(no_more_moves=False):
  377. return
  378. self.player_turn()
  379. if self.is_game_ended(no_more_moves=False):
  380. return
  381. self.dealer_turn()
  382. if self.is_game_ended(no_more_moves=True):
  383. return
  384.  
  385.  
  386. class GameSimulator(Game):
  387.  
  388. bet = 100
  389.  
  390. def player_turn(self):
  391. first = True
  392. ans = None
  393. while self.player.get_sum_of_cards() < 20 and ans != "s":
  394. if first:
  395. ans = self.give_hint()
  396. first = False
  397. else:
  398. if self.player.get_sum_of_cards() <= 12:
  399. ans = "h"
  400. else:
  401. ans = "s"
  402. if ans == "h":
  403. self.player.draw_card_from_deck()
  404. self.print_status()
  405. elif ans == "d":
  406. self.bookie.double_bet()
  407. self.player.draw_card_from_deck()
  408. print "Betting on ${0}".format(self.bookie.bet * 2)
  409. self.print_status()
  410. elif ans == "r":
  411. self.result.player_surrended()
  412. self.bookie.half_bet()
  413. else:
  414. ans = "s"
  415.  
  416. def place_bet(self):
  417. print "Betting on: ${0}".format(self.bet)
  418. self.bookie.place_bet(self.bet)
  419.  
  420.  
  421. def main():
  422. bookie = Bookie(credit=500)
  423. top_credit = bookie.credit
  424. games_played = 0
  425. print color("green") + "Your initial credit: {0}".format(bookie.credit)
  426. if "s" == raw_input("[S]imulator or [r]eal? "):
  427. while True:
  428. games_played += 1
  429. game = GameSimulator(bookie)
  430. game.play()
  431. if bookie.credit > top_credit:
  432. top_credit = bookie.credit
  433. print color("white") + "Your current credit: {0}".format(bookie.credit)
  434. if bookie.credit <= 0:
  435. print color("red") + "Man, you just lost everything..."
  436. break
  437.  
  438. else:
  439. while True:
  440. games_played += 1
  441. game = Game(bookie)
  442. game.play()
  443. if bookie.credit > top_credit:
  444. top_credit = bookie.credit
  445.  
  446. print color("white") + "Your current credit: {0}".format(bookie.credit)
  447. if bookie.credit > 0:
  448. if "n" == raw_input("Should we play another? (y/n): "):
  449. break
  450. else:
  451. print color("red") + "Man, you just lost everything..."
  452. break
  453. print color("white") + "{0} games were played".format(games_played)
  454. print color("white") + "Your top credit was {0}".format(top_credit)
  455. print "End of game"
  456.  
  457.  
  458. if __name__ == "__main__":
  459. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement