Menu
CoddyTech

Ripasso - Tracciamento punteggi

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 69 di 70.

challenge icon

Sfida

Facile

Creiamo un sistema per tenere traccia dei punteggi in una classifica di gioco! Creerai due classi che collaborano: una rappresenta le singole voci dei punteggi e l’altra gestisce la classifica con funzionalità di ordinamento basate sull’overloading degli operatori.

Organizzerai il codice in tre file:

  • ScoreEntry.lua: crea una classe ScoreEntry che rappresenta il punteggio di un singolo giocatore. Ogni voce ha un playerName e un score. Includi un metodo :getInfo() che restituisce una stringa nel formato "{playerName}: {score} points". La caratteristica principale è il metametodo __lt: a < b dovrebbe essere true quando il punteggio di a è inferiore a quello di b, proprio come funziona < con i numeri.
  • Leaderboard.lua: crea una classe Leaderboard che gestisce una raccolta di voci dei punteggi. La classifica deve avere:
    • :addEntry(entry): aggiunge una voce ScoreEntry all’elenco interno
    • :sort(): ordina le voci dal punteggio più alto a quello più basso usando table.sort. Da solo, table.sort mette prima l’elemento più piccolo, quindi passagli un confronto che inverte l’ordine: function(a, b) return b < a end. Questo confronto usa comunque il tuo __lt.
    • :display(): stampa le informazioni di ogni voce, una per riga
  • main.lua: unisci il tutto! Crea una classifica, aggiungi le voci dei punteggi in base agli input ricevuti, ordina la classifica e mostra i risultati.

Confrontare due voci con < richiama il metametodo __lt, così table.sort può ordinare gli oggetti ScoreEntry. Mantieni il significato di “minore di” per __lt e inverti l’ordine nella chiamata di ordinamento: se __lt significasse “maggiore di”, ogni < applicato a due voci in qualsiasi punto del programma avrebbe il significato invertito.

Riceverai sei input che rappresentano tre giocatori:

  1. Nome del primo giocatore
  2. Punteggio del primo giocatore (un numero)
  3. Nome del secondo giocatore
  4. Punteggio del secondo giocatore (un numero)
  5. Nome del terzo giocatore
  6. Punteggio del terzo giocatore (un numero)

Nel file principale, crea una classifica, aggiungi tutte e tre le voci, chiama :sort(), quindi chiama :display() per mostrare i risultati ordinati.

Ad esempio, se gli input sono Alice, 1500, Bob, 2300, Charlie e 1800, l’output dovrebbe essere:

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

Se gli input sono Zara, 500, Max, 750, Luna e 600, l’output dovrebbe essere:

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

Provalo tu

-- File principale: metti tutto insieme
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- Leggi gli input dei tre giocatori
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: crea una nuova Leaderboard

-- TODO: crea oggetti ScoreEntry per ogni giocatore

-- TODO: aggiungi tutte e tre le voci alla leaderboard

-- TODO: ordina la leaderboard

-- TODO: mostra i risultati ordinati

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Lua online