Menu
CoddyTech

Wiederholung - Score-Tracker

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 69 von 70.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Punktesystem für eine Gaming-B Bestenliste! Du erstellst zwei Klassen, die zusammenarbeiten: eine, die einzelne Punkteeinträge darstellt, und eine weitere, die die Bestenliste mit Sortierfunktionen verwaltet, die durch Operatorüberladung ermöglicht werden.

Du verteilst deinen Code auf drei Dateien:

  • ScoreEntry.lua: Erstelle eine ScoreEntry-Klasse, die die Punktzahl eines einzelnen Spielers darstellt. Jeder Eintrag hat einen playerName und einen score. Füge eine :getInfo()-Methode hinzu, die einen String im Format "{playerName}: {score} points" zurückgibt. Das wichtigste Merkmal ist hier die __lt-Metamethode: a < b sollte true sein, wenn die Punktzahl von a niedriger ist als die von b, genauso wie < bei Zahlen funktioniert.
  • Leaderboard.lua: Erstelle eine Leaderboard-Klasse, die eine Sammlung von Punkteeinträgen verwaltet. Deine Bestenliste benötigt:
    • :addEntry(entry): fügt der internen Liste einen ScoreEntry hinzu
    • :sort(): sortiert die Einträge mit table.sort von der höchsten zur niedrigsten Punktzahl. Für sich genommen ordnet table.sort die kleinsten Werte zuerst an. Übergib ihm daher einen Vergleich, der die Reihenfolge umkehrt: function(a, b) return b < a end. Dieser Vergleich verwendet weiterhin dein __lt.
    • :display(): gibt die Informationen zu jedem Eintrag aus, einen pro Zeile
  • main.lua: Füge alles zusammen! Erstelle eine Leaderboard, füge anhand der Eingaben, die du erhältst, Punkteeinträge hinzu, sortiere die Bestenliste und zeige die Ergebnisse an.

Der Vergleich zweier Einträge mit < ruft deine __lt-Metamethode auf, sodass table.sort ScoreEntry-Objekte ordnen kann. Lass __lt „kleiner als“ bedeuten und kehre die Reihenfolge im Sortieraufruf um: Wenn __lt „größer als“ bedeuten würde, wäre jeder Vergleich mit < zwischen zwei Einträgen im gesamten Programm verkehrt herum.

Du erhältst sechs Eingaben, die drei Spieler darstellen:

  1. Name des ersten Spielers
  2. Punktzahl des ersten Spielers (eine Zahl)
  3. Name des zweiten Spielers
  4. Punktzahl des zweiten Spielers (eine Zahl)
  5. Name des dritten Spielers
  6. Punktzahl des dritten Spielers (eine Zahl)

Erstelle in deiner Hauptdatei eine Bestenliste, füge alle drei Einträge hinzu, rufe :sort() und anschließend :display() auf, um die sortierten Ergebnisse anzuzeigen.

Wenn die Eingaben beispielsweise Alice, 1500, Bob, 2300, Charlie und 1800 lauten, sollte die Ausgabe folgendermaßen aussehen:

Bob: 2300 points
Charlie: 1800 points
Alice: 1500 points

Wenn die Eingaben Zara, 500, Max, 750, Luna und 600 lauten, sollte die Ausgabe folgendermaßen aussehen:

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

Probier es selbst

-- Hauptdatei: Alles zusammenführen
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- Eingaben für drei Spieler einlesen
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: Ein neues Leaderboard erstellen

-- TODO: ScoreEntry-Objekte für jeden Spieler erstellen

-- TODO: Alle drei Einträge zum Leaderboard hinzufügen

-- TODO: Das Leaderboard sortieren

-- TODO: Die sortierten Ergebnisse anzeigen

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler