🎯 Цель работы:
Реализация логики викторины в телеграм с хранением состояния и статистики.
Применить коллекции (HashMap, HashSet) для решения практических задач: хранения данных (страна-столица), отслеживания уникальности (избегание повторов вопросов) и ведения статистики (счет пользователя).
📋 Задание
Доработать бота из предыдущей работы, добавив команды /quiz и /stats. По команде /quiz бот начинает раунд викторины, задавая случайный, но еще не заданный в текущей сессии вопрос. Пользователь отвечает текстом. Бот проверяет ответ и сообщает результат. Ведутся счет правильных ответов и статистика.
- Спроектировать структуру хранения данных (какая коллекция для чего)
- Реализовать логику игры с состоянием
- Обработать граничные случаи (закончились вопросы, неверный формат ответа)
- Предусмотреть расширение (добавление новых вопросов через файл)
Указания по разработке
- Основные классы приложения
Пользователь → TelegramBot → SessionManager (HashMap) → UserSession → QuizGame
↑
Статистика пользователя
QuizGame — логика одной викторины (генерация вопросов, проверка ответов). Ничего не знает о пользователях, статистике или Telegram.
UserSession — связывает пользователя с игрой и хранит его персональную статистику.
SessionManager — управляет всеми сессиями (использует HashMap).
Данные включают 2 класса
public class Country {
private String name;
private String capital;
private String flagImagePath; //путь к изображению флага
}
public class QuizQuestion {
private Country correctCountry;
private QuestionType type; // "FLAG_TO_CAPITAL" или "CAPITAL_TO_FLAG"
public QuizQuestion(Country correctCountry, QuestionType type) {
this.correctCountry = correctCountry;
this.type = type;
}
public boolean isCorrect(String userAnswer) {
return userAnswer.equalsIgnoreCase(
type == FLAG_TO_CAPITAL ?
correctCountry.getCapital() :
correctCountry.getName()
);
}
public String getQuestion() {
if(type == FLAG_TO_CAPITAL) return "Столица?";
else return "Страна?";
}
public Country getCorrectCountry() {
return correctCountry;
}
}
-
Создайте класс загрузки данных для викторины из файла
-
Варианты индивидуальные
| № | Название | Концепция и коллекции | Краткое описание | Пример диалога |
|---|---|---|---|---|
| 1 | Угадай страну по достопримечательности | HashMap<достопримечательность, страна>Set для отслеживания показанных |
Бот показывает название достопримечательности (Эйфелева башня), пользователь угадывает страну. | Бот: "Статуя Свободы" → Польз.: "США" → Бот: "Верно! (7/10)" |
| 2 | Переводчик-тренажёр | HashMap<слово, перевод>List для очереди слов |
Бот показывает слово на английском, пользователь вводит перевод на русский. Слова повторяются при ошибке. | Бот: "apple" → Польз.: "яблоко" → Бот: "✅" |
| 3 | Хронологический дуэт | HashMap<событие, год>LinkedList для истории |
Бот называет историческое событие, пользователь указывает год. Можно усложнить: “Что было раньше: X или Y?” | Бот: "Полёт Гагарина" → Польз.: "1961" → Бот: "Правильно!" |
| 4 | Ассоциативная цепочка | HashMap<слово, связанное_слово> |
Бот начинает цепочку (“огонь”), пользователь продолжает ассоциацию (“пожар” → “вода” → …). Оценивается уникальность. | Бот: Начало: "книга" → Польз.: "бумага" → Бот: "Принято. Ваш ход: ..." |
| 5 | Найди лишнее | HashMap<категория, List<элементы>>Set для вариантов |
Бот показывает 4 слова, пользователь выбирает лишнее и объясняет почему. | Бот: "Яблоко, Груша, Морковь, Банан" → Польз.: "Морковь (это овощ)" |
| 6 | Продолжи пословицу | HashMap<начало, конец> |
Бот пишет начало пословицы, пользователь дописывает концовку. Учитываются синонимы. | Бот: "Без труда..." → Польз.: "... не выловишь рыбку из пруда" |
| 7 | Кто автор? | HashMap<цитата, автор> |
Бот показывает цитату из книги/фильма, пользователь угадывает автора/персонажа. | Бот: "Элементарно, Ватсон!" → Польз.: "Шерлок Холмс" |
| 8 | Собери пару | HashMap<термин, определение>Set для использованных |
Бот показывает случайный термин, пользователь должен ввести его точное определение. | Бот: "Инкапсуляция" → Польз.: "Сокрытие данных" |
| 9 | Математический вызов | Генерация выражений,HashMap<сложность, операторы> |
Бот генерирует случайное математическое выражение, пользователь вычисляет результат. На время или с прогрессом сложности. | Бот: "15 * (3 + 7) / 5 = ?" → Польз.: "30" |
| 10 | Анаграммный бой | List слов, Set использованных |
Бот показывает анаграмму, пользователь разгадывает слово. Можно давать подсказки по буквам. | Бот: "аргон" → Польз.: "норга" → Бот: "Неверно. Подсказка: газ" |
| 11 | Географический сосед | HashMap<страна, List<соседи>> |
Бот называет страну, пользователь перечисляет её соседей (сколько вспомнит). | Бот: "Германия" → Польз.: "Франция, Польша, Чехия..." |
| 12 | Кодировщик | HashMap<код, буква> (шифры) |
Бот показывает закодированное сообщение (шифр Цезаря, Атбаш), пользователь расшифровывает. | Бот: "Рсткпи — рпцрбо" → Польз.: "Поздравляю" |
| 13 | Фильм по эмодзи | HashMap<набор_эмодзи, название> |
Бот отправляет последовательность эмодзи, описывающую фильм/книгу, пользователь отгадывает название. | Бот: "👨🚀🌕🏃♂️💨" → Польз.: "Аполлон-13" |
| 14 | Химический элемент | HashMap<символ, название>HashMap<номер, название> |
Бот показывает символ элемента (Fe) или его атомный номер, пользователь вводит название. | Бот: "Au" → Польз.: "Золото" |
| 15 | Программисткий Q&A | HashMap<вопрос, ответ> |
Бот задаёт вопросы по программированию (синтаксис, алгоритмы), пользователь отвечает. | Бот: "Что такое полиморфизм?" → Польз.: "Возможность..." |
| 16 | Музыкальная угадайка | HashMap<исполнитель, List<песни>> |
Бот показывает строчку из текста песни, пользователь угадывает название или исполнителя. | Бот: "Шагай, как королева..." → Польз.: "Сердцеедка" |
| 17 | Логическая загадка | List загадок с ответами |
Бот задаёт логическую загадку, пользователь рассуждает и даёт ответ. | Бот: "Что можно сломать, даже не касаясь?" → Польз.: "Обещание" |
| 18 | Сортировщик по порядку | List для последовательности |
Бот предлагает упорядочить элементы (планеты по удалённости, события по хронологии). | Бот: "Расположите: Юпитер, Марс, Земля, Венера" → Польз.: "Венера, Земля, Марс, Юпитер" |
| 19 | Синонимы/антонимы | HashMap<слово, синоним/антоним> |
Бот показывает слово, пользователь вводит синоним или антоним (в зависимости от режима). | Бот: "Синоним к 'быстрый'" → Польз.: "скорый" |
| 20 | Кто это сказал? (Цитаты) | HashMap<цитата, персонаж+произведение> |
Усложнённая версия задания 7: нужно угадать и персонажа, и произведение. | Бот: "Быть или не быть?" → Польз.: "Гамлет, трагедия Шекспира" |
✅ Критерии оценивания
| Критерий | Балл | Описание | |
|---|---|---|---|
| Работоспособность | 1 | Реализованы режимы для команд /quiz и /start(описание игры), /stop, /stats(подсчет очков) |
|
| Правильность | 1 | Использование хотя бы одной Map и одной Set/List и любой другой коллекции |
|
| Многопользовательский режим | 1 | Хранение состояния пользователя между сообщениями (2 пользователя одновременно со своим сетом вопросов) | |
| Индивидуальность | 1 | Индивидуальный вариант + доп. команды/”интересный”GUI/ | |
| Соблюдение дедлайна | 1 | Сдача вовремя |