我正在使用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如何在布尔上下文中评估字符串,所以您总是返回
True
。 if 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/