KTB-08 Проверять правильность ответа пользователя¶
📝 Описание¶
Обработка пользовательского ввода и проверка ответов
После вывода списка предложенных слов с вариантами ответов необходимо ожидать от пользователя ввод ответа в виде целого числа, соответствующего порядковому номеру выбранного варианта.
Требуется реализовать проверку правильности выбранного варианта, сравнивая его с правильным переводом. В зависимости от результата проверки, приложение должно выводить соответствующее сообщение пользователю согласно требованиям ТЗ.
Сравнение ответов и обновление счетчика
Следует сравнить введенный пользователем номер ответа (от 1 до 4) с индексом правильного варианта в списке слов.
При правильном ответе у соответствующего слова (объекта Word) должен происходить инкремент переменной correctAnswersCount, отвечающей за количество правильных ответов. Поскольку словарь (dictionary) хранит ссылки на объекты Word в памяти, изменения будут автоматически отражаться в текущей сессии программы.
При неправильном ответе выводить информационное сообщение с правильным вариантом ответа.
Сохранение прогресса в файл
Для обеспечения сохранения прогресса между сессиями необходимо при каждом правильном ответе сохранять обновленный словарь обратно в файл. В противном случае весь прогресс будет потерян при завершении программы, так как данные хранятся только в оперативной памяти. Требуется создать функцию saveDictionary(), которая будет вызываться после каждого правильного ответа для сохранения актуальных данных в файл.
Добавление опции возврата в главное меню
В список вариантов ввода необходимо добавить новый пункт "0 - Меню" в следующем формате:
🗒 Задание¶
- Считывать ответ пользователя (
userAnswerInput). - Добавить разделитель и новый пункт "0 - Меню". Обрабатывать ввод (возврат пользователя в главное меню).
- Получить индекс правильного ответа (
correctAnswerId) из списка слов для вопроса (questionWords). - Сравнивать ввод пользователя (
userAnswerInput) с индексом правильного варианта ответа (correctAnswerId). - При правильном ответе:
- Выводить сообщение “Правильно!”.
- Инкрементировать свойство объекта слова, которое хранит количество правильно угаданных слов.
- Создать функцию
saveDictionary()и передавать в нееdictionary. - Внутри метода реализовать запись обновленных результатов списка в файл. Вызывать метод при каждом правильном ответе.
- При неправильном ответе выводить сообщение в формате “Неправильно! 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¶
Тут можно `correctAnswer.correctAnswersCount++`, однако метод называется `saveDictionary()`, почему внутри ты что-то инкрементируешь?
Метод `saveDictionary` по названию просто сохраняет словарь. Он не называется `incrementWordAndSaveDictionary`.
Давай оставим один файл `words.txt`, слова из которого будут предъявляться пользователю, и в случае правильного ответа увеличивается количество `correctAnswersCount`.
Рекурсия обычно не кончается ничем хорошим. Его можно не создавать каждый раз в цикле, а только при старте.
⌨️ Решение¶
// Вариант 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)