Menu
Coddy logo textTech

חזרה – מעקב ניקוד

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 69 מתוך 70.

challenge icon

אתגר

קל

בואו נבנה מערכת למעקב אחר ניקוד בטבלת דירוג של משחק! תיצרו שתי מחלקות שפועלות יחד: אחת שמייצגת רשומות ניקוד אישיות, ואחרת שמנהלת את טבלת הדירוג עם יכולות מיון המבוססות על העמסת אופרטורים.

תארגנו את הקוד בשלושה קבצים:

  • ScoreEntry.lua: צרו מחלקה בשם ScoreEntry שמייצגת ניקוד של שחקן יחיד. לכל רשומה יש playerName ו-score. כללו מתודה :getInfo() שמחזירה מחרוזת בפורמט "{playerName}: {score} points". המאפיין המרכזי כאן הוא מימוש המטמתודה __lt, אבל זכרו, כדי לקבל סדר יורד (הניקוד הגבוה ביותר ראשון), ההשוואה צריכה להחזיר true כשהניקוד של הרשומה הראשונה גדול יותר מזה של השנייה.
  • Leaderboard.lua: בנו מחלקה בשם Leaderboard שמנהלת אוסף של רשומות ניקוד. טבלת הדירוג שלכם צריכה לכלול:
    • :addEntry(entry): מוסיפה ScoreEntry לרשימה הפנימית
    • :sort(): ממיינת את הרשומות מהניקוד הגבוה לנמוך באמצעות table.sort
    • :display(): מדפיסה את המידע של כל רשומה, אחת בכל שורה
  • main.lua: חברו הכול יחד! צרו טבלת דירוג, הוסיפו רשומות ניקוד בהתאם לקלטים שתקבלו, מיינו את טבלת הדירוג והציגו את התוצאות.

החלק האלגנטי בעיצוב הזה הוא ש-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: להציג את התוצאות הממוינות

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Lua אונליין