Найти в Дзене
Практика Python

Программируем логику игры "Поле чудес"

"Поле чудес" или Угадай слово мы начнем с написания небольшой программки, которая создаст файл с вопросами и ответами к игре.

Программа в бесконечном цикле будет спрашивать у пользователя вопросы и ответы.

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. Произвести рефакторинг кода таким образом, чтобы с учетом всех преобразований он не занимал места больше, чем сейчас.

Читайте другие наши статьи!

Л.Якубович - лицо Поля Чудес
Л.Якубович - лицо Поля Чудес

-11

Телешоу
3437 интересуются