Глава 9 · Выполняй мою команду!

Мини-проект — игра «Угадай число»

Первая настоящая игра книги — компьютер загадывает число, вы пытаетесь угадать.

Первая настоящая игра в этой книге! Компьютер загадывает число, вы вводите один вариант — программа говорит, угадали вы или нет.

Сначала — как это выглядит для игрока

terminal_dialog.txt
Я загадал число от 1 до 10.

Ваш вариант: 7
Слишком большое!
Я загадал: 4

Или, если угадали с первой попытки:

terminal_dialog_win.txt
Я загадал число от 1 до 10.

Ваш вариант: 4

🎉 Вы угадали!
Одна попытка — и это нормально
Пока мы не проходили циклы (глава 10), поэтому у игрока ровно одна попытка. Полная, переигрываемая версия с повтором до угадывания появится там же — уже сейчас держите это в голове как мотивацию для следующей главы.

Решающее дерево игры

СТАРТguessguess ==secret?ДА🎉 Вы угадали!НЕТguess < secret?ДА"Слишком мало"НЕТ"Слишком много"КОНЕЦ
Решающее дерево игры — переводим прямо в if / elif / else
reshenie_v_kod.py
if guess == secret:
    print("🎉 Вы угадали!")
elif guess < secret:
    print("Слишком мало!")
else:
    print("Слишком много!")

Строим игру по шагам

Шаг 1 — загадываем число

shag_1.py
import random

secret = random.randint(1, 10)

Шаг 2 — читаем ответ игрока

shag_2.py
guess_text = input("Ваш вариант: ")

Шаг 3 — преобразуем в число

shag_3.py
guess = int(guess_text)
Забытый int() — источник ошибки
Если сравнить guess_text < secret напрямую (строку с числом), Python выдаст TypeError — сравнивать строку и число нельзя. Преобразование int() обязательно.

Шаг 4 — проверяем точное совпадение

shag_4.py
if guess == secret:
    print("🎉 Вы угадали!")

Шаг 5 — добавляем «слишком мало»

shag_5.py
if guess == secret:
    print("🎉 Вы угадали!")
elif guess < secret:
    print("Слишком мало!")

Шаг 6 — else означает «слишком много»

shag_6.py
if guess == secret:
    print("🎉 Вы угадали!")
elif guess < secret:
    print("Слишком мало!")
else:
    print("Слишком много!")

Шаг 7 — финальная версия

ugadaj_chislo.py
import random

secret = random.randint(1, 10)
guess = int(input("Ваш вариант: "))

if guess == secret:
    print("🎉 Вы угадали!")
elif guess < secret:
    print("Слишком мало!")
else:
    print("Слишком много!")

print(f"Загаданное число было: {secret}")
Фиксированное число для примеров курса
В примерах документации иногда используют фиксированное число вместо random.randint(...), чтобы вывод был предсказуем при показе. В настоящей игре это не нужно — случайность там как раз то, что делает игру интересной.

Debug-лаборатория: пять багов

Баг 1 — забыт int()

bug_1.py
guess = input("Ваш вариант: ")
if guess < secret:
    ...
# TypeError: '<' not supported between instances of 'str' and 'int'

Исправление: guess = int(input(...)).

Баг 2 — неверный порядок веток

bug_2.py
if guess < secret:
    ...
elif guess == secret:
    ...

Само по себе не сломается, но порядок «сначала неточные, потом точное» менее логичен — сравните с шагами 4-6 выше.

Баг 3 — = вместо ==

bug_3.py
if guess = secret:
    ...
# SyntaxError: invalid syntax

Одиночный = в условии — синтаксическая ошибка, Python даже не запустит программу (раздел 9.5).

Баг 4 — неверная граница

bug_4.py
secret = random.randint(1, 10)
# но подсказка написана как "от 1 до 9" — граница не совпадает с кодом

Баг 5 — два независимых if вместо elif

bug_5.py
if guess < secret:
    print("Слишком мало!")
if guess > secret:
    print("Слишком много!")
# при guess == secret НИ ОДНО сообщение не покажется — а if/elif/else это учитывает
★★ Самостоятельная задача
Подсказка «горячо/холодно»

Добавьте четвёртое условие: если разница между guess и secret меньше 3 (используйте abs()) — выведите «Очень близко!» перед основным сообщением.

Практика: собираем игру «Угадай число» целиком
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →