Menu
CoddyTech

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

جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 69 من 70.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لتتبّع النقاط في لوحة ترتيب للألعاب! ستنشئ فئتين تعملان معًا: إحداهما تمثّل إدخالات النقاط الفردية، والأخرى تدير لوحة الترتيب مع إمكانات الفرز المدعومة بزيادة تحميل المعاملات.

ستنظّم شيفرتك في ثلاثة ملفات:

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

تؤدي مقارنة إدخالين باستخدام < إلى استدعاء طريقة التحويل الفوقية __lt، وبالتالي يمكن لـ table.sort ترتيب كائنات ScoreEntry. اجعل معنى __lt هو "أقل من"، واعكس الترتيب في استدعاء الفرز: فلو كان معنى __lt هو "أكبر من"، فستكون كل مقارنة باستخدام < بين إدخالين في أي موضع من البرنامج معكوسة المعنى.

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

  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: اعرض النتائج المرتبة

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

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