2 回答

TA贡献1777条经验 获得超10个赞
您不是在玩家选择站立后检查结果。由于您只deal()在while True循环之前一次,如果您选择重复站立,您只会得到无限条件。庄家抽完所有牌后计算分数。
def hit_stand(deck, player, dealer, hand, stand):
print("What would you like to do")
print("[1] - Hit\n[2] - Stand")
choice = input("> ")
hand = False
if choice == '1':
player.append(deck.pop())
elif choice == '2':
stand = True
while score(dealer) <= 16:
print(score(dealer))
dealer.append(deck.pop())
display_info(player, dealer, stand)
results(player, dealer, first_hand, stand) # HERE
顺便说一句,在确定最终得分后退出游戏并不是很优雅。你会想看看比一个更好的结构while True:,并sys.exit()以控制流,但是这是你的一个锻炼。
最后,您不应该sum在内部用作变量名,score()因为这是您正在重新定义的内置函数。使用类似的东西,total这样你就不会冒着掩盖内置函数本身的风险。

TA贡献1794条经验 获得超8个赞
我想添加另一个注释,因为我认为这是关于 Python 如何工作的一个非常重要的点。这是具有 C/C++/Java 背景的人(即我们几乎所有人)在使用 Python 时需要取消学习的东西。
正如我在上面的评论中所述,在 Maria Laura 的原始代码中,似乎调用hit_stand
是打算使用某些变量(例如stand
)作为输出变量,而在 Python 中,我们不能在函数调用中使用“输出变量” . 但是 Maria Laura 提到“命中效果很好”,这意味着参数player
正在被修改。那么,如果我们不能有“输出变量”,那么为什么player
函数修改了值hit_stand
?
当代码调用 时hit_stand
,会向函数传递五个对象:
一个名为 的列表对象
deck
,一个名为 的列表对象
player
,一个名为 的列表对象
dealer
,一个布尔对象,命名为
hand
,一个布尔对象,命名为
stand
此函数外的代码也有(deck, player, dealer, first_hand, standing)
指向这五个相同对象的名称。内的代码hit_stand
的.append()
方法,呼吁player
和dealer
列表对象和.pop()
方法被称为上deck
对象,所以所有的对象都发生突变。来自调用范围的名称仍然指向那些相同的对象,因此这些名称现在将看到这些更改。
这个故事的hand
和stand
是不同的。在hit_stand
函数内部,hand
并stand
使用=
运算符分配新值。正如Fredrik Lundh 的这篇优秀文章所述=
,Python 中的运算符不会“更改”变量,它只需要一个对象并将其绑定到一个名称。 对象本身没有改变,而是被新的布尔对象替换了。所以standing
外部作用域中的变量仍然指向它原来的布尔对象,而stand
函数内部的变量指向的是一个全新的布尔对象,与外部作用域中的不同。没有什么我们可以做的变量hand
和stand
这将在外部范围内看到,不能像我们在其他语言中那样存在“通过引用传递”或“输出参数”之类的东西。
这是一个起初看起来很陌生的概念,直到我们忘记在 C/C++/Java 教育中学到的东西。
添加回答
举报