def test_can_play_under_limit(self): """ Branch coverage """ dealer = Dealer() card1 = Card('Hearts', ('2', 2)) card2 = Card('Hearts', ('3', 3)) dealer.add_card(card1) dealer.add_card(card2) self.assertTrue(dealer.can_play())
def test_can_play_over_limit(self): """ Branch coverage """ dealer = Dealer() card1 = Card('Hearts', ('J', 10)) card2 = Card('Hearts', ('3', 3)) card3 = Card('Hearts', ('K', 10)) dealer.add_card(card1) dealer.add_card(card2) dealer.add_card(card3) self.assertFalse(dealer.can_play())
def create_stay_outcomes(desired_iterations): try: stay_outcomes = unpickle_outcomes(STAY_OUTCOMES_FILE, desired_iterations) print "Found pickled run of stay outcomes - returning..." return stay_outcomes except IOError: print "Couldn't find pickled stay_outcomes - creating them..." except PickleError: print "Pickle error - continuing..." stay_outcomes = {"ITERATIONS" : desired_iterations} if KEEP_TIMING: time_map = {"deck shuffling" : 0, "dealer playing": 0, "hand comparison": 0} d = Deck(N_DECKS) dealer = Dealer() for hand_val in range(4, 22): print "HAND VALUE %d" % hand_val stay_outcomes[hand_val] = {} for dealer_upcard in range(1,11): stay_outcomes[hand_val][dealer_upcard] = [0, 0] for i in range(0, desired_iterations): if not i % 10000: print "Iteration %d..." % i has_blackjack = True while has_blackjack: if KEEP_TIMING: start_t = time() d.library_shuffle() if KEEP_TIMING: end_t = time() time_map["deck shuffling"] += end_t - start_t start_t = time() dealer.reset_hand() c1 = d.draw() dealer_upcard = c1 dealer.add_card(c1) dealer.add_card(d.draw()) has_blackjack = dealer.has_blackjack() dealer.play_hand(d) if KEEP_TIMING: end_t = time() time_map["dealer playing"] += end_t - start_t start_t = time() dealer_val = dealer.value() if dealer_val < hand_val or dealer.is_busted(): stay_outcomes[hand_val][c1.hard_value()][0] += 1 elif dealer_val == hand_val: stay_outcomes[hand_val][c1.hard_value()][0] += .5 stay_outcomes[hand_val][c1.hard_value()][1] += 1 if KEEP_TIMING: end_t = time() time_map["hand comparison"] += end_t - start_t start_t = time() pickle_outcomes(stay_outcomes, STAY_OUTCOMES_FILE) return stay_outcomes
def create_stay_outcomes(desired_iterations): try: stay_outcomes = unpickle_outcomes(STAY_OUTCOMES_FILE, desired_iterations) print "Found pickled run of stay outcomes - returning..." return stay_outcomes except IOError: print "Couldn't find pickled stay_outcomes - creating them..." except PickleError: print "Pickle error - continuing..." stay_outcomes = {"ITERATIONS": desired_iterations} if KEEP_TIMING: time_map = { "deck shuffling": 0, "dealer playing": 0, "hand comparison": 0 } d = Deck(N_DECKS) dealer = Dealer() for hand_val in range(4, 22): print "HAND VALUE %d" % hand_val stay_outcomes[hand_val] = {} for dealer_upcard in range(1, 11): stay_outcomes[hand_val][dealer_upcard] = [0, 0] for i in range(0, desired_iterations): if not i % 10000: print "Iteration %d..." % i has_blackjack = True while has_blackjack: if KEEP_TIMING: start_t = time() d.library_shuffle() if KEEP_TIMING: end_t = time() time_map["deck shuffling"] += end_t - start_t start_t = time() dealer.reset_hand() c1 = d.draw() dealer_upcard = c1 dealer.add_card(c1) dealer.add_card(d.draw()) has_blackjack = dealer.has_blackjack() dealer.play_hand(d) if KEEP_TIMING: end_t = time() time_map["dealer playing"] += end_t - start_t start_t = time() dealer_val = dealer.value() if dealer_val < hand_val or dealer.is_busted(): stay_outcomes[hand_val][c1.hard_value()][0] += 1 elif dealer_val == hand_val: stay_outcomes[hand_val][c1.hard_value()][0] += .5 stay_outcomes[hand_val][c1.hard_value()][1] += 1 if KEEP_TIMING: end_t = time() time_map["hand comparison"] += end_t - start_t start_t = time() pickle_outcomes(stay_outcomes, STAY_OUTCOMES_FILE) return stay_outcomes
from deck import Deck from dealer import Dealer dealer = Dealer() deck = Deck(6) N_HANDS = 1000000 dealer_busts = 0 for i in range(0,N_HANDS): deck.shuffle() dealer.reset_hand() dealer.add_card(deck.draw()) dealer.add_card(deck.draw()) dealer.play_hand(deck) if dealer.is_busted(): dealer_busts += 1 print float(dealer_busts) / N_HANDS
class Game(): def __init__(self): self.player = Player() self.dealer = Dealer() self.display = Display(8) self.pot = 0 def print_display(self, wait=False): self.update_display() self.display.print_display() if wait: self.get_continue() def update_display(self, hidden=True): display_list = ["Dealer:", self.dealer.display_hand(), "Score: " + str(self.dealer.get_hand_value()) + " | Pot: " + str(self.pot), "- "*20, "You:", self.player.display_hand(), "Score: " + str(self.player.get_hand_value()) + " | Money: " + str(self.player.score)] for index, string in enumerate(display_list): self.display.set_display(string, index) def start_round(self): self.deck = Deck() self.player.start_game() self.dealer.start_game() self.add_message("Welcome to Blackjack!") self.print_display(True) self.pot = self.player.bet(self.get_input("bet")) self.initial_deal() if self.dealer.has_blackjack() and self.player.has_blackjack(): self.dealer.hidden = False self.push("Both dealer and player have Blackjack.") return self.get_input("hand") elif self.player.has_blackjack(): self.player_wins("You have Blackjack!") return self.get_input("hand") elif self.dealer.has_blackjack(): self.dealer.hidden = False self.dealer_wins("Dealer has Blackjack.") return self.get_input("hand") return self.play() def initial_deal(self): for i in range(2): self.player.add_card(self.deal()) self.print_display(True) self.dealer.add_card(self.deal()) self.print_display(True) def get_input(self, type): self.print_display() if type == "hand": return self.get_hand_input() elif type == "bet": return self.get_bet_input() elif type == "choice": return self.get_stand_or_hit() def get_hand_input(self): if not self.enough_money(): return False while True: string = "Do you want to play another hand? (y/n) > " value = input(string).lower() if value in ("y", "n"): return value self.add_message("Please enter 'y' or 'n'") self.print_display() def get_bet_input(self): while True: bet = input("How much do you want to bet? > ") if bet.isdigit() and bet != "0": if int(bet) > self.player.score: self.add_message("You don't have that much.") self.print_display() continue return int(bet) self.add_message("Please enter a positive integer.") self.print_display() def get_stand_or_hit(self): while True: string = "Do you want to stand, hit, or double down? > " value = input(string).lower() if value in ("stand", "hit", "double down"): return value self.add_message("Please enter 'stand', 'hit', or 'double down'.") self.print_display() def add_message(self, message): self.display.add_messages(message) def get_continue(self): input("Press Enter to continue.") def deal(self): return self.deck.draw() def player_play(self): while True: choice = self.get_input("choice") if choice == "hit": self.player.add_card(self.deal()) if self.player.has_blackjack(): self.add_message("You have Blackjack!") self.print_display(True) return True elif self.player.is_busted(): self.add_message("You have busted.") self.print_display(True) return False continue if choice == "double down": if self.player.score < self.pot: self.add_message("You don't have enough money.") self.print_display(True) continue self.add_message("Doubling down.") self.pot += self.player.bet(self.pot) self.print_display(True) self.player.add_card(self.deal()) if self.player.has_blackjack(): self.add_message("You have Blackjack!") self.print_display(True) return True elif self.player.is_busted(): self.add_message("You have busted.") self.print_display(True) return False return True def dealer_play(self): self.dealer.start_turn() self.print_display(True) while self.dealer.get_hand_value() < 17: self.add_message("Dealer hits.") self.dealer.add_card(self.deal()) if self.dealer.has_blackjack(): self.add_message("Dealer has Blackjack.") self.print_display(True) return if self.dealer.is_busted(): self.add_message("Dealer is busted!") self.print_display(True) return self.print_display(True) self.add_message("Dealer stands.") self.print_display(True) def play(self): if self.player_play(): self.dealer_play() if self.dealer.get_hand_value() == self.player.get_hand_value(): self.push() elif self.dealer.is_busted() or self.player.has_blackjack(): self.player_wins() elif self.dealer.has_blackjack() or self.player.is_busted(): self.dealer_wins() elif self.player.get_hand_value() > self.dealer.get_hand_value(): self.player_wins() else: self.dealer_wins() return (self.get_input("hand") == "y") def run(self): while self.start_round(): pass return True def player_wins(self, message=""): if message: self.add_message(message) self.add_message("You win the hand!") self.print_display(True) pot_multiplier = 2 if self.player.has_blackjack(): pot_multiplier = 3 self.add_message("You won {}!".format(self.pot * pot_multiplier)) self.player.add_score(self.pot * pot_multiplier) self.pot = 0 self.print_display(True) def dealer_wins(self, message=""): if message: self.add_message(message) self.add_message("You lose the hand.") self.print_display(True) self.pot = 0 def push(self, message=""): if message: self.add_message(message) self.add_message("The round is a push.") self.print_display(True) def enough_money(self): if self.player.score < 1: self.add_message("You don't have enough money to continue.") self.add_message("Thank you for playing.") self.print_display(True) return False return True
class Game(object): def __init__(self): self.deck = Deck() self.deck.shuffle() # add two cards to the player hand, and dealer hand self.player = Player() self.dealer = Dealer() for i in range(2): self.player.add_card(self.deck.deal()) self.dealer.add_card(self.deck.deal()) # clear terminal screen and keep print statement at the top def clear(self): os.system('cls' if os.name == 'nt' else 'clear') print("Welcome to Blackjack!") # give player a card from the top of the deck def hit(self): self.player.add_card(self.deck.deal()) # check if the person's score is over 21 def bust(self, person): if person.score() > 21: return True return False # print the player and dealer's cards/score def print_game(self, stay=False): self.clear() print("---------") # if the player has not stayed we still need to hide # one of the dealer's cards if not stay: print("Dealer Showing (One Card is hidden):\n" + self.dealer.visible_card()) print("Points visible: " + self.dealer.visible_score()) # once the player stays we can reveal all of the dealer's cards else: print("Dealer:\n" + str(self.dealer)) print("Points: " + str(self.dealer.score())) print() print("Player:\n" + str(self.player)) print("Points: " + str(self.player.score())) def repl(self): stay = False self.print_game(stay) # print initial state of the game while True: command = input("Do you want to (h)it or (s)tay? ").lower() if command in ['hit', 'h']: self.hit() sleep(1.5) self.print_game(stay) elif command in ['stay', 's']: stay = True else: print("Invalid input.") continue # check if game over if self.bust(self.player): print("\nSorry. You lose.\n") break # if the player stays then it's the dealers turn if stay: # print the dealers hidden card and total score sleep(1.5) self.print_game(stay) while True: if self.dealer.score() < 17: self.dealer.add_card(self.deck.deal()) sleep(1.5) self.print_game(stay) else: break # check if game over if self.bust(self.dealer) or \ self.player.score() > self.dealer.score(): print("\nYou win!\n") break elif self.player.score() == self.dealer.score(): print("\nPush.\n") break else: print("\nSorry. You lose.\n") break
from deck import Deck from dealer import Dealer dealer = Dealer() deck = Deck(6) N_HANDS = 1000000 dealer_busts = 0 for i in range(0, N_HANDS): deck.shuffle() dealer.reset_hand() dealer.add_card(deck.draw()) dealer.add_card(deck.draw()) dealer.play_hand(deck) if dealer.is_busted(): dealer_busts += 1 print float(dealer_busts) / N_HANDS
print('**********************************************') print('\nHere are the rules:\n\ Get as close to 21 as you can without going over\n\ Dealer hits until they reach 17 \n\ Aces count as 1 or 11\n') # Create & shuffle the deck, deal two cards to each player deck = Deck(suits, ranks, values) deck.shuffle() player = Player() player.add_card(deck.deal()) player.add_card(deck.deal()) dealer = Dealer() dealer.add_card(deck.deal()) dealer.add_card(deck.deal()) # Set up the Player's chips (this occurs when the player is initialized.. not needed) # Prompt the Player for their bet player.ask_for_bet() # Show cards (but keep one dealer card hidden) player.show_all() dealer.show_some() while playing: # recall this variable from our hit_or_stand function # Prompt for Player to Hit or Stand playing = player.hit_or_stand(deck)