חזרה – מעקב ניקוד
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 69 מתוך 70.
אתגר
קלבואו נבנה מערכת למעקב אחר ניקוד עבור טבלת דירוג במשחק! תיצרו שתי מחלקות שפועלות יחד: אחת שמייצגת רשומות ניקוד של שחקנים, ואחרת שמנהלת את טבלת הדירוג ויכולה למיין אותה באמצעות העמסת אופרטורים.
תארגנו את הקוד שלכם בשלושה קבצים:
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 הייתה ״גדול מ־״, כל שימוש ב-< בין שתי רשומות בכל מקום בתוכנית היה נקרא בכיוון ההפוך.
תקבלו שש כניסות שמייצגות שלושה שחקנים:
- שם השחקן הראשון
- הניקוד של השחקן הראשון (מספר)
- שם השחקן השני
- הניקוד של השחקן השני (מספר)
- שם השחקן השלישי
- הניקוד של השחקן השלישי (מספר)
בקובץ הראשי, צרו טבלת דירוג, הוסיפו את כל שלוש הרשומות, קראו ל-: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 אונליין