Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 67 из 70.

challenge icon

Задание

Легко

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

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

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

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

  1. Тип first предмета ("weapon" или "potion")
  2. Имя first предмета
  3. Значение first предмета (число)
  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" or "potion")
-- и добавить его в инвентарь

-- TODO: Создать второй предмет на основе type2 ("weapon" or "potion")
-- и добавить его в инвентарь

-- TODO: Вызвать listItems(), чтобы вывести информацию о каждом предмете

-- TODO: Вывести "Total: {value} gold" с помощью getTotalValue()

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua