Python全局变量干扰?

时间:2013-01-04 14:14:51

标签: python variables global

所以基本上这是我正在制作的一个小字符串游戏的一部分,这真的让我感到茫然。玩家可以按“a”或“d”向左或向右看房间以收集线索。如果玩家已经看过那个地方。它弹出一条消息,说“你已经来过这里”

虽然,它会转到正确的一次,然后下一个点会弹出一条消息,说“你已经在这里”。例。如果我按“a”然后“d”代表“d”它会说我已经去过那里但我没有。任何帮助/建议??

left = 0
right = 0
#Room 1 movements
def roomOneLeft():
    global left
    left = 1
    print '-- You search the rubble and find some cloth'
    return roomOneMoves()

def roomOneRight():
    global right
    right = 1
    print '-- You find a pick under a wooden chair'
    return roomOneMoves()

#room 1 user choose
def roomOneMoves():
    global left
    global right
    move = raw_input("")
    if left == 1:
        print 'you have already been here'
        return roomOneMoves()
    if right == 1:
        print 'you have already been here'
        return roomOneMoves() 
    if move == 'a':
        roomOneLeft()     
    if move == 'd':
        roomOneRight()

roomOneMoves()

编辑:谢谢大家的帮助。如果我的代码非常令人沮丧,我很抱歉!让它现在运作。但只能得到你的帮助。

4 个答案:

答案 0 :(得分:3)

虽然有很多事情可以说对你的代码“不确定”,但你的问题来自于leftright都会被检查,无论玩家做出什么动作。如果您按'a'left变为1.按'd'将检查left是否为1并打印消息。

答案 1 :(得分:2)

浏览代码:

  1. 我们致电roomOneMoves()
  2. 用户按下a,移动变为'a'
  3. left不是1,因此我们不会输入if的分支。
  4. right不是1所以我们不会输入if的那个分支。
  5. move 'a'所以我们致电roomOneLeft()
  6. left变为1,我们会打印一条消息,然后再次致电roomOneMoves()
  7. 用户按dmove变为'd'
  8. left现在为1,因此我们会打印一条消息并再次致电roomOneMoves()
  9. 换句话说,在你决定用户真正想要去哪个房间之前,你正在检查你是否去过一个房间并纾困。

答案 2 :(得分:1)

在为时已晚之前,您不会检查行动。观察:

move = raw_input("")
if left == 1:
    print 'you have already been here'
    return roomOneMoves()
if right == 1:
    print 'you have already been here'
    return roomOneMoves() 
if move == 'a':
    roomOneLeft()     
if move == 'd':
    roomOneRight()

如果用户实际离开,您只想评估left == 1部分,不是吗?因此,嵌套if语句,如下所示:

move = raw_input("")
if move == 'a':
    if left:
        print 'you have already been here'
        return roomOneMoves()
    roomOneLeft()
if move == 'd':
    if right:
        print 'you have already been here'
        return roomOneMoves() 
    roomOneRight()

此外,您应该重新考虑您的数据结构,并使用具有布尔值或类似的字典而不是全局变量。另外,由于大多数Python解释器无法有效地评估tail recursion,您可能希望使用迭代主循环而不是递归调用下一个函数。

答案 3 :(得分:0)

问题在于您的roomOneMoves功能:

move = raw_input("")

首先,你得到了用户的指示;你还没有评估它。

if left == 1:
    print 'you have already been here'
    return roomOneMoves()
if right == 1:
    print 'you have already been here'
    return roomOneMoves() 

您检查用户是否曾经向左或向右走,并显示消息,更糟糕的是,您再次启动roomOneMoves

if move == 'a':
    roomOneLeft()     
if move == 'd':
    roomOneRight()

只有在那之后,你才真正评估新的方向。

您应首先评估新方向,并且仅在评估方向是否输入之前:

move = raw_input("")
if move == 'a':
    if left == 1:
        print 'you have already been here'
    else:
        roomOneLeft()
elif move == 'd':
    if right == 1:
        print 'you have already been here'
    else:
        roomOneRight()
roomOneMoves()

此外,您可能希望最后无条件地重新启动该方法。