חזרה – מערכת מלאי
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 67 מתוך 70.
אתגר
קלבואו נבנה מערכת מלאה לניהול מלאי עבור משחק תפקידים! תיצרו היררכיה של סוגי פריטים ומחלקת מנהל שתארגן אותם: שילוב של ירושה, פולימורפיזם והרכבה בפרויקט אחד מגובש.
תארגנו את הקוד בחמישה קבצים:
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(), וכל פריט מגיב בהתאם לסוג שלו.
תקבלו שישה קלטים המתארים שני פריטים להוספה:
- סוג הפריט הראשון (
"weapon"או"potion") - שם הפריט הראשון
- ערך הפריט הראשון (מספר)
- סוג הפריט השני (
"weapon"או"potion") - שם הפריט השני
- ערך הפריט השני (מספר)
עבור נשקים, השתמשו בנזק קבוע של 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()
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין