"Поле чудес" или Угадай слово мы начнем с написания небольшой программки, которая создаст файл с вопросами и ответами к игре.
Программа в бесконечном цикле будет спрашивать у пользователя вопросы и ответы.
1. Программа предлагает пользователю ввести вопрос или нажать "q", чтобы выйти.
2. С помощью контекстного менеджера with....as открываем файл и присваиваем ему дескриптор f.
Здесь можно не использовать контекстный менеджер, но тогда нам придётся закрывать файл вручную с помощью метода .close()
3. С помощью метода записи в файл .write() создаем запись в файл в формате:
вопрос;ответ
"Точка с запятой" тут критически важный параметр, в дальнейшем она будет использоваться как разделитель вопроса и ответа. Впрочем можно сделать любой разделитель - лишь ты такой же последовательности символов не встречалось в теле вопроса.
Я по-быстрому накидаю несколько вопросов/ответов, чтобы было с чем работать. Получаем файл:
В дальнейшем можно сколько угодно набросать вопросов/ответов, так как файл мы открываем в режиме "a" - что значит - "Дозапись" (см. строка 12).
"r" - чтение
"w" - запись (в этом случае старое содержимое будет стерто)
Есть еще несколько режимов. Режимы можно также комбинировать, но в рамках этой задачи мы этого касаться не будем
Закрываем программу ввода и создаем новую. Она будет выполнять две задачи:
1. Случайным образом считывать из файла пару вопрос/ответ, преобразовывать её в две переменные и возвращать их.
2. Играть с пользователем в "Поле чудес"
Выполнение первой задачи поручим функции get__question()
Она:
Открывает на чтение файл с вопросами и ответами,
Читает построчно файл, избавляется от символов перевода строки и пишем строки в список (метод .splitlines()),
Выбирает случайным образом вопрос, который будет задан пользователю (randrange()). Для этого предварительно нужно импортировать модуль для работы со случайными числами - random.
В цикле ищет точку с запятой и разделяет на значение-вопрос - это то, что до запятой, и значение-ответ - то что после запятой.
Возвращает вопрос и ответ в виде отдельных строчных переменных
на данном этапе, вот что мы имеем:
Все готово к решению задачи.
Решение:
Создаем строку, предназначенную для отображения, того, что в текущий момент видит пользователь. Для этого:
1. Измеряем длину ответа.
2. Создаем список такой же длины и заполняем его звездочками
3. Для вывода на экран склеиваем копию списка в строку
вот что получается:
Теперь рассмотрим вариант, когда пользователь ввел и угадал или не угадал букву. Программа должна:
1. Захватить введенную пользователем букву и присвоить её значение переменной
2. Проверить есть ли такая буква в ответе и если есть сообщить об этом пользователю, изменить отображаемый вид ответа. Если же нет - сообщить об этом пользователю.
Будем выполнять этот алгоритм в бесконечном цикле:
получаем:
Теперь нужно предусмотреть вариант, когда пользователь ввел и угадал слово или угадал слово по буквам. Для этого отображаемый пользователю вид будем не просто выводить на экран, а сохраним его в переменной user_answer. Вводим эти блоки в 27-28 и в 37-38 строках.
Для закрепления темы, предлагаю вам:
1. Научить программу понимать строчные и заглавные буквы.
2.Добавить обработку ошибок с помощью конструкции try excrpt else.
3. Произвести рефакторинг кода таким образом, чтобы с учетом всех преобразований он не занимал места больше, чем сейчас.