Menu
Coddy logo textTech

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 umożliwiającą sortowanie dzięki przeciążaniu operatorów.

Podzielisz swój kod na trzy pliki:

  • 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 tu implementacja metody metatabeli __lt. Pamiętaj jednak, że aby uzyskać kolejność malejącą (najwyższe wyniki na początku), porównanie powinno zwracać true, gdy wynik pierwszego wpisu jest większy niż wynik drugiego.
  • Leaderboard.lua: Utwórz klasę Leaderboard, która zarządza kolekcją wpisów z wynikami. Twój ranking powinien obsługiwać:
    • :addEntry(entry): dodaje ScoreEntry do wewnętrznej listy
    • :sort(): sortuje wpisy od najwyższego do najniższego wyniku za pomocą table.sort
    • :display(): wyświetla informacje o każdym wpisie, po jednym w wierszu
  • main.lua: Połącz wszystko w całość! Utwórz ranking, dodaj wpisy z wynikami na podstawie otrzymanych danych wejściowych, posortuj ranking i wyświetl wyniki.

Elegancką cechą tego projektu jest to, że table.sort automatycznie korzysta z metody metatabeli __lt, aby porównywać obiekty ScoreEntry. Określ, jak wpisy mają być porównywane ze sobą, a wbudowane sortowanie w Lua będzie działać z Twoimi niestandardowymi obiektami!

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ł

-- Główny plik: 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 rankingu

-- TODO: Posortuj ranking

-- TODO: Wyświetl posortowane wyniki

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online