Menu
Coddy logo textTech

חזרה – מערכת מלאי

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 67 מתוך 70.

challenge icon

אתגר

קל

בואו נבנה מערכת מלאה לניהול מלאי עבור משחק תפקידים! תיצרו היררכיה של סוגי פריטים ומחלקת מנהל שתארגן אותם: שילוב של ירושה, פולימורפיזם והרכבה בפרויקט אחד מגובש.

תארגנו את הקוד בחמישה קבצים:

  • Item.lua: מחלקת הבסיס לכל הפריטים. לכל פריט יש name ו-value (במטבעות זהב). הוסיפו מתודה :getInfo() שמחזירה מחרוזת בתבנית "{name}: {value} gold".
  • Weapon.lua: פריט ייעודי שיורש מ-Item. לנשקים יש מאפיין נוסף בשם damage. דרסו את :getInfo() כך שתחזיר "{name}: {value} gold, {damage} damage".
  • Potion.lua: פריט ייעודי נוסף שיורש מ-Item. לשיקויים יש מאפיין healAmount. דרסו את :getInfo() כך שתחזיר "{name}: {value} gold, heals {healAmount} HP".
  • Inventory.lua: מחלקת מנהל ששומרת אוסף של פריטים. הוסיפו מתודה :addItem(item) להוספת פריט מכל סוג, מתודה :listItems() שמדפיסה את :getInfo() עבור כל פריט (אחד בכל שורה), ומתודה :getTotalValue() שמחזירה את סכום הערכים של כל הפריטים.
  • main.lua: חברו את הכול יחד! צרו מלאי והוסיפו אליו פריטים בהתאם לקלט שתקבלו. לאחר מכן הציגו את כל הפריטים והדפיסו את הערך הכולל של המלאי בשורה האחרונה.

היופי בתכנון הזה הוא פולימורפיזם בפעולה. Inventory לא צריכה לדעת אם היא מאחסנת Weapon או Potion. היא פשוט קוראת ל-:getInfo(), וכל פריט מגיב בהתאם לסוג שלו.

תקבלו שישה קלטים המתארים שני פריטים להוספה:

  1. סוג הפריט הראשון ("weapon" או "potion")
  2. שם הפריט הראשון
  3. ערך הפריט הראשון (מספר)
  4. סוג הפריט השני ("weapon" או "potion")
  5. שם הפריט השני
  6. ערך הפריט השני (מספר)

עבור נשקים, השתמשו בנזק קבוע של 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')

-- לקרוא את נתוני הקלט עבור הפריט הראשון
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: להדפיס "Total: {value} gold" באמצעות getTotalValue()

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Lua אונליין