復習 - インベントリシステム
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 67/70。
チャレンジ
簡単ロールプレイングゲームのための完全なインベントリ管理システムを構築しましょう!アイテムタイプの階層と、それらを整理するためのマネージャークラスを作成します。継承、ポリモーフィズム、コンポジションを1つのまとまったプロジェクトに統合します。
コードは5つのファイルに分けて構成します:
Item.lua: すべてのアイテムのベースクラスです。各アイテムはnameとvalue(ゴールドコイン単位)を持ちます。"{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つ目のアイテムのタイプ (
"weapon"または"potion") - 1つ目のアイテムの名前
- 1つ目のアイテムの価値(数値)
- 2つ目のアイテムのタイプ (
"weapon"または"potion") - 2つ目のアイテムの名前
- 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" を表示する