在我下面的代码中,我运行一个21点游戏,我想用一个函数计算所有手牌(用户或发牌者)。当我运行代码时,没有出现错误,但是当我调用该函数时,不打印总手动值。它简单地写着"This提供you with total of:",数字是空白的。参见下面的代码:
user_name = input("Please enter your name:")
print ("Welcome to the table {}. Let's deal!".format(user_name))
import random
suits = ["Heart", "Diamond", "Spade", "Club"]
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
deck = [(suit, rank) for rank in ranks for suit in suits]
random.shuffle(deck,random.random)
user_hand = []
dealer_hand = []
user_hand.append(deck.pop())
dealer_hand.append(deck.pop())
user_hand.append(deck.pop())
dealer_hand.append(deck.pop())
def handtotal (hand):
total = 0
for rank in hand:
if rank == "J" or "Q" or "K":
total += 10
elif rank == 'A' and total < 11:
total += 11
elif rank == 'A' and total >= 11:
total += 1
elif rank == '2':
total += 2
elif rank == '3':
total += 3
elif rank == '4':
total += 4
elif rank == '5':
total += 5
elif rank == '6':
total += 6
elif rank == '7':
total += 7
elif rank == '8':
total += 8
elif rank == '9':
total += 9
return total
print (total)
print ("Your current hand is {}".format(user_hand))
print ("This provides you with a total of:")
handtotal(user_hand)
把print(total)
放在return total
之后没有多大意义,因为return
会导致函数立即终止,而不会计算返回语句*后面的任何行。相反,尝试在函数定义之外放置一个print
:
print ("This provides you with a total of:")
print(handtotal(user_hand))
*(在某些极端情况下会使用try-except-finally块,但大多数情况下都是这样)
第一个回答你的问题:
没有打印的原因是在打印之前返回了手的值,因此没有进入打印语句。
return total #Stops the function
print (total) #Never gets reached
为什么会发生这种情况?
一种简单的思考方式是,一旦你"返回"一个值,你实际上已经告诉python
"这就是答案,不需要做任何其他事情,你有你想要的"
任何你直接放在return语句后面的东西都会运行。
有多种方法可以解决这个问题:
A) 将print语句移到return语句上方:
print (total)
return (total)
B) 您只需去掉print语句并引用函数的值(这是总数,因为这是返回的值)
return total
print ("Your current hand is {}".format(user_hand))
print ("This provides you with a total of:" + str(handtotal(user_hand)))
您可以只使用str()返回语句,但我假设您希望能够在某个时刻将该值与经销商的值进行比较。
现在来看看你的代码中目前最大的三个问题:
1。您正在使用名称输入。
-这是一个非常糟糕的做法,因为用户必须知道他们应该在答案周围加上引号来表示它是一个字符串。
Please enter your name:russell
Traceback (most recent call last):
File "/test.py", line 1, in <module>
user_name = input("Please enter your name:")
File "<string>", line 1, in <module>
NameError: name 'russell' is not defined
解决方案:使用raw_input()代替。
-这将为您将答案转换为字符串。
2。行:
if rank == "J" or "Q" or "K":
不对照"J"、"Q"one_answers"K"检查rank的值
这实际上意味着:rank == "J"或者"Q"为真或者"K"为真
因为"Q"one_answers"K"都是非空字符串,Python将它们视为True,这意味着现在你的值将始终为20,因为无论如何第一个if语句将始终为True。
你真正想要的是:
if rank in {"J","Q","K"}
但这也不起作用,因为:
3。只是说:
for rank in hand:
不会让它查看rank的实际值。它仍然会查看整个元组。
交货。
等级=(‘钻石’,‘7’)
排名! = ' 7 '
解决方案:你实际上想要反转所有的if语句并使用'in':
if "J" in rank or "Q" in rank or "K" in rank:
total += 10
elif 'A' in rank and total < 11:
total += 11
elif 'A' in rank and total >= 11:
total += 1
...
注:这也只是因为在黑桃、方块、梅花或红心这些单词中没有大写的a、K、Q或J,否则不管实际值是多少,花色总是会得到这张牌的值。但这不是问题