Blackjack str迭代错误

时间:2018-02-25 22:28:18

标签: python blackjack

我正在将数组转换为要打印的字符串,但编译器仍然说不可迭代。

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

2 个答案:

答案 0 :(得分:1)

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

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

这是令人担忧的,因为他们的手应该是一个清单。因此,当您尝试迭代它以计算总数时,您会得到一个int不可迭代。

应该是

之类的东西
dealerHand = []

此外,在此之后的几行,当你认为是dealerHand!=0

时,你问total(dealerHand)是否#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

您还应该小心将其中的变量从列表更改为int的其他分配,例如

<f:SimpleForm id="phoneFormSimple" editable="true" layout="ResponsiveGridLayout" title="Phone Numbers" columnsM="1" columnsL="1">
    <f:content>
        <core:Title text="Business Phone"/>
        <Label text="Number" design="Bold">
            <layoutData>
                <l:GridData span="XL2 L2 M2 S6"/>
            </layoutData>
        </Label>
        <MaskInput id="businessPhoneNumber" value="{business_phone_number}" placeholder="Enter number..." mask="(CCC) CCC-CCCC"
            placeholderSymbol="_">
            <rules>
                <MaskInputRule maskFormatSymbol="C" regex="[0-9]"/>
            </rules>
            <layoutData>
                <l:GridData span="XL4 L4 M4 S6"/>
            </layoutData>
        </MaskInput>
        <Label text="Extension" design="Bold">
            <layoutData>
                <l:GridData span="XL2 L2 M2 S6"/>
            </layoutData>
        </Label>
        <Input id="businessPhoneExtension" value="{business_phone_extension}">
            <layoutData>
                <l:GridData span="XL4 L4 M4 S6"/>
            </layoutData>
        </Input>
        <core:Title text="Business Fax"/>
        <Label text="Number" design="Bold">
            <layoutData>
                <l:GridData span="XL2 L2 M2 S6"/>
            </layoutData>
        </Label>
        <MaskInput id="buinessFaxNumber" value="{business_fax_number}" placeholder="Enter number..." mask="(CCC) CCC-CCCC" placeholderSymbol="_">
            <rules>
                <MaskInputRule maskFormatSymbol="C" regex="[0-9]"/>
            </rules>
            <layoutData>
                <l:GridData span="XL4 L4 M4 S6"/>
            </layoutData>
        </MaskInput>
    </f:content>
</f:SimpleForm>

因为Python不是强类型,改变给定变量名的类型会导致很多这类问题

答案 1 :(得分:0)

@Stephen给了你直接答案。我建议在你的代码上使用pylint3(或其他一些linter)。它会告诉你这个问题

  

R:170,6:经销商的重新定义从列表到int的类型   (重新定义的可变型)

这将在未来帮助您。