Угадай число на Python — пошаговое руководство

Что включает этот пример
- Полный рабочий скрипт на Python, который можно сразу запустить.
- Выбор уровня сложности (easy, medium, hard).
- Ограничение количества попыток и динамический диапазон чисел для угадывания.
- Подсказки: выше/ниже и «теплее/холоднее» по расстоянию от ответа.
- Список тестов, критерии приёмки и советы для обучения.
Зачем делать игру «Угадай число»
Создание простой игры — отличный способ закрепить базовые понятия программирования: переменные, ввод/вывод, условные операторы, циклы, обработка исключений и модульность кода. Игра лёгка в расширении: можно добавить логирование, GUI или сетевой режим позже.
Мини-терминология
- randint(a, b): функция из модуля random, возвращающая случайное целое в диапазоне [a, b].
- guess: число, введённое игроком.
- answer: случайное число, которое нужно угадать.
Полный пример скрипта
Сохраните в файл number-guessing-game.py и запустите через python number-guessing-game.py.
# number-guessing-game.py
import random
import sys
def choose_level():
print("Выберите уровень сложности: easy, medium, hard")
while True:
level = input("Уровень: ").strip().lower()
if level in ("easy", "medium", "hard"):
return level
print("Неверный ввод. Введите: easy, medium или hard.")
def settings_by_level(level):
if level == "easy":
return 50, 20 # диапазон, попытки
elif level == "medium":
return 100, 15
else:
return 150, 10
def get_guess(prompt, min_v, max_v):
while True:
try:
val = input(prompt)
guess = int(val)
if guess < min_v or guess > max_v:
print(f"Введите число от {min_v} до {max_v}.")
continue
return guess
except ValueError:
print("Пожалуйста, введите целое число.")
def hint_distance(guess, answer):
d = abs(guess - answer)
if d == 0:
return None
if d <= 5:
return "Очень близко"
if d <= 10:
return "Теплее"
if d <= 20:
return "Тепло"
if d <= 30:
return "Прохладно"
return "Холодно"
def play():
print("Добро пожаловать в игру 'Угадай число'!")
level = choose_level()
guess_range, guesses_allowed = settings_by_level(level)
answer = random.randint(1, guess_range)
print(f"Угадайте число от 1 до {guess_range}. У вас {guesses_allowed} попыток.")
for i in range(guesses_allowed):
prompt = f"Попытка {i+1}/{guesses_allowed}. Введите число: "
guess = get_guess(prompt, 1, guess_range)
if guess == answer:
print("Поздравляем! Вы угадали число. Вы победили!")
return True
elif guess < answer:
print("Задуманное число больше.")
else:
print("Задуманное число меньше.")
distance_hint = hint_distance(guess, answer)
if distance_hint:
print(distance_hint)
if i == guesses_allowed - 1:
print(f"К сожалению, попытки закончились. Загаданное число было {answer}.")
return False
if __name__ == '__main__':
try:
play()
except KeyboardInterrupt:
print("\nИгра прервана пользователем.")
sys.exit(0)Important: Этот скрипт обрабатывает ошибочные вводы и прерывание пользователем (Ctrl+C).
Разбор логики по шагам
- Импортируем random и sys.
- Просим игрока выбрать уровень — функция choose_level возвращает строку уровня.
- settings_by_level устанавливает размеры диапазона и число попыток.
- Генерируем ответ: random.randint(1, guess_range).
- Основной цикл for выполняется ограниченное число попыток.
- Для ввода используем get_guess с валидацией и проверкой диапазона.
- После каждой попытки даём подсказку выше/ниже и оценку близости по абсолютной разнице.
Как добавить дополнительные функции (варианты расширения)
- Сохранение статистики игрока в файл (победы/поражения, число попыток).
- Режим без подсказок (чтобы усложнить игру).
- Интеллектуальные подсказки: подсказать деление диапазона пополам (подсказка как в бинарном поиске).
- Графический интерфейс с помощью tkinter или веб-версия на Flask.
Альтернативные подходы
- Вместо циклов for/while можно реализовать рекурсивную логику, но это менее очевидно в простом скрипте.
- Для генерации случайных чисел использовать secrets.randbelow для криптографической стойкости (обычно не нужен для игры).
Когда подход может не сработать
- Если цель — многопользовательская игра с учётом рейтинга, одной консольной версии будет недостаточно.
- Для мобильных приложений нужна адаптация интерфейса и другой стек технологий.
Критерии приёмки
- Скрипт запускается командой python number-guessing-game.py (или python3 на некоторых системах).
- При некорректном вводе не происходит падения — выводится сообщение об ошибке.
- При угадывании игрока выводится сообщение о победе, и программа завершает игру.
- При исчерпании попыток игроку показывается загаданное число.
- Выбор уровня корректно меняет диапазон и число попыток.
Тестовые сценарии
- Функциональный тест: уровень easy, вручную задать число, проверить поведение при угадывании.
- Ввод нечисловых данных: ввести “abc” — программа должна попросить ввести целое.
- Границы диапазона: ввести 0 или число больше максимума — программа должна напомнить о допустимом диапазоне.
- Прерывание: нажать Ctrl+C — программа должна корректно завершиться.
Чек-лист для ролей
- Разработчик:
- Реализовал валидацию ввода.
- Добавил обработку KeyboardInterrupt.
- Написал комментарии в коде.
- Тестер:
- Прогоны по всем уровням сложности.
- Тесты на неверный ввод и на граничные значения.
- Ученик:
- Понял структуру цикла и условных операторов.
- Попробовал изменить диапазон и подсказки.
Ментальные модели и эвристики
- Разбей задачу: ввод → проверка → ответ → подсказка.
- Для подсказок «теплее/холоднее» используйте абсолютную разницу; чем меньше, тем ближе.
- Ограничение попыток превращает поиск в задачу оптимизации — думайте, как сократить диапазон быстрее.
Факты и числа по умолчанию
- Диапазоны по уровню: easy=1–50, medium=1–100, hard=1–150.
- Попытки по уровню: easy=20, medium=15, hard=10.
Советы по локализации и UX для русскоязычных пользователей
- Языковые подсказки в интерфейсе должны быть короткими и понятными.
- При локализации сообщений используйте нейтральную формулировку (без сленга).
Рекомендации по запуску
- Windows: в командной строке или PowerShell выполните:
cd C:\путь\к\папке
python number-guessing-game.py- macOS / Linux:
cd /путь/к/папке
python3 number-guessing-game.pyКраткое руководство по расширению проекта
- Добавьте логирование в JSON для последующего анализа:
- Сохраняйте уровень, число попыток, итог (win/lose), время игры.
- Введите режим «двух игроков»: первый игрок задаёт число, второй угадывает.
- Сделайте веб-интерфейс на Flask: форма для ввода, отображение подсказок и истории.
Заключение
Создание и улучшение игры «Угадай число» — отличный путь к освоению основ Python. Начните с этого консольного примера, затем итеративно добавляйте функции: сохранение статистики, GUI, сетевые режимы. Экспериментируйте с подсказками и алгоритмами, чтобы превратить учебный проект в полнофункциональное приложение.
Краткая инструкция для публикации на GitHub:
- Создайте репозиторий.
- Добавьте файл number-guessing-game.py.
- Напишите README с примерами запуска и кратким описанием уровней.
Notes: идеально использовать этот проект как базу для изучения тестирования (юнит-тесты для функций валидации и подсказок) и для изучения работы с файлами/логированием.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента