21点str迭代

2024-05-14 12:58:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个数组转换成一个字符串来打印,但是编译器仍然说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

函数total()位于第56行,如果您认为这是问题所在,但是如果您运行脚本,您应该会发现该函数每隔一个实例都能正常工作

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!')

Tags: iniftimeissleepcardtotalprint
2条回答

@斯蒂芬给了你直接的答案。我建议在代码中使用pylint3(或其他linter)。它会告诉你问题的

R:170, 6: Redefinition of dealerHand type from list to int (redefined-variable-type)

这将在将来帮助你

从代码块底部向上大约11行,您将经销商的手设置为0:

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

这是令人担忧的,因为他们的手应该是一个列表。因此,当您尝试迭代它来计算总数时,您会发现int是不可迭代的

应该是这样的

dealerHand = []

还有,在那之后的几行,你问的是dealerHand!=0,而我认为你的意思是total(dealerHand)


您还应该注意将变量从列表更改为int的其他赋值,例如

#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

由于Python不是强类型,因此更改给定变量名的类型可能会导致许多此类问题

相关问题 更多 >

    热门问题