[Tutor] Blackjackbetting

David Merrick merrickdav at gmail.com
Mon Jul 4 01:43:02 CEST 2011


HI. I feel I'm starting to go round in circles solving this problem. I feel
I made significant progress.
Can someone help me iron out the bugs please

# Blackjack
# From 1 to 7 players compete against a dealer

import cards, games

class BJ_Card(cards.Card):
    """ A Blackjack Card. """
    ACE_VALUE = 1

    @property
    def value(self):
        if self.is_face_up:
            v = BJ_Card.RANKS.index(self.rank) + 1
            if v > 10:
                v = 10
        else:
            v = None
        return v

class BJ_Deck(cards.Deck):
    """ A Blackjack Deck. """
    def populate(self):
        for suit in BJ_Card.SUITS:
            for rank in BJ_Card.RANKS:
                self.cards.append(BJ_Card(rank, suit))


class BJ_Hand(cards.Hand):
    """ A Blackjack Hand. """
    def __init__(self, name):
        super(BJ_Hand, self).__init__()
        self.name = name

    def __str__(self):
        rep = self.name + ":\t" + super(BJ_Hand, self).__str__()
        if self.total:
            rep += "(" + str(self.total) + ")"
        return rep

    @property
    def total(self):
        # if a card in the hand has value of None, then total is None
        for card in self.cards:
            if not card.value:
                return None

        # add up card values, treat each Ace as 1
        t = 0
        for card in self.cards:
              t += card.value

        # determine if hand contains an Ace
        contains_ace = False
        for card in self.cards:
            if card.value == BJ_Card.ACE_VALUE:
                contains_ace = True

        # if hand contains Ace and total is low enough, treat Ace as 11
        if contains_ace and t <= 11:
            # add only 10 since we've already added 1 for the Ace
            t += 10

        return t

    def is_busted(self):
        return self.total > 21

class Bet(object):
    """ A Blackjack Gamble. """
    # Values
    def __init__(bet, money = 10):
        stash  = money

    # Betting options
    def betting(bet,stash):
        try:
            if stash > 0:
                wager = int(input("\nHow much do you want to wager?: "))
                if wager > stash:
                    int(input("\n You can only wager what you have. How
much?: "))
                elif wager < 0:
                    int(input("\n You can only wager what you have. How
much?: "))
        except ValueError:
                int(input("\n That's not valid! Choose a number: "))


    # Money Conditions
    def gamble(bet):
        if bet.stash <= 0:
            print("\nYou are out of money! You're out of the game!")



class BJ_Player(BJ_Hand):
    """ A Blackjack Player. """
    stash = 10
    if stash <= 0:
             print("\nYou are out of money! You're out of the game!")

    def is_hitting(self):
        response = games.ask_yes_no("\n" + self.name + ", do you want a hit?
(Y/N): ")
        return response == "y"

    def bust(self,stash,wager):
        print(self.name, "busts.")
        self.lose(self,stash,wager)

    def lose(self,stash,wager):
        print(self.name, "loses.")
        stash = stash - wager
        print("Your stash is: ",stash)
        return stash

    def win(self,stash,wager):
        print(self.name, "wins.")
        stash = stash + wager
        print("Your stash is: ",stash)
        return stash

    def push(self):
        print(self.name, "pushes.")


class BJ_Dealer(BJ_Hand):
    """ A Blackjack Dealer. """
    def is_hitting(self):
        return self.total < 17

    def bust(self):
        print(self.name, "busts.")

    def flip_first_card(self):
        first_card = self.cards[0]
        first_card.flip()


class BJ_Game(object):
    """ A Blackjack Game. """
    def __init__(self, names):
        self.players = []
        for name in names:
            stash = 100
            player = BJ_Player(name)
            playerbet = Bet(stash).betting(stash)
            self.players.append(player)

        self.dealer = BJ_Dealer("Dealer")

        self.deck = BJ_Deck()
        self.deck.populate()
        self.deck.shuffle()

    @property
    def still_playing(self):
        sp = []
        for player in self.players:
            if not player.is_busted():
                sp.append(player)
        return sp

    def __additional_cards(self, player,stash,wager):
        while not player.is_busted() and player.is_hitting():
            self.deck.deal([player])
            print(player)
            if player.is_busted():
                player.bust(self,stash,wager)

    def play(self,stash,wager):
        # deal initial 2 cards to everyone
        self.deck.deal(self.players + [self.dealer], per_hand = 2)
        self.dealer.flip_first_card()    # hide dealer's first card
        for player in self.players:
            print(player)
        print(self.dealer)

        # deal additional cards to players
        for player in self.players:
            self.__additional_cards(player,stash,wager)

        self.dealer.flip_first_card()    # reveal dealer's first

        if not self.still_playing:
            # since all players have busted, just show the dealer's hand
            print(self.dealer)
        else:
            # deal additional cards to dealer
            print(self.dealer)
            self.__additional_cards(self.dealer,stash,wager)

            if self.dealer.is_busted():
                # everyone still playing wins
                for player in self.still_playing:
                    player.win(stash,wager)
            else:
                # compare each player still playing to dealer
                for player in self.still_playing:
                    if player.total > self.dealer.total:
                        player.win(stash,wager)
                    elif player.total < self.dealer.total:
                        player.lose(stash,wager)
                    else:
                        player.push()

        # remove everyone's cards
        for player in self.players:
            player.clear()
        self.dealer.clear()


def main():
    print("\t\tWelcome to Blackjack!\n")
    stash = 0
    wager = 0
    names = []
    number = games.ask_number("How many players? (1 - 7): ", low = 1, high =
8)
    for i in range(number):
        name = input("Enter player name: ")
        names.append(name)
    print()

    game = BJ_Game(names)

    again = None
    while again != "n":
        game.play(stash,wager)
        again = games.ask_yes_no("\nDo you want to play again?: ")


main()
input("\n\nPress the enter key to exit.")

*Output*

Welcome to Blackjack!

How many players? (1 - 7): 1
Enter player name: Dave


How much do you want to wager?: 50
Dave:    Qc    8s    (18)
Dealer:    XX    3d

Dave, do you want a hit? (Y/N): n
Dealer:    Kd    3d    (13)
Dealer:    Kd    3d    Qh    (23)
Traceback (most recent call last):
  File "I:/Python/Python Source Code/chapter09/blackjackBettingB.py", line
229, in <module>
    main()
  File "I:/Python/Python Source Code/chapter09/blackjackBettingB.py", line
225, in main
    game.play(stash,wager)
  File "I:/Python/Python Source Code/chapter09/blackjackBettingB.py", line
188, in play
    self.__additional_cards(self.dealer,stash,wager)
  File "I:/Python/Python Source Code/chapter09/blackjackBettingB.py", line
166, in __additional_cards
    player.bust(self,stash,wager)
TypeError: bust() takes exactly 1 positional argument (4 given)

-- 
Dave Merrick

merrickdav at gmail.com

Ph   03 3423 121
Cell 027 3089 169
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20110704/9a0b47d9/attachment-0001.html>


More information about the Tutor mailing list