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: חברו את הכול יחד! צרו Leaderboard, הוסיפו רשומות ניקוד על סמך הקלטים שתקבלו, מיינו את טבלת הדירוג והציגו את התוצאות.

השוואת שתי רשומות באמצעות < קוראת למטא-מתודה __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 אונליין