我正在尝试制作二十一点游戏。 我已经制作了绘制牌的功能,并检查一手牌中的总和是否超过21,但仅限于3名玩家。这很简单,我有3个名单。
但是我想为N个玩家做这个,所以我想保留我的功能并制作另一个在玩家和他们的手之间切换的功能。
def create_hands():
global total_players
for x in range(1, total_players+1):
vars()["hand_%d" % x] = []
print hand_1
我想创建尽可能多的牌,比如hand_1,hand_2等......对于尽可能多的N个玩家(total_players)
由于上面的代码,我得到全局名称'hand_1'未定义错误
所以这一切都归结为:
如何将“hand_%d”%x 设为全球?
有更好的方法吗?
答案 0 :(得分:2)
是的,还有更好的方法。只需创建一个列表列表。如果可能的话,应该省略使用变量。这真的很难阅读和调试,你最近会后悔这种态度。当您为玩家的三分之一卡创建类似players -> hand -> cards
的列表,甚至是players['player1'][3]
等玩家的词典时,您会对此更加满意。
答案 1 :(得分:0)
您遇到的问题是vars()是locals()的别名,在官方文档中有以下注释:
Note: The contents of this dictionary should not be modified;
changes may not affect the values of local and free variables
used by the interpreter.
换句话说,向vars()添加键 NOT 必然会更新本地var iables表(这就是为什么你会收到global name hand_1 is not defined
错误 - vars()[ "hand_1" ]
不会将hand_1
变成局部变量。
正如Gandi所提到的,有更简单的方法可以做你想要做的事情 - 使用列表或类似的东西。与创建任意命名的局部变量相比,有更多传统的方法来解决这个问题。
答案 2 :(得分:0)
是的, 可以做到这一点。替换
vars()["hand_%d" % x] = []
带
globals()["hand_%d" % x] = []
然而,请注意,这个解决方案有点像hackish,很容易导致问题(维护困难,失去自发创建的变量等等)。