Python. Счетчик цикла while
Обучаюсь кодингу на Python, решил написать небольшую игру по отгадыванию случайного числа:
print("Здравствуйте! Мы предлагаем поиграть в отгадывание числа." \
"\nПрограмма загадает случайное число от 1 до 100." \
"\nПопробуйте отгадать число за наименьшее число попыток," \
"\nа мы будем подсказывать, больше или меньше предложенное Вами число.")
number = 5
guess = int(input("\nВаша догадка: "))
tries = 1
while guess != number:
tries += 1
if guess > number:
guess = int(input("Ваше число больше загаданного, попробуйте ещё раз: "))
if guess < number:
guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))
print("Поздравляем! Вы отгадали число с", tries, "попытки.")
В целом код отлично работает, но счетчик попыток часто дает сбой. Экспериментальным путем с использованием заранее известного числа, например, number = 5, выяснилось, что счетчик начинает работать некорректно при определенной последовательности вводимых чисел больше или меньше.
То есть, если 5 раз подряд ответить неверно guess = 4, например, и на 6 раз ответить правильно, счетчик будет работать как надо. Так же будет и если 5 раз подряд ответить неверно guess = 6, счетчик будет работать верно.
Но при различных комбинациях больше и меньше счетчик выдает число меньше на 1 действительного числа попыток.
Эта ошибка исправляется дублированием tries += 1 в оба if:
while guess != number:
if guess > number:
guess = int(input("Ваше число больше загаданного, попробуйте ещё раз: "))
tries += 1
if guess < number:
guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))
tries += 1
Но эта логическая ошибка не дает мне покоя. Буду очень благодарен объяснению, если оно Вам известно.
Ответы (2 шт):
Представим, что после выполнения строки:
guess = int(input("\nВаша догадка: "))
guess равняется девяти. При первой итерации:
tries += 1
прибавит единицу к счётчику, и попросит ввести новое значение. Предположим, что вы ввели четыре.
if guess < number
будет True, следовательно программа попросит ввести новое значение, выполняя следующую строку:
guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))
При этом, счётчик остался без изменений.
Дело в том, что у вас проверяются оба условия. Грубо говоря, после того как проверяется if guess > number:, пользователь вводит новое число, и потом сразу (итерация цикла не заканчивается при этом), идёт вторая проверка if guess < number:.
Варианты решения вашей проблемы:
- Самый верный:
while guess != number:
tries += 1
if guess > number:
guess = int(input("Ваше число больше загаданного, попробуйте ещё раз: "))
elif guess < number: # можно даже просто else, так как на равенство вы проверяете выше
guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))
Тут используется конструкция if elif. Если выполняется одно из условий, то условия дальше не проверяются.
2.
if guess > number:
guess = int(input("Ваше число больше загаданного, попробуйте ещё раз: "))
continue
if guess < number:
guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))
continue
Тут используется continue, который заканчивает выполнение итерации не прерывая сам цикл.
3.
if guess > number:
st = 'больше'
if guess < number:
st = 'меньше'
guess = int(input("Ваше число " + st + " загаданного, попробуйте ещё раз: "))
Тут мы сначала проверяем оба условия, выбираем подходящую строку, и только потом выводим пользователю сообщение, где он задаёт новое число