Powtórka — śledzenie wyników
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 69 z 70.
Wyzwanie
ŁatwyZbudujmy system śledzenia wyników dla rankingu graczy! Utworzysz dwie współpracujące ze sobą klasy: jedną reprezentującą pojedyncze wpisy z wynikami, a drugą zarządzającą rankingiem i sortowaniem za pomocą przeciążania operatorów.
Rozmieścisz kod w trzech plikach:
ScoreEntry.lua: Utwórz klasę ScoreEntry reprezentującą wynik pojedynczego gracza. Każdy wpis maplayerNameiscore. Dodaj metodę:getInfo(), która zwraca ciąg znaków w formacie"{playerName}: {score} points". Kluczową funkcją jest tutaj metametoda__lt:a < bpowinno byćtrue, gdy wynikajest niższy niż wynikb, tak samo jak działa operator<dla liczb.Leaderboard.lua: Zbuduj klasę Leaderboard zarządzającą kolekcją wpisów z wynikami. Twój ranking powinien mieć::addEntry(entry): dodaje ScoreEntry do wewnętrznej listy:sort(): sortuje wpisy od najwyższego do najniższego wyniku za pomocątable.sort. Samotable.sortumieszcza najmniejszy element na początku, więc przekaż mu porównanie odwracające kolejność:function(a, b) return b < a end. To porównanie nadal korzysta z Twojego__lt.:display(): wyświetla informacje o każdym wpisie, po jednym w każdym wierszu
main.lua: Połącz wszystkie elementy! Utwórz Leaderboard, dodaj wpisy z wynikami na podstawie otrzymanych danych wejściowych, posortuj ranking i wyświetl wyniki.
Porównanie dwóch wpisów za pomocą < wywołuje Twoją metametodę __lt, dzięki czemu table.sort może uporządkować obiekty ScoreEntry. Niech __lt oznacza „mniejsze niż”, a kolejność odwróć w wywołaniu sortowania: gdyby __lt oznaczało „większe niż”, każde < użyte gdziekolwiek w programie do porównania dwóch wpisów działałoby odwrotnie.
Otrzymasz sześć danych wejściowych reprezentujących trzech graczy:
- Imię pierwszego gracza
- Wynik pierwszego gracza (liczba)
- Imię drugiego gracza
- Wynik drugiego gracza (liczba)
- Imię trzeciego gracza
- Wynik trzeciego gracza (liczba)
W pliku głównym utwórz ranking, dodaj wszystkie trzy wpisy, wywołaj :sort(), a następnie wywołaj :display(), aby wyświetlić posortowane wyniki.
Na przykład, jeśli danymi wejściowymi są Alice, 1500, Bob, 2300, Charlie i 1800, wynikiem powinno być:
Bob: 2300 points
Charlie: 1800 points
Alice: 1500 pointsJeśli danymi wejściowymi są Zara, 500, Max, 750, Luna i 600, wynikiem powinno być:
Max: 750 points
Luna: 600 points
Zara: 500 pointsSpróbuj swoich sił
-- Plik główny: połącz wszystko w całość
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')
-- Wczytaj dane trzech graczy
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: Utwórz nowy obiekt Leaderboard
-- TODO: Utwórz obiekty ScoreEntry dla każdego gracza
-- TODO: Dodaj wszystkie trzy wpisy do tabeli wyników
-- TODO: Posortuj tabelę wyników
-- TODO: Wyświetl posortowane wyniki
Wszystkie lekcje w sekcji Programowanie obiektowe
1Koncepcja „self”
Tabele z funkcjamiJawne „self”Składnia z dwukropkiemKropka czy dwukropekPodsumowanie — poruszający się punkt4Projekt: Bank cyfrowy
Konfiguracja projektuMetoda wpłaty7Polimorfizm i nadpisywanie
Nadpisywanie metodWywoływanie metod klasy nadrzędnejTypowanie kaczeWspólny interfejsSprawdzanie typuPodsumowanie — role pracowników10Projekt: Menedżer kształtów
Konfiguracja projektuKlasa prostokątaKlasa kołaMetoda obwoduKolekcja kształtówPole całkowiteFiltrowanie kształtów2Wzorzec prototypu klasy
Koncepcja prototypuŁączenie za pomocą __indexKonstruktor :new()Inicjalizacja atrybutówNiezależne instancjePodsumowanie – fabryka samochodów5Przeciążanie operatorów w OOP
Dodawanie obiektówOdejmowanie obiektówŁączenie obiektówPorównywanie obiektów (<, >)Powtórka — działania na portfelu8Hermetyzacja
Konwencje nazewnictwaDomknięcia dla prywatnościDostęp za pomocą domknięćTabele tylko do odczytuLogika walidacjiPodsumowanie — bezpieczny sejf11Wzorce projektowe (podstawy)
Funkcje fabrykująceTabela SingletonWzorzec iteratoraObserwator (nasłuchujący)Powtórka — fabryka loggera3Stan i zachowanie obiektu
Zmienne instancjiMetody dostępoweMetody ustawiająceWłaściwości obliczaneFormatowanie ciągów znakówSprawdzanie równościPodsumowanie – ocena ucznia6Podstawy dziedziczenia
Konfiguracja dziedziczeniaDziedziczenie metodRozszerzanie konstruktoraDodawanie metod potomnychWspólne i unikalne elementyPowtórka — hierarchia kształtów9Kompozycja i mixiny
Relacja Has-ADelegowanieProste mixinyStosowanie wielu mixinówMixiny a dziedziczeniePodsumowanie — składanie robota12Końcowe wyzwania
Powtórka — system magazynowyPowtórka — menedżer użytkownikówPowtórka — śledzenie wynikówKońcowy sprawdzian z OOPPoćwicz samodzielnie: Kompilator Lua online