所以我决定用Python编写Monopoly,但是我在更新玩家位置时遇到了一些麻烦。我写了一个for循环,遍历玩家,为每个玩家掷骰子,然后更新他们的位置。问题是位置变量没有保留最新位置,它在for循环开始时保持重置为0。这是我的代码:
player1location = 0
def turn(numberPlayers, player, player1location, Board):
for player in range(numberPlayers):
player = 'Player'+str(player+1)
print 'It\'s', player, 'turn!'
print player1location
rollDice = raw_input('Press Enter to roll the dice!')
diceRoll = random.randint(1,6)
print player, 'rolled a', diceRoll
player1location = player1location + diceRoll
print 'You landed on', player1location
print '\n'
while True:
turn(numberPlayers, player, player1location, Board)
如果有必要,我可以提供更多代码,但我认为这是控制玩家位置的所有内容。谢谢!
编辑:显然我正在改变局部变量而不是全局变量。我将如何更改全局变量?
答案 0 :(得分:8)
您的函数参数与要更新的目标变量同名。
因此,您所做的任何更改都是对函数参数进行的,而不是对全局变量进行的。那是因为function
为您传递给函数的参数创建了一个局部范围。因此,它覆盖了全局使用相同名称定义的变量。
因此,要么更改函数参数player1location
的名称,要么更改全局变量的名称。
答案 1 :(得分:1)
请注意,您有两个名为player1location
的变量 - 一个在您的第一行(在任何函数之外)定义全局:player1location = 0
,第二个创建每次调用函数时,本地:def turn(numberPlayers, player, player1location, Board)
。尽管它们具有相同的名称,但它们是python中的两个不同变量,因为它们是在different scopes中定义的。
有几种方法可以解决这个问题。
您可以从函数定义中删除player1location
,然后您将始终更改全局范围的变量。但是,根据你的命名惯例,我猜你也想为其他玩家重复使用这个功能(尽管尝试它仍然没有什么坏处,可以帮助你理解它是如何工作的。)
更好的方法可能是在函数末尾返回新的玩家位置(return player1location
),然后在返回时将其分配给全局范围的位置(player1location = turn(numberPlayers, player, player1location, Board)
)。 / p>