Search code examples
pythonblackjack

Blackjack str iteration error


I am converting an array into a string to print, but the compiler still says not iterable.

Traceback (most recent call last):
  File "python", line 157, in <module>
  File "python", line 56, in total
TypeError: 'int' object is not iterable

The function total() is located on line 56, if you think it is the problem, but if you run the script, you should find that the function works properly every other instance.

import random
import time 

def makeDeck():
  cards = []
  num = 1
  for card in range(52):
    cards.append(num)
    num += 1
    if num == 13:
      num = 1
  return cards

#def shuffle(cards):
  #for card in cards:
   #num = random.randint(0,51)
    #cards.insert(0, cards[num])
  #return cards

def shuffle(deck):
  for card in deck:
    hold = deck.pop(0)
    deck.insert(random.randint(1,51),hold)
  return deck

def cardToString(hand):
  cardString = []  
  for card in hand:
    if card == 1:
      cardString.append('Ace')
    elif card == 11:
      cardString.append('Jack')
    elif card == 12:
      cardString.append('Queen')
    elif card == 13:
      cardString.append('King')
    else:
      cardString.append(str(card))
  for card in cardString:
    return card

def deal(user,deck):
  hand = []
  for x in range(2):
    hand.append(deck.pop(0))
  return hand

def deal1(user,deck):
  hand = []
  for card in deck:
    hand.append(deck.pop(0))
  return hand

def total(hand):
  score = 0
  for card in hand:
    if(card>10):
      score += 10
    elif(card != 1):
      score += card
    else:
      if(score>=11):
        score+=1
      else:
        score+=11
  return score

#def playGame():
  #to do

name1 = input('Player 1, please enter your name:\n')
p2q = input('Will there be two plaers? (y/n)')

if(p2q == 'y' or p2q == 'Y' ):
  p2yn = 1
  name2 = input('Player 2, please enter your name:\n')
elif(p2q == 'n' or p2q == 'N'):
  p2yn = 0

deck = makeDeck()
shuffle(deck)
p1hand = deal(name1,deck)
if(p2yn == 1):
  p2hand = deal(name2,deck)
else:
  print(end = ' ')
hs=0

print(str(name1)+', your hand is:', end = ' ' )
cardToString(p1hand)
print(str(p1hand[0])+',',p1hand[1], end = ' ')
print('and your total is', total(p1hand))
time.sleep(2)
tot1 = total(p1hand)
while(tot1 < 21):
  p1cvar = input('Would you like another card? (y/n)\n')
  if(p1cvar =='n' or p1cvar == 'N'):
    break
  else:
    p1hand.append(deck.pop(0))
    newCard = str(p1hand[-1])
    cardToString(newCard)
    print('You got a', newCard)
    time.sleep(1)
    print('Your total is now', total(p1hand))
    time.sleep(1)
    if(total(p1hand) <= 21):
      hs = total(p1hand)
    else:
      print('You went over 21!')
      p1hand=0
      time.sleep(1)
      break
if(p1hand != 0):
  print('The high score is', total(p1hand), 'held by', str(name1)+'.')
  time.sleep(1)
shuffle(deck)

if(p2yn == 1):
  print(str(name2)+', your hand is:', end = ' ' )
  cardToString(p2hand)
  print(str(p2hand[0])+',',p2hand[1], end = ' ')
  print('and your total is', total(p2hand))
  time.sleep(2)
  tot1 = total(p2hand)
  while(tot1 < 21):
    p2cvar = input('Would you like another card? (y/n)\n')
    if(p2cvar =='n' or p2cvar == 'N'):
      break
    else:
      p2hand.append(deck.pop(0))
      newCard = str(p2hand[-1])
      cardToString(newCard)
      print('You got a', newCard)
      time.sleep(1)
      print('Your total is now', total(p2hand))
      time.sleep(1)
      if(total(p2hand)>21):
        print('You went over 21!')
        p2hand=0
        time.sleep(1)
        break
  if(p2hand != 0 and total(p2hand)>hs):
    print('The high score is', total(p2hand), 'held by', str(name2)+'.')
    hs = total(p2hand)
  time.sleep(1)

dealerHand = deal('Dealer',deck)

print("The dealer's hand is:", end = ' ' )
cardToString(dealerHand)
print(str(dealerHand[0])+',',dealerHand[1], end = ' ')
print('and their total is', total(dealerHand))
time.sleep(2)
totD = total(dealerHand)
while(totD < 21):
  tdh = total(dealerHand)
  if(tdh<hs and tdh<22):
    dealerHand.append(deck.pop(0))
    newCard = str(dealerHand[-1])
    cardToString(newCard)
    print('Dealer got a', newCard)
    time.sleep(.5)
    print("Dealer's total is now", total(dealerHand))
    time.sleep(1)
    if(total(dealerHand) <= 21 and total(dealerHand)>hs):
      hs = total(dealerHand)
    else:
      print('Dealer went over 21!')
      dealerHand=0
  else:
    break
if(dealerHand != 0):
  print('The high score is', total(dealerHand), 'held by', str("Dealer")+'.')

while(total(p1hand)>21 or total(dealerHand)>21):
  if(total(dealerHand)>21):
    print('Dealer has been eliminated from play!')
  elif(total(p1hand)>21):
    print(name1,'has been eliminated from play!')

Solution

  • About 11 lines up from the bottom of your code block, you are setting the dealers hand to 0:

     ....
     else:
          print('Dealer went over 21!')
          dealerHand=0
    

    This is concerning since their hand should be a list. Thus when you try to iterate over it to count the total, you get that an int isn't iteratable.

    Should probably be something like

    dealerHand = []
    

    Also, a few lines after that, you are asking if dealerHand!=0, when I think you mean total(dealerHand)


    You should also be careful with your other assignments that change a variable from a list to an int such as

    #Around line 111
    print('You went over 21!')
    p1hand=0
    time.sleep(1)
    break
    .....
    #Around line 140
    print('You went over 21!')
    p2hand=0
    time.sleep(1)
    break
    

    Because Python is not strongly type, changing the type of a given variable name can lead to a lot of these kinds of problems