Files
Igor-kr/OOP/task/4/TASK.md
T
2026-07-14 12:20:34 +03:00

121 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### Задача 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. Создайте объект поэмы и запустите титры.
---
### Задача 5. Библиотека (ООП - Инкапсуляция и Взаимодействие)
**Постановка**
* **Книга:** Имеет название, автора и статус (*"В библиотеке"*, *"Выдана"*). Может менять свой статус на противоположный.
* **Читатель:** Имеет имя и список взятых книг. Может брать и возвращать книги.
* **Библиотека:** Содержит список всех доступных книг. Может выдавать книгу читателю.
**Задание**
**Класс `Book`:**
1. Создайте класс `Book`.
2. В `__init__(self, title, author)` определите свойства `title`, `author` и `status` (по умолчанию *"В библиотеке"*).
3. Создайте метод `change_status(self)`, меняющий статус книги на *"Выдана"*, если она в библиотеке, и обратно.
**Класс `Reader`:**
1. Создайте класс `Reader`.
2. В `__init__(self, name)` сохраните имя и создайте пустой список `borrowed_books`.
3. Создайте метод `take_book(self, book)`, добавляющий переданную книгу в список.
4. Создайте метод `return_book(self, book)`, удаляющий книгу из списка.
**Класс `Library`:**
1. Создайте класс `Library`.
2. В `__init__(self)` создайте список `books` и добавьте туда несколько книг по умолчанию.
3. Создайте метод `lend_book(self, book, reader)`, который проверяет статус книги, меняет его через метод книги на *"Выдана"* и передает читателю в его список.
**Тесты:**
1. Создайте библиотеку.
2. Создайте читателя.
3. Используя библиотеку, выдайте читателю книгу.
---
### Задача 6. Магазин (ООП - Агрегация)
**Постановка**
* **Товар:** Имеет название и цену.
* **Корзина:** Содержит список товаров. Может добавлять товар и считать общую стоимость.
* **Покупатель:** Имеет имя, баланс и корзину. Может оплачивать корзину.
**Задание**
**Класс `Product`:**
1. Создайте класс `Product`.
2. Создайте метод `__init__(self, name, price)`.
**Класс `Cart`:**
1. Создайте класс `Cart`.
2. В `__init__(self)` создайте пустой список `products`.
3. Создайте метод `add_product(self, product)`, добавляющий товар в список.
4. Создайте метод `get_total(self)`, возвращающий сумму цен всех товаров.
**Класс `Customer`:**
1. Создайте класс `Customer`.
2. В `__init__(self, name, balance, cart)` сохраните переданные параметры.
3. Создайте метод `pay(self)`, который проверяет, хватает ли баланса для оплаты корзины. Если хватает — вычитает сумму из баланса и очищает корзину. Если нет — выводит предупреждение.
**Тесты:**
1. Создайте несколько товаров.
2. Создайте корзину и добавьте в нее товары.
3. Создайте покупателя, передав ему корзину и баланс.
4. Заставьте покупателя оплатить товары в корзине.