Menu
Coddy logo textTech

요약 - 인벤토리 시스템

Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 67번째.

challenge icon

챌린지

쉬움

롤플레잉 게임을 위한 완전한 인벤토리 관리 시스템을 만들어 봅시다! item 유형의 계층 구조와 이를 구성하는 manager class를 만들면서, 상속, 다형성, 컴포지션을 하나의 응집력 있는 프로젝트로 결합하게 됩니다.

코드를 다음 다섯 개의 파일로 구성합니다:

  • Item.lua: 모든 item을 위한 기본 class입니다. 각 item에는 namevalue(gold coin 단위)가 있습니다. :getInfo() 메서드를 포함하여 "{name}: {value} gold" 형식의 문자열을 반환하도록 합니다.
  • Weapon.lua: Item에서 inherits하는 특수한 item입니다. Weapon에는 추가 damage attribute가 있습니다. :getInfo()를 재정의하여 "{name}: {value} gold, {damage} damage"를 반환하도록 합니다.
  • Potion.lua: Item에서 inherits하는 또 다른 특수한 item입니다. Potion에는 healAmount attribute가 있습니다. :getInfo()를 재정의하여 "{name}: {value} gold, heals {healAmount} HP"를 반환하도록 합니다.
  • Inventory.lua: item의 collection을 저장하는 manager class입니다. 모든 유형의 item을 추가할 수 있도록 :addItem(item) 메서드를 포함하고, 각 item에 대해 :getInfo()를 한 줄에 하나씩 출력하는 :listItems() 메서드와 모든 item value의 합을 반환하는 :getTotalValue() 메서드를 포함합니다.
  • main.lua: everything을 하나로 결합합니다! 입력으로 받은 내용을 바탕으로 Inventory를 생성하고 item으로 채웁니다. 그런 다음 모든 item을 나열하고 마지막 줄에 전체 Inventory value를 출력합니다.

이 설계의 장점은 다형성이 실제로 작동한다는 점입니다. Inventory는 Weapon을 저장하는지 Potion을 저장하는지 알 필요가 없습니다. 단지 :getInfo()를 호출하면 각 item이 자신의 유형에 맞게 적절히 응답합니다.

추가할 두 item을 설명하는 여섯 개의 입력을 받습니다:

  1. 첫 번째 item 유형 ("weapon" 또는 "potion")
  2. 첫 번째 item name
  3. 첫 번째 item value (숫자)
  4. 두 번째 item 유형 ("weapon" 또는 "potion")
  5. 두 번째 item name
  6. 두 번째 item value (숫자)

Weapon에는 고정 damage 25를 사용합니다. Potion에는 고정 heal amount 50을 사용합니다.

두 item을 모두 추가한 후 :listItems()를 호출하여 각 item의 info를 출력하고, 마지막 줄에 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: getTotalValue()를 사용하여 "Total: {value} gold" 출력

객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러