Перейти к содержанию

KTB-08 Проверять правильность ответа пользователя

📝 Описание

Обработка пользовательского ввода и проверка ответов

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

Требуется реализовать проверку правильности выбранного варианта, сравнивая его с правильным переводом. В зависимости от результата проверки, приложение должно выводить соответствующее сообщение пользователю согласно требованиям ТЗ.

Сравнение ответов и обновление счетчика

Следует сравнить введенный пользователем номер ответа (от 1 до 4) с индексом правильного варианта в списке слов.

При правильном ответе у соответствующего слова (объекта Word) должен происходить инкремент переменной correctAnswersCount, отвечающей за количество правильных ответов. Поскольку словарь (dictionary) хранит ссылки на объекты Word в памяти, изменения будут автоматически отражаться в текущей сессии программы.

При неправильном ответе выводить информационное сообщение с правильным вариантом ответа.

Сохранение прогресса в файл

Для обеспечения сохранения прогресса между сессиями необходимо при каждом правильном ответе сохранять обновленный словарь обратно в файл. В противном случае весь прогресс будет потерян при завершении программы, так как данные хранятся только в оперативной памяти. Требуется создать функцию saveDictionary(), которая будет вызываться после каждого правильного ответа для сохранения актуальных данных в файл.

Добавление опции возврата в главное меню

В список вариантов ввода необходимо добавить новый пункт "0 - Меню" в следующем формате:

// здесь пустая строка
pen:
 1 - шляпа
 2 - кошка
 3 - спасибо
 4 - ручка
 ----------
 0 - Меню

🗒 Задание

  1. Считывать ответ пользователя (userAnswerInput).
  2. Добавить разделитель и новый пункт "0 - Меню". Обрабатывать ввод (возврат пользователя в главное меню).
  3. Получить индекс правильного ответа (correctAnswerId) из списка слов для вопроса (questionWords).
  4. Сравнивать ввод пользователя (userAnswerInput) с индексом правильного варианта ответа (correctAnswerId).
  5. При правильном ответе:
    1. Выводить сообщение “Правильно!”.
    2. Инкрементировать свойство объекта слова, которое хранит количество правильно угаданных слов.
    3. Создать функцию saveDictionary() и передавать в нее dictionary.
    4. Внутри метода реализовать запись обновленных результатов списка в файл. Вызывать метод при каждом правильном ответе.
  6. При неправильном ответе выводить сообщение в формате “Неправильно! cat – это кошка”.

❌ Ошибки

✏️ Комментарии

Добавить пункт меню можно через свойство `postfix`:

val variants = questionWords
    .mapIndexed { index: Int, word: Word -> " ${index + 1} – ${word.translate}" }
    .joinToString(
        separator = "\n",
        prefix = "\n${correctAnswer.original}\n",
        postfix = "\n ----------\n 0 - Меню", // добавленная строка
    )
println(variants)
Давай в saveDictionary() передавать dictionary целиком, а не конкретное правильное слово. Чтобы не искать слово в словаре, correctAnswer по сути ссылается на элемент в списке dictionary. Мы делаем инкремент при правильном ответе correctAnswer.correctAnswersCount++ и передаем тот же словарь в метод saveDictionary(dictionary).
Твой подход имеет один недостаток - проверка на выученность слов находится за пределом цикла и отработает только если заново войти в меню 1.
Можно заново не искать слово в словаре, у тебя уже есть `correctAnswer`, который по сути ссылается на элемент в списке `dictionary`. `correctAnswer.correctAnswersCount++` будет работать.

Инкремент внутри saveDictionary

Давай делать инкремент до вызова `saveDictionary` и не передавать туда `Word`.
Тут можно `correctAnswer.correctAnswersCount++`, однако метод называется `saveDictionary()`, почему внутри ты что-то инкрементируешь?
Метод `saveDictionary` по названию просто сохраняет словарь. Он не называется `incrementWordAndSaveDictionary`.

Давай оставим один файл `words.txt`, слова из которого будут предъявляться пользователю, и в случае правильного ответа увеличивается количество `correctAnswersCount`.
Рекурсия обычно не кончается ничем хорошим. Его можно не создавать каждый раз в цикле, а только при старте.
Вот тут, как только получаешь значение: `if(userAnswer == "0") break`.

⌨️ Решение

// Вариант 1 (вызовет падение, если слов для изучения меньше 4)
//                    println(
//                        """
//                        ${correctAnswer.original}
//                        1 - ${questionWords[0].translate}
//                        2 - ${questionWords[1].translate}
//                        3 - ${questionWords[2].translate}
//                        4 - ${questionWords[3].translate}
//                        ----------
//                        0 - Меню
//                    """.trimIndent()
//                    )

// Вариант 2 (рекомендуемый в комментариях)
val variants = questionWords
    .mapIndexed { index: Int, word: Word -> " ${index + 1}${word.translate}" }
    .joinToString(
        separator = "\n",
        prefix = "\n${correctAnswer.original}\n",
        postfix = "\n ----------\n 0 - Меню", // добавленная строка
    )
println(variants)