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())
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #8
0
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)