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

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

جزء من قسم البرمجة كائنية التوجه في رحلة 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. قيمة العنصر الثاني (رقم)

بالنسبة إلى الأسلحة، استخدم قيمة damage ثابتة تساوي 25. وبالنسبة إلى الجرعات، استخدم قيمة heal ثابتة تساوي 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" or "potion")
-- وأضفه إلى المخزون

-- TODO: أنشئ العنصر الثاني بناءً على type2 ("weapon" or "potion")
-- وأضفه إلى المخزون

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

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت