【问题标题】:How can I reduce number of trys left in a game?如何减少游戏中剩余的尝试次数?
【发布时间】:2015-09-23 20:37:14
【问题描述】:

我试图限制一个人在尝试猜测随机数时的尝试次数。我在运行程序时收到此错误代码,但不知道下一步该做什么。

Traceback (most recent call last):
  File "C:/Python27/coding/Guess.py", line 34, in <module>
    main()
  File "C:/Python27/coding/Guess.py", line 24, in main
    trys(userGuess)
  File "C:/Python27/coding/Guess.py", line 29, in trys
    trysLeft -= 1
UnboundLocalError: local variable 'trysLeft' referenced before assignment

代码:

import random    

def main():

    print "Guess a number between 1 and 100."
    randomNumber = random.randint(1,100)
    found = False
    trysLeft = 5

    while not found:

        userGuess = input("Your guess: ")  
        if userGuess == randomNumber:
             print "You got it!"
             found = True

        elif userGuess > randomNumber:
            trys()
            print "Guess lower!"

        else:
            trys()
            print "Guess higher!"

def trys():

    trysLeft -= 1
    print "You have %d trys left." %trysLeft


if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python python-2.7 scope


    【解决方案1】:

    您有 3 个选项来解决此问题:

    • 将 trysLeft 放入全局(不是一个好主意)
    • 将函数 trys() 添加到您的类并将其引用为 self.trysLeft
    • 将变量传递给 trys() 函数。

    【讨论】:

      【解决方案2】:

      您需要将trysLeft 传递给函数才能看到它...

          def trys(trysLeft):
              trysLeft -= 1
              print "You have %d trys left." %trysLeft
              return trysLeft
      

      然后当你打电话给trys ...

      trysLeft = trys(trysLeft)
      

      【讨论】:

        【解决方案3】:

        问题在于您在函数中分配了 trysLeft,因此它假定它具有本地(而不是全局)范围。但是你实际上想要分配全局变量,所以你需要声明 trysLeft 具有全局范围。将您的 trys() 函数更改为以下内容:

        def trys():
            global trysLeft
            trysLeft -= 1
            print "You have %d trys left." %trysLeft
        

        有关详细信息,请参阅FAQ

        FWIW,解决此问题的正确方法是将变量传递给您的函数,而不是使用全局变量,但这超出了您的问题范围。

        【讨论】:

        • 是的,强烈反对全局变量。
        • 非常感谢我知道了!
        • 当然!但是对于学习编程的人来说,为什么代码(所写的)不起作用是令人困惑的。解释传递参数更好,并没有解释为什么第一种方法不起作用的困惑。
        【解决方案4】:
        def trys(self):
            self.trysLeft-=1
        

        应该这样做!

        Self 指的是您当前所在的类的实例。

        类似于 java 中的 this 和 vba 中的 Me

        【讨论】:

        • self 将用于 OP 正在使用的类
        • 确实 OP 不是。它的编码就像意图是一个类一样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多