Menu
Coddy logo textTech

Повторение: Система инвентаря

Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 67 из 70.

challenge icon

Задание

Легко

Давайте создадим полноценную систему управления инвентарем для ролевой игры! Вы создадите иерархию типов предметов и класс-менеджер для их организации, объединив наследование, полиморфизм и композицию в одном цельном проекте.

Вы организуете свой код в пяти файлах:

  • 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(), и каждый предмет отвечает соответствующим образом в зависимости от своего типа.

Вы получите шесть входных данных, описывающих два предмета для добавления:

  1. Тип первого предмета ("weapon" или "potion")
  2. Название первого предмета
  3. Стоимость первого предмета (число)
  4. Тип второго предмета ("weapon" или "potion")
  5. Название второго предмета
  6. Стоимость второго предмета (число)

Для оружия используйте фиксированный урон 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