Python 二十一点程序代码问题。为什么它返回密钥"1"而不是"10"?



我使用python tutor逐步遍历代码,发现user_current_score()中有一个bug。对于cards.get(card),它正在抽取"10";但将其视为1,然后返回None,因为没有1牌。为什么在字典里没有1的时候会看到1呢?我知道我可以做得不同,但我还是想知道为什么它会拉上"10"字。关键字为"1"并返回& None"。如果我注释"10"字典键值对输出,代码到目前为止没有问题。如果它取出一个10,我得到这个错误:

10

None
Traceback (most recent call last):
File "main.py", line 146, in <module>
user_current_score()
File "main.py", line 133, in user_current_score
user_score += cards.get(card)
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'

K
10

10
None
Traceback (most recent call last):
File "main.py", line 146, in <module>
user_current_score()
File "main.py", line 133, in user_current_score
user_score += cards.get(card)
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
 

代码:

import random
cards = {
"A":11,
"2":2,
"3":3,
"4":4,
"5":5,
"6":6,
"7":7,
"8":8,
"9":9,
"10":10,
"J":10,
"Q":10,
"K":10
}
user_hand = []
comp_hand = []
comp_score = 0
temp_hand = []
translation = {39: None}
def deal_card():
temp_hand = []
temp_hand = random.choice(list(cards))
print(temp_hand) #for testing, needs removed
return temp_hand
def user_current_score():
user_score = 0
for card in user_hand:
print(cards.get(card))  #for testing, needs removed
user_score += cards.get(card)
print("Your cards:", str(user_hand).translate(translation) + f", current score: {user_score}")
return user_score
def comp_current_score():
comp_score = 0
for card in comp_hand:
comp_score += cards.get(card)
return comp_score  
while len(user_hand) < 5:
user_hand += deal_card() 
print(" ")
user_current_score()

问题是您将卡片名称连接为字符串。因此,如果你手中的牌是2,10,7,那么user_hand的值将是字符串"2107"

然后你做

for card in user_hand:

这遍历字符串中的字符,因此第二张牌将是1,而不是10。由于cards字典中没有键1,因此您会得到一个错误。

你应该让user_hand成为一个列表而不是一个字符串,或者使用一个1个字符的名称作为10,例如T,这样user_hand中的每个字符将对应于一张卡。

您还应该使用cards[card]而不是cards.get(card)None的默认值是没有用的,所以如果有东西传递了一个无效的卡片,你也可以得到一个KeyError

您应该使用append方法来添加值到您的列表

当您尝试使用str(超过1个字符)的+=列表时,您实际上是将此str拆分为字符并按顺序附加它们。

试试这个:

while len(user_hand) < 5:
user_hand.append(deal_card()) 

相关内容

  • 没有找到相关文章