復習 - インベントリシステム
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 67/70。
チャレンジ
簡単ロールプレイングゲーム用の完全な Inventory 管理システムを構築しましょう!item の種類の階層と、それらを整理する manager class を作成します。継承、ポリモーフィズム、コンポジションを1つのまとまったプロジェクトに組み合わせます。
コードを5つのファイルに分けて整理します。
Item.lua:すべての item の基底 class。各 item にはnameとvalue(gold coin 単位)があります。:getInfo()メソッドを含め、"{name}: {value} gold"形式の文字列を返します。Weapon.lua:Item を継承する特殊な item。Weapon には追加のdamageattribute があります。:getInfo()をオーバーライドし、"{name}: {value} gold, {damage} damage"を返します。Potion.lua:Item を継承するもう1つの特殊な item。Potion にはhealAmountattribute があります。: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 を受け取ります。
- 最初の item の種類(
"weapon"または"potion") - 最初の item の名前
- 最初の item の value(数値)
- 2番目の item の種類(
"weapon"または"potion") - 2番目の item の名前
- 2番目の item の value(数値)
Weapon には固定の damage として 25 を使用します。Potion には固定の heal amount として 50 を使用します。
両方の item を追加した後、:listItems() を呼び出して各 item の情報を出力し、最後の行に Total: {value} gold を出力します。
たとえば、inputs が weapon、Iron Sword、150、potion、Health Elixir、75 の場合、出力は次のようになります。
Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 goldinputs が 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())
-- 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オンラインコンパイラ