Глава 12 · Множество увлекательных мини-проектов!

Проект: угадай число, версия 3

Полный цикл разработки на знакомой игре: требования → алгоритм → блок-схема → трасса состояния → код.

Используем
randomwhileif/elif/elseinput()/int()счётчик
Уровень
★★ средний
Результат
текстовая игра

Что создаём

Финальная, отполированная версия игры-угадайки из глав 9-10 — с подсчётом попыток и аккуратным выводом.

Загадано число от 1 до 100. Попробуйте угадать!
Ваша попытка: 50
Слишком много!
Ваша попытка: 25
Слишком мало!
Ваша попытка: 37
Поздравляем! Загадано было 37. Попыток: 3
Детерминированный пример выполнения

Требования

ТребованиеКак проверим
компьютер выбирает целое число от 1 до 100random.randint(1, 100)
игрок вводит попытки, пока не угадаетwhile guess != secret
после каждой попытки — подсказка мало/многоif/elif/else
попытки считаютсяattempts += 1
игра завершается на правильном ответецикл заканчивается, печатается итог

Алгоритм: внешний цикл

СТАРТsecret = random,attempts = 0guess != secretДАспросить guess,сравнить, дать…attempts += 1назадНЕТКОНЕЦ
Пока не угадано — спросить попытку, сравнить, подсказать, увеличить счётчик

Алгоритм: что происходит внутри одной попытки

guess =int(input(...))attempts += 1guess ==secret?ДАПоздравляем!Попыток: attemptsНЕТguess < secret?ДАСлишком мало!НЕТСлишком много!
Одна попытка: сравнить и подсказать — весь этот блок повторяется циклом while сверху

Трасса состояния

ПопыткаguesssecretРезультат
15037слишком много
22537слишком мало
33737угадано, цикл завершается

Финальный код

ugadaj_chislo_v3.py
import random

secret = random.randint(1, 100)
attempts = 0
guess = None

print("Загадано число от 1 до 100. Попробуйте угадать!")

while guess != secret:
    guess = int(input("Ваша попытка: "))
    attempts += 1
    if guess < secret:
        print("Слишком мало!")
    elif guess > secret:
        print("Слишком много!")
    else:
        print(f"Поздравляем! Загадано было {secret}. Попыток: {attempts}")
В практике число фиксировано, а не случайно
На странице показан настоящий random.randint(1, 100) — именно так должна работать игра. В ноутбуке практики секретное число зафиксировано заранее, а ввод подставляется автоматически — иначе автоматическая проверка результата была бы недетерминированной.

Debug Lab

Что произойдёт, если строку attempts = 0 случайно перенести внутрь цикла while? Проверьте предположение, прежде чем читать дальше.

attempts всегда будет равен 1
Ровно та же ошибка, что и в §12.2 Debug Lab: счётчик, обнуляемый внутри цикла, никогда не накапливает значение — на каждой итерации он создаётся заново.

Уровень 3: ограничение попыток

Усложним требования: игра заканчивается поражением после 10 неудачных попыток.

ugadaj_chislo_limit.py
max_attempts = 10

while guess != secret and attempts < max_attempts:
    ...

if guess == secret:
    print(f"Победа за {attempts} попыток!")
else:
    print(f"Числа закончились. Было загадано {secret}.")
Практика: угадай число, версия 3
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →
Практика (★★★): ограничение числа попыток
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →