break, continue и вложенные условия в цикле
Содержание курса
Программа-угадайка с ограниченным числом попыток
Теперь соберём всё вместе: break, continue и вложенный if — в одной рабочей программе.
Задача: программа загадывает число, игрок пытается угадать за несколько попыток. На каждой попытке программа сообщает, больше загаданное число или меньше. Если угадал — победа и выход. Если попытки кончились — проигрыш.
Вот полный код:
secret = 42
max_attempts = 5
guessed = False
for attempt in range(1, max_attempts + 1):
guess = int(input(f"Попытка {attempt} из {max_attempts}. Ваш вариант: "))
if guess == secret:
guessed = True
print("Верно! Вы угадали.")
break
elif guess < secret:
print("Загаданное число больше.")
else:
print("Загаданное число меньше.")
if not guessed:
print(f"Попытки закончились. Загаданное число было {secret}.")
Разберём логику по частям.
Флаг guessed. Перед циклом ставим guessed = False. Этот флаг — единственный способ передать информацию из тела цикла в код после него. Если цикл завершился через break при правильном ответе, флаг будет True. Если цикл дошёл до конца без break — останется False, и блок if not guessed сработает.
Цикл for по числу попыток. range(1, max_attempts + 1) даёт нам числа от 1 до 5 включительно — удобно для вывода номера попытки игроку. Цикл сам ограничивает количество итераций: больше пяти раз тело не выполнится.
Вложенный if/elif/else. На каждой итерации проверяем три случая:
- Угадал → ставим флаг, печатаем победу, вызываем
break. - Ввёл меньше загаданного → подсказка «больше».
- Ввёл больше → подсказка «меньше».
break здесь стоит именно внутри первой ветки if. Если игрок не угадал, break не выполняется, цикл идёт дальше — на следующую итерацию.
Проверка после цикла.
Блок if not guessed стоит уже за пределами цикла и выполняется в любом случае — после break или после естественного конца цикла. Именно поэтому флаг и нужен: он сохраняет результат между циклом и кодом снаружи.
Посмотрим на два сценария выполнения.
Сценарий 1 — игрок угадывает на третьей попытке:
Попытка 1 из 5. Ваш вариант: 20 Загаданное число больше. Попытка 2 из 5. Ваш вариант: 60 Загаданное число меньше. Попытка 3 из 5. Ваш вариант: 42 Верно! Вы угадали.
Цикл завершился на третьей итерации через break, попытки 4 и 5 не запускались. guessed = True, финальный if not guessed не сработал.
Сценарий 2 — игрок не угадал за пять попыток:
Попытка 1 из 5. Ваш вариант: 10 Загаданное число больше. Попытка 2 из 5. Ваш вариант: 70 Загаданное число меньше. Попытка 3 из 5. Ваш вариант: 30 Загаданное число больше. Попытка 4 из 5. Ваш вариант: 55 Загаданное число меньше. Попытка 5 из 5. Ваш вариант: 35 Загаданное число больше. Попытки закончились. Загаданное число было 42.
break ни разу не выполнился, цикл дошёл до конца естественно, guessed остался False — и финальный if отработал.
В этой программе continue явно не использован — и это не случайность. Здесь он просто не нужен: все три случая обрабатываются ветками if/elif/else, и ни одну итерацию «пропускать» не требуется. continue был бы уместен, например, если нужно игнорировать некорректный ввод (не число) и не тратить на него попытку. Но это уже следующий уровень сложности.
Главный вывод из этой программы: break, вложенный if и флаг за пределами цикла — стандартная тройка для задач типа «ищем что-то в цикле и хотим знать, нашли или нет».
