🎯 Цель работы:

Реализация логики викторины в телеграм с хранением состояния и статистики.

Применить коллекции (HashMap, HashSet) для решения практических задач: хранения данных (страна-столица), отслеживания уникальности (избегание повторов вопросов) и ведения статистики (счет пользователя).

📋 Задание

Доработать бота из предыдущей работы, добавив команды /quiz и /stats. По команде /quiz бот начинает раунд викторины, задавая случайный, но еще не заданный в текущей сессии вопрос. Пользователь отвечает текстом. Бот проверяет ответ и сообщает результат. Ведутся счет правильных ответов и статистика.

  1. Спроектировать структуру хранения данных (какая коллекция для чего)
  2. Реализовать логику игры с состоянием
  3. Обработать граничные случаи (закончились вопросы, неверный формат ответа)
  4. Предусмотреть расширение (добавление новых вопросов через файл)

Указания по разработке

  1. Основные классы приложения
Пользователь → 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. Создайте класс загрузки данных для викторины из файла

  2. Варианты индивидуальные

Название Концепция и коллекции Краткое описание Пример диалога
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 Сдача вовремя