Menu
Coddy logo textTech

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

CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 67/70。

challenge icon

チャレンジ

簡単

ロールプレイングゲーム用の完全な Inventory 管理システムを構築しましょう!item の種類の階層と、それらを整理する manager class を作成します。継承、ポリモーフィズム、コンポジションを1つのまとまったプロジェクトに組み合わせます。

コードを5つのファイルに分けて整理します。

  • Item.lua:すべての item の基底 class。各 item には namevalue(gold coin 単位)があります。:getInfo() メソッドを含め、"{name}: {value} gold" 形式の文字列を返します。
  • Weapon.lua:Item を継承する特殊な item。Weapon には追加の damage attribute があります。:getInfo() をオーバーライドし、"{name}: {value} gold, {damage} damage" を返します。
  • Potion.lua:Item を継承するもう1つの特殊な item。Potion には healAmount attribute があります。:getInfo() をオーバーライドし、"{name}: {value} gold, heals {healAmount} HP" を返します。
  • Inventory.lua:item の collection を格納する manager class。任意の種類の item を追加する :addItem(item) メソッド、各 item に対して :getInfo() を1行ずつ出力する :listItems() メソッド、すべての item の value の合計を返す :getTotalValue() メソッドを含めます。
  • main.lua:すべてをまとめます!Inventory を作成し、受け取った inputs に基づいて item を追加します。その後、すべての item を一覧表示し、最後の行に Inventory の合計 value を出力します。

この設計の魅力は、ポリモーフィズムを実際に活用できる点です。Inventory は、Weapon と Potion のどちらを格納しているかを知る必要がありません。単に :getInfo() を呼び出すだけで、各 item がその種類に応じて適切に応答します。

追加する2つの item を説明する6つの inputs を受け取ります。

  1. 最初の item の種類("weapon" または "potion"
  2. 最初の item の名前
  3. 最初の item の value(数値)
  4. 2番目の item の種類("weapon" または "potion"
  5. 2番目の item の名前
  6. 2番目の item の value(数値)

Weapon には固定の damage として 25 を使用します。Potion には固定の heal amount として 50 を使用します。

両方の item を追加した後、:listItems() を呼び出して各 item の情報を出力し、最後の行に Total: {value} gold を出力します。

たとえば、inputs が weaponIron Sword150potionHealth Elixir75 の場合、出力は次のようになります。

Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 gold

inputs が potionMana Potion50weaponSteel Axe200 の場合、出力は次のようになります。

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())

-- 2番目のアイテムの入力を読み取る
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") に基づいて2番目のアイテムを作成する
-- そしてそれをインベントリに追加する

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

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

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Luaオンラインコンパイラ