Повторение: Система инвентаря
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 67 из 70.
Задание
ЛегкоДавайте создадим полноценную систему управления инвентарём для ролевой игры! Вы создадите иерархию типов предметов и класс-менеджер для их организации, объединив наследование, полиморфизм и композицию в одном целостном проекте.
Вы организуете код в пяти файлах:
Item.lua: базовый класс для всех предметов. Каждый предмет имеетnameиvalue(в золотых монетах). Добавьте метод:getInfo(), который возвращает строку в формате"{name}: {value} gold".Weapon.lua: специализированный предмет, который inherits from Item. Оружие имеет дополнительный атрибутdamage. Переопределите:getInfo(), чтобы он возвращал"{name}: {value} gold, {damage} damage".Potion.lua: ещё один специализированный предмет, наследующий от Item. Зелья имеют атрибутhealAmount. Переопределите:getInfo(), чтобы он возвращал"{name}: {value} gold, heals {healAmount} HP".Inventory.lua: класс-менеджер, который хранит collection предметов. Добавьте метод:addItem(item)для добавления любого типа предмета, метод:listItems(), который выводит:getInfo()для каждого предмета (по одному в строке), и метод:getTotalValue(), который возвращает сумму значений всех предметов.main.lua: объедините всё вместе! Создайте инвентарь и заполните его предметами на основе полученных inputs. Затем выведите список всех предметов и общую стоимость инвентаря в последней строке.
Прелесть этой конструкции — в действии полиморфизма. Ваш Inventory не должен знать, хранит ли он Weapon или Potion. Он просто вызывает :getInfo(), и каждый предмет отвечает соответствующим образом в зависимости от своего типа.
Вы получите шесть входных значений, описывающих два предмета для добавления:
- Тип first предмета (
"weapon"или"potion") - Имя first предмета
- Значение first предмета (число)
- Тип второго предмета (
"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" or "potion")
-- и добавить его в инвентарь
-- TODO: Создать второй предмет на основе type2 ("weapon" or "potion")
-- и добавить его в инвентарь
-- TODO: Вызвать listItems(), чтобы вывести информацию о каждом предмете
-- TODO: Вывести "Total: {value} gold" с помощью getTotalValue()
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур9Композиция и примеси
Отношение "Has-A"ДелегированиеПростые примесиПрименение нескольких примесейПримеси против наследованияИтоги — Сборка робота12Финальные испытания
Повторение: Система инвентаряПовторение: Менеджер пользователейПовторение: Трекер счетаИтоговая проверка ООППотренируйтесь самостоятельно: Онлайн-компилятор Lua