Повторение: Система инвентаря
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 67 из 70.
Задание
ЛегкоДавайте создадим полноценную систему управления инвентарем для ролевой игры! Вы создадите иерархию типов предметов и класс-менеджер для их организации, объединив наследование, полиморфизм и композицию в одном цельном проекте.
Вы организуете свой код в пяти файлах:
Item.lua: Базовый класс для всех предметов. У каждого предмета естьnameиvalue(в золотых монетах). Включите метод:getInfo(), который возвращает строку в формате"{name}: {value} gold".Weapon.lua: Специализированный предмет, наследуемый от Item. У оружия есть дополнительный атрибутdamage. Переопределите:getInfo(), чтобы он возвращал"{name}: {value} gold, {damage} damage".Potion.lua: Еще один специализированный предмет, наследуемый от Item. У зелий есть атрибутhealAmount. Переопределите:getInfo(), чтобы он возвращал"{name}: {value} gold, heals {healAmount} HP".Inventory.lua: Класс-менеджер, который хранит коллекцию предметов. Включите метод:addItem(item)для добавления любого типа предметов, метод:listItems(), который выводит:getInfo()для каждого предмета (по одному в строке), и метод:getTotalValue(), который возвращает сумму стоимостей всех предметов.main.lua: Соберите все вместе! Создайте инвентарь и заполните его предметами на основе полученных входных данных. Затем выведите список всех предметов и общую стоимость инвентаря в последней строке.
Прелесть такого дизайна заключается в полиморфизме в действии — вашему Inventory не нужно знать, хранит ли он Weapon или Potion. Он просто вызывает :getInfo(), и каждый предмет отвечает соответствующим образом в зависимости от своего типа.
Вы получите шесть входных данных, описывающих два предмета для добавления:
- Тип первого предмета (
"weapon"или"potion") - Название первого предмета
- Стоимость первого предмета (число)
- Тип второго предмета (
"weapon"или"potion") - Название второго предмета
- Стоимость второго предмета (число)
Для оружия используйте фиксированный урон 25. Для зелий используйте фиксированное количество исцеления 50.
После добавления обоих предметов вызовите :listItems(), чтобы вывести информацию о каждом предмете, а затем выведите Total: {value} gold в последней строке.
Например, если входные данные: weapon, Iron Sword, 150, potion, Health Elixir и 75, вывод должен быть следующим:
Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 goldЕсли входные данные: potion, Mana Potion, 50, weapon, Steel Axe и 200, вывод должен быть следующим:
Mana Potion: 50 gold, heals 50 HP
Steel Axe: 200 gold, 25 damage
Total: 250 goldПопробуйте сами
-- main.lua: Собираем всё вместе
local Weapon = require('Weapon')
local Potion = require('Potion')
local Inventory = require('Inventory')
-- Чтение входных данных для первого предмета
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())
-- Чтение входных данных для второго предмета
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())
-- Фиксированные значения: у оружия 25 урона, зелья восстанавливают 50 HP
-- TODO: Создать инвентарь
-- TODO: Создать первый предмет на основе type1 ("weapon" или "potion")
-- и добавить его в инвентарь
-- TODO: Создать второй предмет на основе type2 ("weapon" или "potion")
-- и добавить его в инвентарь
-- TODO: Вызвать listItems() для вывода информации о каждом предмете
-- TODO: Вывести "Total: {value} gold", используя getTotalValue()
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур9Композиция и примеси
Отношение "Has-A"ДелегированиеПростые примесиПрименение нескольких примесейПримеси против наследованияИтоги — Сборка робота12Финальные испытания
Повторение: Система инвентаряПовторение: Менеджер пользователейПовторение: Трекер счетаИтоговая проверка ООП