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

مراجعة - متتبع النقاط

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

challenge icon

التحدي

سهل

لنقم ببناء نظام لتتبع النقاط للوحة صدارة الألعاب! ستقوم بإنشاء فئتين (classes) تعملان معاً—إحداهما تمثل إدخالات النقاط الفردية، والأخرى تدير لوحة الصدارة مع إمكانيات الفرز المدعومة بتحميل العوامل الزائد (operator overloading).

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

  • ScoreEntry.lua: قم بإنشاء فئة ScoreEntry التي تمثل نتيجة لاعب واحد. كل إدخال يحتوي على playerName و score. قم بتضمين طريقة :getInfo() التي تعيد سلسلة نصية بتنسيق "{playerName}: {score} points". الميزة الرئيسية هنا هي تنفيذ الطريقة الميتا (metamethod) المسماة __lt—ولكن تذكر، من أجل الترتيب التنازلي (أعلى الدرجات أولاً)، يجب أن تعيد المقارنة الخاصة بك true عندما تكون درجة الإدخال الأول أكبر من درجة الإدخال الثاني.
  • Leaderboard.lua: قم ببناء فئة Leaderboard التي تدير مجموعة من إدخالات النقاط. تحتاج لوحة الصدارة الخاصة بك إلى:
    • :addEntry(entry) — يضيف ScoreEntry إلى القائمة الداخلية
    • :sort() — يفرز الإدخالات من أعلى درجة إلى أدنى درجة باستخدام table.sort
    • :display() — يطبع المعلومات لكل إدخال، كل واحد في سطر
  • main.lua: اجمع كل شيء معاً! قم بإنشاء Leaderboard، وأضف إدخالات النقاط بناءً على المدخلات التي تتلقاها، وافرز لوحة الصدارة، واعرض النتائج.

الجزء الأنيق في هذا التصميم هو أن table.sort تستخدم تلقائياً طريقة __lt الخاصة بك لمقارنة كائنات ScoreEntry. من خلال تحديد كيفية مقارنة الإدخالات ببعضها البعض، سيعمل الفرز المدمج في Lua ببساطة مع كائناتك المخصصة!

ستتلقى ستة مدخلات تمثل ثلاثة لاعبين:

  1. اسم اللاعب الأول
  2. درجة اللاعب الأول (رقم)
  3. اسم اللاعب الثاني
  4. درجة اللاعب الثاني (رقم)
  5. اسم اللاعب الثالث
  6. درجة اللاعب الثالث (رقم)

في ملفك الرئيسي، قم بإنشاء لوحة صدارة، وأضف جميع الإدخالات الثلاثة، واستدعِ :sort()، ثم استدعِ :display() لإظهار النتائج المفروزة.

على سبيل المثال، إذا كانت المدخلات هي Alice، و 1500، و Bob، و 2300، و Charlie، و 1800، فيجب أن يكون المخرج:

Bob: 2300 points
Charlie: 1800 points
Alice: 1500 points

إذا كانت المدخلات هي Zara، و 500، و Max، و 750، و Luna، و 600، فيجب أن يكون المخرج:

Max: 750 points
Luna: 600 points
Zara: 500 points

جرّب بنفسك

-- الملف الرئيسي: تجميع كل شيء معاً
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- قراءة المدخلات لثلاثة لاعبين
local name1 = io.read()
local score1 = tonumber(io.read())
local name2 = io.read()
local score2 = tonumber(io.read())
local name3 = io.read()
local score3 = tonumber(io.read())

-- TODO: إنشاء لوحة متصدرين (Leaderboard) جديدة

-- TODO: لكل لاعب ScoreEntry إنشاء كائنات

-- TODO: إضافة جميع الإدخالات الثلاثة إلى لوحة المتصدرين

-- TODO: فرز لوحة المتصدرين

-- TODO: عرض النتائج المفروزة

جميع دروس Object Oriented Programming