我是Python的新手,所以也许这是一个基本问题。我正在写一个基本的2人二十一点游戏。因此,想法是在开始时生成一副纸牌,玩游戏,如果用户想再次玩,则重新开始while循环。我构建了一个函数来生成和洗牌,像这样:
import random
def deck():
suites = ["Hearts","Diamonds","Clubs","Spades"]
names = [2,3,4,5,6,7,8,9,10,"J","Q","K","A"]
deck = []
for suite in suites:
for name in names:
deck.append((name,suite))
return random.sample(deck,len(deck))
然后在游戏开始时,我会调用一会儿True循环,玩游戏,然后询问用户是否要再次玩,就像这样:
while True:
deck = deck()
# codes to play game here
userinput = input("Play again?")
while not userinput.replace(" ", "") in ["yes","no"]:
userinput = input("Play again?")
if userinput.replace(" ", "") == "no":
break
else:
deck = None
dealer_hand = None
player_hand = None
continue
我知道在Python中为变量分配None是一种将其用作占位符的方法,就像什么都没有一样,因此,当用户选择“是”并执行继续语句时,变量“ deck”将被分配给我先前定义的函数deck()的返回值,但是当我尝试这样做时,Python抛出NoneType是不可调用的。我来自VBA,当循环再次开始时,通常所有分配的变量都将采用新值而不会出现问题,因此这对我来说很难理解。谢谢你的帮助。
答案 0 :(得分:1)
变量“ deck”将被分配给我先前定义的函数deck()的返回值
是的,就是这个问题。 deck = deck()
第一次执行后,该功能eck()将不再可在该范围内访问。您已覆盖其名称。 Python无法推断出deck()
的意思是“用名称存储卡找到一个函数,然后调用它”。它将很乐意尝试调用您提供给它的任何对象,包括那些没有意义的对象,例如deck()
返回的列表,或您在{{中分配给deck
的None对象1}}块。
尝试为变量和函数使用不同的名称。我喜欢给函数名称加上动词。 else
怎么样?