Creating an Object in Python

It says Deck isn’t defined:

import random


class Card:
  def __init__(self, value, suit):
    self.value = value
    self.suit = suit

  def __str__(self):
    return str(self.value) + " of " + self.suit


##twoheart = Card(2, "Hearts")
##fiveclub = Card(5, "Clubs")
# sixdia = Card(6, "Diamonds")
# jspade = Card("J", "Spades")

# print (twoheart)
# print (fiveclub)
# print (sixdia)
# print (jspade)


class Deck:
  def __init__(self):
    self.deck = []
    self.suits = ["Hearts, Diamonds, Clubs, Spades"]
    for i in range(4):
      for j in range(14):
        card = Card(j, self.suits[i])
        self.deck.append(card)

  def __str__(self):
    for i in range(len(self.deck) - 1):
      print(str(self.deck[i]) + "\n")

  def drawCard(self):
    if len(self.deck) == 0:
      print("No cards left to draw")
    else:
      self.deck.pop()

  def shuffle(self):
    reorder = []

    for i in range(len(self.deck) - 1):
      rand = random.randint(0, len(self.deck) - 1)
      reorder.append(self.deck[rand])
      self.deck.remove(self.deck[rand])
    self.deck = reorder

  ###

  deckacards = Deck()

  print(deckacards)

  print(deckacards.shuffle())

  print(deckacards)

  print(deckacards.drawCard())

deckacards = Deck and class Deck: are the two lines of code pointed out

Welcome to the forums!

In your code, the creation of an instance of the Deck class is created inside the Deck class.

To fix this, you should remove the indentation from the lines of code that create an instance of a class and use this class.
The code should look like this:

import random


class Card:
    def __init__(self, value, suit):
        self.value = value
        self.suit = suit

    def __str__(self):
        return str(self.value) + " of " + self.suit


class Deck:
    def __init__(self):
        self.deck = []
        self.suits = ["Hearts, Diamonds, Clubs, Spades"]
        for i in range(4):
            for j in range(14):
                card = Card(j, self.suits[i])
                self.deck.append(card)

    def __str__(self):
        for i in range(len(self.deck) - 1):
            print(str(self.deck[i]) + "\n")

    def drawCard(self):
        if len(self.deck) == 0:
            print("No cards left to draw")
        else:
            self.deck.pop()

    def shuffle(self):
        reorder = []

        for i in range(len(self.deck) - 1):
            rand = random.randint(0, len(self.deck) - 1)
            reorder.append(self.deck[rand])
            self.deck.remove(self.deck[rand])

        self.deck = reorder

###

deckacards = Deck()

print(deckacards)

print(deckacards.shuffle())

print(deckacards)

print(deckacards.drawCard())
1 Like

Well, there is some issue with your deck class.
Here is the correct code for what you are looking for.

import random


class Card:
    def __init__(self, value, suit):
        self.value = value
        self.suit = suit

    def __str__(self):
        return str(self.value) + " of " + self.suit


class Deck:
    def __init__(self):
        self.deck = []
        self.suits = ["Hearts", "Diamonds", "Clubs", "Spades"]
        for i in range(4):
            for j in range(1, 14):
                card = Card(j, self.suits[i])
                self.deck.append(card)

    def __str__(self):
        deck_string = ""
        for card in self.deck:
            deck_string += str(card) + "\n"
        return deck_string

    def drawCard(self):
        if len(self.deck) == 0:
            print("No cards left to draw")
        else:
            return self.deck.pop()

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


deck = Deck()
print(deck)

deck.shuffle()
print(deck)

I hope you will get the desired result.
Thanks

1 Like