Игра «Угадай число» на Python

Кому это полезно
- Новичкам, которые изучают основы Python: ввод/вывод, циклы, условия, работа с модулями.
- Учителям и наставникам, которые хотят объяснить основы игрового цикла и тестирования.
- Разработчикам, которые хотят расширить простую CLI-игру и добавить подсказки или уровни сложности.
Краткое описание идеи
Игра генерирует случайное число в заданном диапазоне. Игрок пытается угадать его за ограниченное число попыток. Варианты улучшений: подсказки выше/ниже, индикатор «теплее/холоднее», выбор уровня сложности, подсчёт очков и сохранение результатов.
Что понадобится
- Установленный Python 3.6+.
- Любой текстовый редактор или IDE (например, VS Code).
- Командная строка / терминал для запуска скрипта.
Полный пример скрипта
Ниже — рабочий пример, объединяющий все рассмотренные функции: выбор сложности, ограничение попыток, подсказки “выше/ниже” и “теплее/холоднее”. Скопируйте в файл number-guessing-game.py и запустите.
import random
# Настройки по умолчанию
guess_range = 50
guesses_allowed = 10
print("Welcome to the number guessing game!")
print("")
# Выбор сложности
while True:
level = input("Select difficulty level (easy, medium, hard): ").lower().strip()
if level in ["easy", "medium", "hard"]:
break
else:
print("Invalid input. Please select either 'easy', 'medium', or 'hard'.")
if level == "easy":
guess_range = 50
guesses_allowed = 20
elif level == "medium":
guess_range = 100
guesses_allowed = 15
else:
guess_range = 150
guesses_allowed = 10
answer = random.randint(1, guess_range)
print(f"I have chosen a number between 1 and {guess_range}. You have {guesses_allowed} guesses.")
previous_guess = None
for i in range(guesses_allowed):
# Ввод и валидация
while True:
user_input = input(f"Guess a number between 1 and {guess_range}: ")
try:
guess = int(user_input)
if 1 <= guess <= guess_range:
break
else:
print(f"Number must be between 1 and {guess_range}.")
except ValueError:
print("Please enter a valid integer.")
# Проверка выигрыша
if guess == answer:
print("Congratulations! You guessed the correct number. You win!")
break
# Подсказка выше/ниже
if guess < answer:
print("The number is higher.")
else:
print("The number is lower.")
# Подсказка теплее/холоднее
if previous_guess is not None:
prev_dist = abs(previous_guess - answer)
curr_dist = abs(guess - answer)
if curr_dist < prev_dist:
print("You're getting warmer.")
elif curr_dist > prev_dist:
print("You're getting colder.")
else:
print("You're at the same distance as before.")
else:
# Первая подсказка по расстоянию
if abs(guess - answer) <= max(1, guess_range // 10):
print("You're warm!")
elif abs(guess - answer) <= max(1, guess_range // 5):
print("You're getting warmer.")
else:
print("You're cold.")
previous_guess = guess
# Если последний ход
if i == guesses_allowed - 1:
print(f"Sorry, you have run out of guesses. The correct number was {answer}.")Объяснение ключевых частей кода
- random.randint(a, b): выбирает случайное целое от a до b включительно.
- Ввод через input() возвращает строку — используем int() для преобразования. Всегда добавляйте обработку ValueError.
- Цикл for в сочетании с range(guesses_allowed) ограничивает число попыток.
- Переменная previous_guess используется для сравнения дистанций и выдачи подсказок “теплее/холоднее”.
Как сгенерировать случайное число
- Создайте файл number-guessing-game.py.
- Импортируйте модуль random:
import random. - Используйте randint:
answer = random.randint(1, guess_range). Это даёт вам случайное число в включённом диапазоне.
Как проверить, угадал ли игрок
- Сравнивайте guess и answer.
- Если равны — игрок выиграл и цикл прерывается командой break.
- В противном случае продолжайте и давайте подсказки.
Как ограничить число попыток
- Вариант с переменной guesses_allowed и циклом for гарантирует, что игрок не будет угадывать бесконечно.
- По окончании цикла можно сообщить верный ответ.
Как добавить подсказки
- Простая подсказка: сообщите, больше или меньше загаданное число.
- Дополнительная подсказка: используйте абсолютную разницу abs(guess - answer) для оценки «теплее/холоднее».
- Хорошая практика: комбинировать оба типа подсказок, но не раскрывать слишком много, чтобы игра оставалась интересной.
Как добавить уровни сложности
- Предложите игроку выбрать easy, medium или hard.
- В зависимости от выбора измените диапазон и число попыток. Пример значений:
- easy: диапазон до 50, попыток 20
- medium: диапазон до 100, попыток 15
- hard: диапазон до 150, попыток 10
Полезные улучшения и варианты развития
- Сохранение статистики: количество побед/поражений, среднее число попыток — сохранять в JSON или CSV.
- Режим обучения: показывать подсказки реже или давать объяснения о стратегиях (двоичный поиск).
- GUI: реализовать интерфейс с помощью Tkinter или PySimpleGUI.
- Веб-версия: создать простую версию на Flask или FastAPI и открыть доступ через браузер.
- Боты: добавить Telegram-бота, который будет вести игру.
Когда такой подход не подойдёт
- Если вы хотите многопользовательскую игру или сложную логику — лучше использовать игровую движок или базу данных для хранения сессий.
- Для визуально насыщенных игр CLI будет ограничением — используйте GUI/веб/движок.
Ментальные модели и эвристики
- Бинарный поиск: если игрок использует стратегию «делить диапазон пополам», он найдет число за O(log2(N)) попыток.
- Выбор сложности: увеличивая диапазон и уменьшая попытки, вы повышаете риск, но и азарт.
Чеклист перед запуском
- Установлен Python 3.6+
- Файл number-guessing-game.py сохранён
- Присутствует импорт random
- Есть обработка ошибок для ввода
- Диапазон и количество попыток корректно заданы
Как запустить игру
- Откройте терминал и перейдите в папку с файлом, например:
cd C:\Users\Sharl\Desktop - Запустите скрипт:
python number-guessing-game.py - Введите уровень сложности и начинайте угадывать.
Тестовые случаи и критерии приёмки
- Корректный ввод целого числа в диапазоне должен принимать значение.
- Некорректный ввод (текст, дробь) должен вызывать вежливое сообщение об ошибке и повторный запрос.
- При угадывании до окончания попыток — выводится сообщение о победе и игра завершается.
- При исчерпании попыток — выводится сообщение о поражении и правильный ответ.
- Подсказки “выше/ниже” и “теплее/холоднее” меняются в ожидаемом направлении.
Шаблон проверки качества (SLA простого проекта)
- Время отклика CLI: мгновенно (с учётом ввода пользователя).
- Корректность случайного числа: значение в указанном диапазоне.
- Достоверность подсказок: проверяется на наборе ручных тестов из 10 сценариев.
Отладка и распространённые проблемы
- Ошибка ValueError при int(user_input): добавить try/except и проверить пустые строки.
- Попадание числа вне диапазона: проверяйте 1 <= guess <= guess_range и выводите подсказку.
- Неправильный подсчёт попыток: если используете while, следите за инкрементом счётчика.
Мини-методология обучения через проект
- Определите минимально работоспособную версию (MVP): выбор числа и сравнение с вводом.
- Добавьте ограничение попыток.
- Добавьте подсказки выше/ниже.
- Добавьте выбор сложности.
- Добавьте тесты и сбор статистики.
Роли и задачи
- Ученик: реализовать MVP и пройти чеклист.
- Наставник: проверить тесты и объяснить бинарный поиск.
- Разработчик: написать модульные тесты и добавить сохранение результатов.
Короткая дорожная карта развития проекта
- CLI версия (текущая).
- Сохранение статистики в файле.
- GUI через Tkinter.
- Веб-интерфейс с авторизацией и таблицей лидеров.
Безопасность и приватность
- Игра не собирает персональные данные по умолчанию.
- Если добавляете онлайн-режим и храните данные пользователей, соблюдайте правила хранения и GDPR — храните только необходимые поля и шифруйте соединение.
Вопросы и ответы
Как сделать подсказки менее прямыми?
Можно ограничить число подсказок, например давать подсказку “выше/ниже” только каждые две попытки или только первые N ошибок.
Можно ли сохранять рекорды игроков?
Да. Используйте JSON или CSV для локального хранения. Для многопользовательского доступа лучше базу данных.
Краткое резюме
- Создание игры «Угадай число» — отличный проект для изучения основ Python.
- Главные элементы: генерация случайного числа, цикл ввода, обработка ошибок, логика подсказок, ограничение попыток.
- Проект легко расширяется: GUI, веб, статистика и боты.
Важно: экспериментируйте с разными стратегиями и цените обратную связь от игроков — это лучший способ улучшить игру.
Похожие материалы
Перенос музыки между Echo-устройствами через Alexa
Как добавить второй язык в Google Home
Как смотреть Netflix на Amazon Echo Show
Adaptive Volume в Alexa — включение и советы
Безопасность подержанных устройств умного дома