### Задача 4. Поэма Края (ООП и работа с JSON) > **Контекст лора:** > Игрок проделал долгий путь, чтобы достичь конца игры. Теперь он видит слова на экране и слышит голоса из пустоты. Вселенная обращается к нему напрямую. В финале Поэма Края должна связать мысли игрока и послание вселенной воедино, прочитав сакральный текст из внешнего источника. **Постановка** * **Читатель поэмы:** Имеет имя файла и может читать текст поэмы из JSON-файла. * **Игрок:** Имеет имя и может видеть слова на экране. * **Вселенная:** Имеет имя и может произносить финальное послание. * **Поэма Края:** Содержит читателя, игрока и вселенную; может воспроизводить титры, используя текст из JSON. **Задание** **Класс `PoemReader`:** 1. Импортируйте модуль `json`. 2. Создайте класс `PoemReader`. 3. Создайте метод `__init__(self, filename)`. 4. Создайте метод `read_poem(self)`, который открывает JSON-файл на чтение (с кодировкой `utf-8`), преобразует его содержимое в словарь и возвращает значение по ключу `"poem_text"`. **Класс `Player`:** 1. Создайте класс `Player`. 2. Создайте метод `__init__(self, name)`. 3. Создайте метод `see_words(self)`, который выводит сообщение: *"[Имя] читает наши мысли так, словно это слова на экране."* **Класс `Universe`:** 1. Создайте класс `Universe`. 2. Создайте метод `__init__(self)`, определяющий свойство `name` равным `"Вселенная"`. 3. Создайте метод `speak(self)`, выводящий фразу: *"И Вселенная говорит тебе: Я люблю тебя."* **Класс `EndPoem`:** 1. Создайте класс `EndPoem`. 2. Создайте метод `__init__(self, reader, player, universe)`. 3. Создайте метод `play_credits(self)`, который: вызывает чтение текста из JSON, выводит его на экран, а затем вызывает методы игрока и вселенной. **Тесты:** 1. Создайте файл `poem.json` рядом с вашим скриптом, поместив туда словарь с ключом `"poem_text"` и текстом поэмы. 2. Создайте объект читателя, передав ему имя файла. 3. Создайте объекты игрока и вселенной. 4. Создайте объект поэмы и запустите титры.