2

所以我决定用 Python 编写 Monopoly,但我在更新玩家位置时遇到了一些麻烦。我编写了一个循环遍历玩家,为每个玩家掷骰子,然后更新他们的位置。问题是 location 变量没有保持最新的位置,它在 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)

如有必要,我可以提供更多代码,但我认为这是控制玩家位置的一切。谢谢!

编辑:显然我正在更改局部变量而不是全局变量。我将如何更改全局变量?

4

2 回答 2

8

您有与要更新的目标变量同名的函数参数。因此,您对函数参数所做的任何更改,而不是全局变量。那是因为function为您传递给函数的参数创建了一个本地范围。因此,它掩盖了全局同名定义的变量。

因此,要么更改函数参数player1location的名称,要么更改全局变量的名称。

于 2013-02-13T16:39:15.703 回答
1

请注意,您有两个变量被调用- 一个在第一行全局player1location定义(在任何函数之外):,第二个在每次调用函数时在本地创建: 。尽管它们具有相同的名称,但它们在 python 中是两个不同的变量,因为它们是在不同的范围中定义的。player1location = 0def turn(numberPlayers, player, player1location, Board)

有几种方法可以解决这个问题。

您可以player1location从函数定义中删除,然后您将始终更改全局范围的变量。但是,根据您的命名约定,我猜您也想为其他玩家重用该功能(尽管尝试它仍然没有坏处,以帮助您了解它的工作原理)。

更好的方法可能是在函数结束时返回新玩家位置 ( return player1location),然后在返回时将其分配给全局范围的位置 ( player1location = turn(numberPlayers, player, player1location, Board))。

于 2013-02-13T16:50:47.643 回答