0

I am making a python blackjack game. I have an error in this code which I can't figure out. In the end when I test out the hit function and print the hand, it does not show me the list. Instead, it says [<main.Card object at 0x02F9F5F0>].

Here is my code.

        #Blackjack

import random


suits = ['Clubs', 'Spades', 'Diamonds', 'Hearts']
ranks = ['Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace']
values = {'Two': 2, 'Three': 3, 'Four': 4, 'Five': 5, 'Six': 6, 'Seven': 7, 'Eight': 8, 'Nine': 9, 'Ten': 10, 'Jack': 10, 'Queen': 10, 'King': 10, 'Ace': 11}

game_on = True
class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        return(f'{self.rank} of {self.suit}')


class Deck:

    def __init__(self):
        self.deck = []
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit, rank))

    def __str__(self):
        deck_comp = ''
        for card in self.deck:
            deck_comp += '\n ' + card.__str__()
        return deck_comp

    def shuffle(self):
        random.shuffle(self.deck)

    def deal(self):
        single_card = self.deck.pop()
        return single_card


class Hand:

    def __init__(self):
        self.cards = []  # start with an empty list as we did in the Deck class
        self.value = 0  # start with zero value
        self.aces = 0  # add an attribute to keep track of aces

    def add_card(self, card):
        self.cards.append(card)
        self.value += values[card.rank]
        if card.rank == 'Ace':
            self.aces += 1  # add to self.aces

    def adjust_for_ace(self):
        while self.value > 21 and self.aces:
            self.value -= 10
            self.aces -= 1


class Chips:

    def __init__(self):
        self.total = 100
        self.bet = 0

    def win_bet(self):
        self.chips += self.bet

    def lose_bet(self):
        self.chips -= self.bet





def go_for_bet(chips):
    while True:
        try:
            chips.bet = int(input('Please enter a betting amount: '))
        except TypeError:
            print('Please enter an integer')
            continue
        else:
            if chips.bet > chips.total:
                print(f'You do not have enough chips to bet {chips.bet}')
            else:
                break

def hit(deck, hand):
    hand.add_card(deck.deal())
    hand.adjust_for_ace()

def hit_or_stand(deck, hand):

    while True:
        x = input('Would you like to hit or stand? Say \'h\' or \'s\'')

        if x[0].lower() == 'h':
          hit(deck, hand)

        elif x[0].lower() == 's':
          print('You stand.')

        else:
            print('Try again please')
            continue
        break

deck = Deck()
hand = Hand()

hit(deck, hand)
print(hand.cards)
1
  • 2
    try defining a repr method in your card class Commented Jun 27, 2018 at 6:21

3 Answers 3

2

Either:

class Card:
    def __repr__(self):
        return self.__str__()

Or convert your Card objects to string first:

print([str(x) for x in hand.cards])
Sign up to request clarification or add additional context in comments.

Comments

1

Just to make the difference between __repr__ and __str__ extra clear (:

class Repr:
    def __repr__(self):
        return 'Here I am with __repr__'


class Str:
    def __str__(self):
        return 'Here I am with __str__'

print('Plain:')
print(Repr(), Str())
print('In list:')
print([Repr(), Str()])

>

Plain:
Here I am with __repr__ Here I am with __str__
In list:
[Here I am with __repr__, <__main__.Str object at 0x00000216BC2940F0>]

1 Comment

I guess it was just supposed to show the difference in what happens when you print instances with __repr__ or __str__ defined. I agree it doesn't really show the concepts behind what's going on.
1

it's a class list and only have one item in it. you can print items like:

for i in hand.cards:
    print(i)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.