חזרה – מעקב ניקוד
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 69 מתוך 70.
אתגר
קלבואו נבנה מערכת למעקב אחר ניקוד בטבלת דירוג של משחק! תיצרו שתי מחלקות שפועלות יחד: אחת שמייצגת רשומות ניקוד אישיות, ואחרת שמנהלת את טבלת הדירוג עם יכולות מיון המבוססות על העמסת אופרטורים.
תארגנו את הקוד בשלושה קבצים:
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 פשוט עובד עם האובייקטים המותאמים אישית שלכם!
תקבלו שישה קלטים שמייצגים שלושה שחקנים:
- שם השחקן הראשון
- הניקוד של השחקן הראשון (מספר)
- שם השחקן השני
- הניקוד של השחקן השני (מספר)
- שם השחקן השלישי
- הניקוד של השחקן השלישי (מספר)
בקובץ הראשי שלכם, צרו טבלת דירוג, הוסיפו את כל שלוש הרשומות, קראו ל-: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: להציג את התוצאות הממוינות
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין