0

我正在尝试制作二十一点游戏。我已经制作了抽牌和检查手牌总和是否超过 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'未定义错误

所以这一切都归结为:

  1. 如何使"hand_%d" % x global ?

  2. 有更好的方法吗?

4

3 回答 3

2

是的,有更好的方法。只需创建一个列表列表。如果可能的话,应该省略使用 vars。它真的很难阅读和调试,你最近会后悔这种态度。当您创建一个类似 的列表players -> hand -> cards,甚至是players['player1'][3]玩家的三分之一卡之类的玩家字典时,您会对此感到更加满意。

于 2011-09-29T07:13:08.853 回答
0

是的,可以这样做。代替

vars()["hand_%d" % x] = []

globals()["hand_%d" % x] = []

但是请注意,此解决方案有点骇人听闻,很容易导致问题(维护困难,无法跟踪自发创建的变量等)

于 2013-07-08T03:10:07.797 回答
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() 添加键并不一定会更新本地变量表(这就是您收到global name hand_1 is not defined错误的原因 -vars()[ "hand_1" ]不会hand_1变成局部变量)。

正如 Gandi 所提到的,有更简单的方法来做你想做的事情 - 使用列表或类似的东西。有比创建任意命名的局部变量更传统的方法来解决这个问题。

于 2011-09-29T07:36:36.487 回答