Управление ходом программы

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 и флаг за пределами цикла — стандартная тройка для задач типа «ищем что-то в цикле и хотим знать, нашли или нет».

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.