7.0 KiB
7.0 KiB
Задача 4. Поэма Края (ООП и работа с JSON)
Контекст лора: Игрок проделал долгий путь, чтобы достичь конца игры. Теперь он видит слова на экране и слышит голоса из пустоты. Вселенная обращается к нему напрямую. В финале Поэма Края должна связать мысли игрока и послание вселенной воедино, прочитав сакральный текст из внешнего источника.
Постановка
- Читатель поэмы: Имеет имя файла и может читать текст поэмы из JSON-файла.
- Игрок: Имеет имя и может видеть слова на экране.
- Вселенная: Имеет имя и может произносить финальное послание.
- Поэма Края: Содержит читателя, игрока и вселенную; может воспроизводить титры, используя текст из JSON.
Задание
Класс PoemReader:
- Импортируйте модуль
json. - Создайте класс
PoemReader. - Создайте метод
__init__(self, filename). - Создайте метод
read_poem(self), который открывает JSON-файл на чтение (с кодировкойutf-8), преобразует его содержимое в словарь и возвращает значение по ключу"poem_text".
Класс Player:
- Создайте класс
Player. - Создайте метод
__init__(self, name). - Создайте метод
see_words(self), который выводит сообщение: "[Имя] читает наши мысли так, словно это слова на экране."
Класс Universe:
- Создайте класс
Universe. - Создайте метод
__init__(self), определяющий свойствоnameравным"Вселенная". - Создайте метод
speak(self), выводящий фразу: "И Вселенная говорит тебе: Я люблю тебя."
Класс EndPoem:
- Создайте класс
EndPoem. - Создайте метод
__init__(self, reader, player, universe). - Создайте метод
play_credits(self), который: вызывает чтение текста из JSON, выводит его на экран, а затем вызывает методы игрока и вселенной.
Тесты:
- Создайте файл
poem.jsonрядом с вашим скриптом, поместив туда словарь с ключом"poem_text"и текстом поэмы. - Создайте объект читателя, передав ему имя файла.
- Создайте объекты игрока и вселенной.
- Создайте объект поэмы и запустите титры.
Задача 5. Библиотека (ООП - Инкапсуляция и Взаимодействие)
Постановка
- Книга: Имеет название, автора и статус ("В библиотеке", "Выдана"). Может менять свой статус на противоположный.
- Читатель: Имеет имя и список взятых книг. Может брать и возвращать книги.
- Библиотека: Содержит список всех доступных книг. Может выдавать книгу читателю.
Задание
Класс Book:
- Создайте класс
Book. - В
__init__(self, title, author)определите свойстваtitle,authorиstatus(по умолчанию "В библиотеке"). - Создайте метод
change_status(self), меняющий статус книги на "Выдана", если она в библиотеке, и обратно.
Класс Reader:
- Создайте класс
Reader. - В
__init__(self, name)сохраните имя и создайте пустой списокborrowed_books. - Создайте метод
take_book(self, book), добавляющий переданную книгу в список. - Создайте метод
return_book(self, book), удаляющий книгу из списка.
Класс Library:
- Создайте класс
Library. - В
__init__(self)создайте списокbooksи добавьте туда несколько книг по умолчанию. - Создайте метод
lend_book(self, book, reader), который проверяет статус книги, меняет его через метод книги на "Выдана" и передает читателю в его список.
Тесты:
- Создайте библиотеку.
- Создайте читателя.
- Используя библиотеку, выдайте читателю книгу.
Задача 6. Магазин (ООП - Агрегация)
Постановка
- Товар: Имеет название и цену.
- Корзина: Содержит список товаров. Может добавлять товар и считать общую стоимость.
- Покупатель: Имеет имя, баланс и корзину. Может оплачивать корзину.
Задание
Класс Product:
- Создайте класс
Product. - Создайте метод
__init__(self, name, price).
Класс Cart:
- Создайте класс
Cart. - В
__init__(self)создайте пустой списокproducts. - Создайте метод
add_product(self, product), добавляющий товар в список. - Создайте метод
get_total(self), возвращающий сумму цен всех товаров.
Класс Customer:
- Создайте класс
Customer. - В
__init__(self, name, balance, cart)сохраните переданные параметры. - Создайте метод
pay(self), который проверяет, хватает ли баланса для оплаты корзины. Если хватает — вычитает сумму из баланса и очищает корзину. Если нет — выводит предупреждение.
Тесты:
- Создайте несколько товаров.
- Создайте корзину и добавьте в нее товары.
- Создайте покупателя, передав ему корзину и баланс.
- Заставьте покупателя оплатить товары в корзине.