我正在使用Python,并且试图编写一个简单的程序来模拟石头,纸,剪刀的游戏。一切正常,除了当我收到此错误时输入无效响应(不是石头,纸张或剪刀)时。

Traceback (most recent call last):
File "C:/Users/home/Desktop/BAGARDNER/Python/rock_pape_scissors.py", line 88, in <module>
main()
File "C:/Users/home/Desktop/BAGARDNER/Python/rock_pape_scissors.py", line 14, in main
number = user_guess()
File "C:/Users/home/Desktop/BAGARDNER/Python/rock_pape_scissors.py", line 48, in user_guess
return number
UnboundLocalError: local variable 'number' referenced before assignment


我知道这是在告诉我未引用数字,但是从我对代码的了解来看,当限定符为false时,它不需要数字。

#import random module
import random
#main function
def main():
    #intro message
    print("Let's play 'Rock, Paper, Scissors'!")
    #call the user's guess function
    number = user_guess()
    #call the computer's number function
    num = computer_number()
    #call the results function
    results(num, number)

#computer_number function
def computer_number():
    #get a random number in the range of 1 through 3
    num = random.randrange(1,4)
    #if/elif statement
    if num == 1:
        print("Computer chooses rock")
    elif num == 2:
        print("Computer chooses paper")
    elif num == 3:
        print("Computer chooses scissors")
    #return the number
    return num

#user_guess function
def user_guess():
    #get the user's guess
    guess = input("Choose 'rock', 'paper', or 'scissors' by typing that word. ")
    #while guess == 'paper' or guess == 'rock' or guess == 'scissors':
    if is_valid_guess(guess):
        #if/elif statement
        #assign 1 to rock
        if guess == 'rock':
            number = 1
        #assign 2 to paper
        elif guess == 'paper':
            number = 2
        #assign 3 to scissors
        elif guess == 'scissors':
            number = 3
        return number
    else:
        print('That response is invalid.')
        user_guess()

def is_valid_guess(guess):
    if guess == 'rock' or 'paper' or 'scissors':
        status = True
    else:
        status = False
    return status

def restart():
    answer = input("Would you like to play again? Enter 'y' for yes or \
    'n' for no: ")
    #if/elif statement
    if answer == 'y':
        main()
    elif answer == 'n':
        print("Goodbye!")
    else:
        print("Please enter only 'y' or 'n'!")
        #call restart
        restart()

#results function
def results(num, number):
    #find the difference in the two numbers
    difference = num - number
    #if/elif statement
    if difference == 0:
        print("TIE!")
        #call restart
        restart()
    elif difference % 3 == 1:
        print("I'm sorry! You lost :(")
        #call restart
        restart()
    elif difference % 3 == 2:
        print("Congratulations! You won :)")
        #call restart
        restart()

main()


谢谢您的帮助!

最佳答案

这是您的问题:

if guess == 'rock' or 'paper' or 'scissors':


is_valid_guess中的这一行不执行您认为的操作。相反,它总是返回True。您正在寻找的是这样的:

if guess == 'rock' or guess == 'paper' or guess == 'scissors':


或更简而言之:

if guess in ('rock', 'paper', 'scissors'):




问题在于,由于Python如何在布尔上下文中评估字符串,所以您总是返回Trueif guess == 'rock' or 'paper' or 'scissors':行的计算结果为:

if (guess == 'rock') or ('paper') or ('scissors'):


这意味着Python检查是否为guess == 'rock'。如果是这样,则条件评估为True。如果为假,则解释器尝试评估bool('paper')。由于all non-empty strings are "truthy",它始终计算为True。因此,您的整个条件始终为True,并且每个字符串均为“有效”。

结果,您的代码将所有字符串视为“有效”,然后在未能为实际不支持的猜测分配数字时失败。



最后一点,由于您只是返回布尔表达式的结果,因此您可以对is_valid_guess方法进行一些调整。不必使用status变量作为中间变量,您只需计算表达式并将其立即返回即可。我还使用字符串对象的lower()方法来进行不区分大小写的猜测,以防您要允许这种情况。

def is_valid_guess(guess):
    return guess.lower() in ('rock', 'paper', 'scissors')




您在注释中提到了另一个问题:您已经以递归方式实现了user_guess,以便在用户输入无效猜测时它会自行调用。但是,在这种情况下,它不会返回递归调用的结果。您需要通过将user_guess的最后一行更改为以下内容来返回递归结果:

return user_guess()


否则,您应该使该函数使用循环而不是递归,这是我会做的,因为该函数不是天生的递归。您可以执行以下操作:

def user_guess():
    # get first guess
    guess = input("Choose 'rock', 'paper', or 'scissors' by typing that word. ")

    # If that guess is invalid, loop until we get a valid guess.
    while not is_valid_guess(guess):
        print('That response is invalid.')
        guess = input("Choose 'rock', 'paper', or 'scissors' by typing that word. ")

    # Now assign the (valid!) guess a number
    # This dictionary is just shorthand for your if/elif chain.
    guess_table = {
        'rock' : 1,
        'paper' : 2,
        'scissors' : 3
    }

    # Return the number associated with the guess.
    return guess_table[guess.lower()]

关于python-3.x - Python石头,纸,剪刀游戏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18969772/

10-12 18:11
查看更多