Числовая угадайка
Программа загадывает случайное число от 1 до 100 и просит человека его угадать. Если названное число больше загаданного — программа сообщает об этом, если меньше — тоже. Когда число угадано, программа поздравляет игрока.
Из чего собирается: целые числа, переменные, input() и print(), if/elif/else, цикл while, бесконечный цикл, break и continue, модуль random.
Техническое задание.
- Подключите модуль
random, загадайте число от 1 до 100 и поприветствуйте игрока: «Добро пожаловать в числовую угадайку». - Напишите функцию
is_valid(), которая принимает строку и возвращаетTrue, если это целое число от 1 до 100, иFalseиначе. - Организуйте цикл, который запрашивает у игрока число.
- Если введено не то — напечатайте «А может быть все-таки введем целое число от 1 до 100?» и перейдите к следующему шагу цикла.
- Если число меньше загаданного — «Ваше число меньше загаданного, попробуйте еще разок», если больше — «Ваше число больше загаданного, попробуйте еще разок», если совпало — «Вы угадали, поздравляем!».
- После выхода из цикла попрощайтесь: «Спасибо, что играли в числовую угадайку. Еще увидимся...».
Что можно улучшить: считать число попыток и показывать его в конце; предлагать сыграть ещё раз; спрашивать верхнюю границу диапазона.
Про стратегию. Чтобы наверняка угадать число от 1 до 100, хватит семи попыток. Называйте середину промежутка: если она мала — двигайте левую границу, если велика — правую. Каждый раз отбрасывается половина чисел, поэтому попыток нужно примерно log₂n — при ста числах это 7.
Подсказка 1
Сколько будет попыток, заранее неизвестно — значит, бесконечный цикл while True и выход по break, когда число угадано.
Подсказка 2
Проверку ввода удобно делать до преобразования в число: int('привет') остановит программу, а 'привет'.isdigit() спокойно вернёт False.
Разбор
- Загадываем число:
random.randint(1, 100). - Функция
is_valid()сначала проверяет, что в строке одни цифры, а потом — что число попадает в диапазон. - В цикле читаем ответ. Неверный ввод — печатаем замечание и делаем
continue, чтобы попытка не засчиталась. - Верный ввод — увеличиваем счётчик попыток и сравниваем с загаданным числом каскадом
if/elif/else. - Совпало — печатаем поздравление с числом попыток и выходим
break. - После цикла — прощальное сообщение.
Решение
import random
def is_valid(text):
"""Годится ли введённое: целое число от 1 до 100."""
if not text.isdigit(): # буквы, пробелы, минус — сразу мимо
return False
return 1 <= int(text) <= 100
secret = random.randint(1, 100) # загаданное число
tries = 0 # сколько попыток сделано
print('Добро пожаловать в числовую угадайку')
while True:
answer = input('Введите число от 1 до 100: ')
if not is_valid(answer):
print('А может быть все-таки введем целое число от 1 до 100?')
continue # попытку не засчитываем
number = int(answer)
tries += 1
if number < secret:
print('Ваше число меньше загаданного, попробуйте еще разок')
elif number > secret:
print('Ваше число больше загаданного, попробуйте еще разок')
else:
print(f'Вы угадали за {tries} попыток, поздравляем!')
break # число найдено — выходим из цикла
print('Спасибо, что играли в числовую угадайку. Еще увидимся...')Обратите внимание на continue в проверке ввода: без него ошибочный ввод засчитывался бы как попытка. И на порядок в is_valid() — сначала isdigit(), потом сравнение: если проверить наоборот, программа упадёт на первом же слове вместо числа.
