Python全局变量干扰



基本上这是我正在做的一个小字符串游戏的一部分,这让我很兴奋。玩家可以按"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()
谢谢大家的帮助。如果我的代码看起来很令人沮丧,我很抱歉!现在修好了。

尽管你的代码中有很多东西可以说是"不确定的",但你的问题来自于leftright都被检查的事实,而不管玩家做出什么移动。如果你按下'a', left变成1。在它之后按"d"将检查left是否为1并打印消息。

遍历代码:

  1. 我们调用roomOneMoves()
  2. 用户按下a,移动变为'a'
  3. left不是1,所以我们不输入if的分支。
  4. right不是1,所以我们不输入if的分支。
  5. move 等于 'a'所以我们称roomOneLeft()
  6. left变成1,我们打印一条消息,并再次调用roomOneMoves()
  7. 用户按下d, move变为'd'
  8. left现在是1,所以我们打印一条消息并再次调用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() 
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解释器不能有效地计算尾递归,您可能希望使用迭代主循环而不是递归地调用next函数。

问题在于您的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()

另外,您可能希望在结束时无条件地重新启动方法。

相关内容

  • 没有找到相关文章

最新更新