Menu
CoddyTech

Powtórka — śledzenie wyników

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 69 z 70.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 ma playerName i score. Dodaj metodę :getInfo(), która zwraca ciąg znaków w formacie "{playerName}: {score} points". Kluczową funkcją jest tutaj metametoda __lt: a < b powinno być true, gdy wynik a jest niższy niż wynik b, 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. Samo table.sort umieszcza 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:

  1. Imię pierwszego gracza
  2. Wynik pierwszego gracza (liczba)
  3. Imię drugiego gracza
  4. Wynik drugiego gracza (liczba)
  5. Imię trzeciego gracza
  6. 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 points

Jeśli danymi wejściowymi są Zara, 500, Max, 750, Luna i 600, wynikiem powinno być:

Max: 750 points
Luna: 600 points
Zara: 500 points

Spró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

Poćwicz samodzielnie: Kompilator Lua online