#python
#python
Вопрос:
Я пытаюсь создать простую игру в угадайку для своего класса с графикой и пытаюсь создать счетчик попыток. Это область, в которой мой код идет не так.
def value():
guess = int(input("Enter your guess: "))
if guess > num:
attempts = attempts 1
turtle.clearscreen()
interface()
tooHigh()
attempt = turtle.Turtle()
attempt.speed(0)
attempt.color("white")
attempt.penup()
attempt.hideturtle()
attempt.goto(-250 , 200)
attempt.write(guess, font=("Courier", 14, "bold"))
value()
elif guess < num:
attempts = attempts 1
turtle.clearscreen()
interface()
tooLow()
attempt = turtle.Turtle()
attempt.speed(0)
attempt.color("white")
attempt.penup()
attempt.hideturtle()
attempt.goto(-250 , 200)
attempt.write(guess, font=("Courier", 14, "bold"))
value()
elif guess == num:
attempts = attempts 1
turtle.clearscreen()
interface()
yes()
attempt = turtle.Turtle()
attempt.speed(0)
attempt.color("pink")
attempt.penup()
attempt.hideturtle()
attempt.goto(-250 , 200)
attempt.write(guess, font=("Courier", 14, "bold", "underline"))
print ("Correct!")
else:
print ("ERROR")
def startScreen():
begin = input("Start the game?: ")
if begin == 'yes':
value()
elif begin == 'instructions':
instructions()
startScreen()
elif begin == 'no':
sys.exit()
else:
print ("Unrecognised answer.")
startScreen()
attempts = 0
num = random.randint(1,1000)
interface()
startScreen()
Ошибка, которую я получаю,:
Traceback (most recent call last):
File "D:DesktopPython ProgramsGame.py", line 154, in <module>
`startScreen()`
File "D:DesktopPython ProgramsGame.py", line 141, in startScreen
`value()`
File "D:DesktopPython ProgramsGame.py", line 110, in value
`attempts = attempts 1`
UnboundLocalError: local variable 'attempts' referenced before assignment
Кажется невозможным перейти attempts
в функцию, поскольку она постоянно вызывает себя, сбрасывая attempts
каждый раз.
Я не уверен, почему это происходит, поэтому буду признателен за любую помощь. Спасибо!
Комментарии:
1. Когда вы назначаете что-то
attempts
где-то в своей функции, Python по умолчанию будет считать это локальным. Но при первом использовании, при попытке вычисленияattempts 1
, ей не было присвоено значение, отсюда и ошибка. Если вы хотите использовать глобальнуюattempts
, вы должны сделать ее явной. Добавьте в начале вашей функцииglobal attempts
.2. Есть ли какая-либо причина, по которой вы хотите отслеживать
attempts
вне функции? если нет, просто перейдитеattempts = 0
к началу функции, чтобы инициализировать локальную переменную в самой функции.
Ответ №1:
Причина, по которой вы получаете эту ошибку, заключается в том, что что-то называется variable scope
. Вы определили переменную attempts
вне функции value
, поэтому функция не распознает какую-либо локальную переменную по имени attempts
, если вы явно не поместите оператор global attempts
в начало своей функции. Это сообщит функции, что вы хотите использовать переменную attempts
, которую вы определили в своей основной программе. Это должно выглядеть так:
def value():
global attempts
#function code
В качестве альтернативы, вы можете разрешить вашей функции value
принимать аргумент и передавать в него переменную attempts
. Это будет выглядеть примерно так:
def value(attempts):
#function code
#you can use the variable attempts as needed, since you're passing it directly into the function
#call the function however you want
attempts = 0
value(attempts)
Комментарии:
1. Ах. Я предположил, что вам нужно было определить переменную непосредственно под
global
. Изменил код, и он работает. Спасибо!
Ответ №2:
В функции, когда вы обращаетесь к переменной для присвоения, она по умолчанию обрабатывается как локальная переменная. Итак, чтобы Python знал, что переменная, которую вы хотите изменить, является глобальной переменной, вы делаете следующее:
def value():
global attempts
# rest of your code
Комментарии:
1. Я подумал об этом, однако функция вызывает себя позже в коде, что означает, что если я определяю
attempts
в функции, она постоянно сбрасывает себя.2. Правильно. Я пропустил ту часть, где вы вызываете
value()
внутри себя. Это действительно сбросило бы счетчик. Итак, да, это должно быть снаружи. Я обновлю ответ.