요약 - 인벤토리 시스템
Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 67번째.
챌린지
쉬움롤플레잉 게임을 위한 완전한 인벤토리 관리 시스템을 구축해 봅시다! 상속, 다형성, 그리고 구성을 하나의 응집력 있는 프로젝트로 결합하여, 아이템 유형의 계층 구조와 이를 관리하는 매니저 클래스를 만들게 됩니다.
코드는 다음 다섯 개의 파일로 구성됩니다:
Item.lua: 모든 아이템의 기본 클래스입니다. 각 아이템은name과value(금화 단위)를 가집니다."{name}: {value} gold"형식의 문자열을 반환하는:getInfo()메서드를 포함하세요.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)메서드, 각 아이템의:getInfo()를 한 줄에 하나씩 출력하는:listItems()메서드, 그리고 모든 아이템 가치의 합계를 반환하는: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, 포션은 HP 50 회복
-- TODO: 인벤토리 생성
-- TODO: type1("weapon" 또는 "potion")에 따라 첫 번째 아이템 생성
-- 그리고 인벤토리에 추가
-- TODO: type2("weapon" 또는 "potion")에 따라 두 번째 아이템 생성
-- 그리고 인벤토리에 추가
-- TODO: listItems()를 호출하여 각 아이템의 정보 출력
-- TODO: getTotalValue()를 사용하여 "Total: {value} gold" 출력