Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - نظام المخزون

جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 67 من 70.

challenge icon

التحدي

سهل

لنقم ببناء نظام كامل لإدارة المخزون للعبة تقمص أدوار (RPG)! ستقوم بإنشاء تسلسل هرمي لأنواع العناصر وفئة مدير لتنظيمها — مما يجمع بين الوراثة (inheritance)، وتعدد الأشكال (polymorphism)، والتركيب (composition) في مشروع واحد متماسك.

ستقوم بتنظيم الكود الخاص بك عبر خمسة ملفات:

  • Item.lua: الفئة الأساسية لجميع العناصر. كل عنصر له name و value (بالعملات الذهبية). قم بتضمين تابع :getInfo() الذي يعيد سلسلة نصية بتنسيق "{name}: {value} gold".
  • Weapon.lua: عنصر متخصص يرث من Item. الأسلحة لها سمة damage إضافية. قم بإعادة تعريف (Override) لـ :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: اجمع كل شيء معاً! قم بإنشاء مخزون واملأه بالعناصر بناءً على المدخلات التي تتلقاها. ثم قم بسرد جميع العناصر واطبع القيمة الإجمالية للمخزون في السطر الأخير.

جمال هذا التصميم يكمن في تعدد الأشكال (polymorphism) أثناء العمل — لا يحتاج 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 نقطة حياة

-- TODO: إنشاء حقيبة (inventory)

-- TODO: إنشاء العنصر الأول بناءً على type1 ("weapon" أو "potion")
-- وإضافته إلى الحقيبة

-- TODO: إنشاء العنصر الثاني بناءً على type2 ("weapon" أو "potion")
-- وإضافته إلى الحقيبة

-- TODO: استدعاء listItems() لطباعة معلومات كل عنصر

-- TODO: طباعة "Total: {value} gold" باستخدام getTotalValue()

جميع دروس Object Oriented Programming