Глава 12 · Множество увлекательных мини-проектов!
Проект: угадай число, версия 3
Полный цикл разработки на знакомой игре: требования → алгоритм → блок-схема → трасса состояния → код.
Используем
randomwhileif/elif/elseinput()/int()счётчикУровень
★★ средний
Результат
текстовая игра
Что создаём
Финальная, отполированная версия игры-угадайки из глав 9-10 — с подсчётом попыток и аккуратным выводом.
Загадано число от 1 до 100. Попробуйте угадать!
Ваша попытка: 50
Слишком много!
Ваша попытка: 25
Слишком мало!
Ваша попытка: 37
Поздравляем! Загадано было 37. Попыток: 3
Требования
| Требование | Как проверим |
|---|---|
| компьютер выбирает целое число от 1 до 100 | random.randint(1, 100) |
| игрок вводит попытки, пока не угадает | while guess != secret |
| после каждой попытки — подсказка мало/много | if/elif/else |
| попытки считаются | attempts += 1 |
| игра завершается на правильном ответе | цикл заканчивается, печатается итог |
Алгоритм: внешний цикл
Алгоритм: что происходит внутри одной попытки
Трасса состояния
| Попытка | guess | secret | Результат |
|---|---|---|---|
| 1 | 50 | 37 | слишком много |
| 2 | 25 | 37 | слишком мало |
| 3 | 37 | 37 | угадано, цикл завершается |
Финальный код
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, без установки