Menu
Coddy logo textTech

復習 - インベントリシステム

CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 67/70。

challenge icon

チャレンジ

簡単

ロールプレイングゲームのための完全なインベントリ管理システムを構築しましょう!アイテムタイプの階層と、それらを整理するためのマネージャークラスを作成します。継承、ポリモーフィズム、コンポジションを1つのまとまったプロジェクトに統合します。

コードは5つのファイルに分けて構成します:

  • Item.lua: すべてのアイテムのベースクラスです。各アイテムは namevalue(ゴールドコイン単位)を持ちます。"{name}: {value} gold" という形式の文字列を返す :getInfo() メソッドを含めてください。
  • Weapon.lua: Itemを継承した特化アイテムです。武器には追加の damage 属性があります。:getInfo() をオーバーライドして、"{name}: {value} gold, {damage} damage" を返すようにします。
  • Potion.lua: Itemを継承したもう1つの特化アイテムです。ポーションには healAmount 属性があります。:getInfo() をオーバーライドして、"{name}: {value} gold, heals {healAmount} HP" を返すようにします。
  • Inventory.lua: アイテムのコレクションを格納するマネージャークラスです。任意のタイプのアイテムを追加する :addItem(item) メソッド、各アイテムの :getInfo() を(1行に1つずつ)出力する :listItems() メソッド、およびすべてのアイテムの価値の合計を返す :getTotalValue() メソッドを含めてください。
  • main.lua: すべてをまとめます!インベントリを作成し、受け取った入力に基づいてアイテムを追加します。その後、すべてのアイテムをリスト表示し、最後の行にインベントリの総価値を出力します。

この設計の素晴らしさは、ポリモーフィズムが機能している点にあります。Inventoryは、格納しているのが Weapon なのか Potion なのかを知る必要はありません。単に :getInfo() を呼び出すだけで、各アイテムがそのタイプに基づいて適切に応答します。

追加する2つのアイテムを説明する6つの入力を受け取ります:

  1. 1つ目のアイテムのタイプ ("weapon" または "potion")
  2. 1つ目のアイテムの名前
  3. 1つ目のアイテムの価値(数値)
  4. 2つ目のアイテムのタイプ ("weapon" または "potion")
  5. 2つ目のアイテムの名前
  6. 2つ目のアイテムの価値(数値)

武器の場合、ダメージは固定値の 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')

-- 1つ目のアイテムの入力を読み込む
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())

-- 2つ目のアイテムの入力を読み込む
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())

-- 固定値: 武器のダメージは25、ポーションの回復量は50 HP

-- TODO: インベントリを作成する

-- TODO: type1("weapon" または "potion")に基づいて1つ目のアイテムを作成し、
-- インベントリに追加する

-- TODO: type2("weapon" または "potion")に基づいて2つ目のアイテムを作成し、
-- インベントリに追加する

-- TODO: listItems() を呼び出して各アイテムの情報を表示する

-- TODO: getTotalValue() を使用して "Total: {value} gold" を表示する

Object Oriented Programmingのすべてのレッスン