Menu
CoddyTech

Revisão - Rastreador de Pontuação

Parte da seção Programação orientada a objetos do Journey de Lua da Coddy. Lição 69 de 70.

challenge icon

Desafio

Fácil

Vamos criar um sistema para acompanhar pontuações em um placar de classificação de jogos! Você criará duas classes que trabalham juntas: uma que representa entradas de pontuação individuais e outra que gerencia o placar de classificação com recursos de ordenação possibilitados pela sobrecarga de operadores.

Você organizará seu código em três arquivos:

  • ScoreEntry.lua: Crie uma classe ScoreEntry que representa a pontuação de um único jogador. Cada entrada tem um playerName e um score. Inclua um método :getInfo() que retorna uma string no formato "{playerName}: {score} points". O principal recurso aqui é o metamétodo __lt: a < b deve ser true quando a pontuação de a for menor que a de b, da mesma forma que < funciona com números.
  • Leaderboard.lua: Crie uma classe Leaderboard que gerencia uma coleção de entradas de pontuação. Seu placar de classificação precisa de:
    • :addEntry(entry): adiciona uma ScoreEntry à lista interna
    • :sort(): ordena as entradas da maior para a menor pontuação usando table.sort. Por si só, table.sort coloca o menor elemento primeiro, então passe a ela uma comparação que inverta a ordem: function(a, b) return b < a end. Essa comparação ainda usa seu __lt.
    • :display(): exibe as informações de cada entrada, uma por linha
  • main.lua: Junte tudo! Crie um Leaderboard, adicione entradas de pontuação com base nas entradas recebidas, ordene o placar de classificação e exiba os resultados.

Comparar duas entradas com < chama seu metamétodo __lt, permitindo que table.sort ordene objetos ScoreEntry. Mantenha o significado de __lt como "menor que" e inverta a ordem na chamada de ordenação: se __lt significasse "maior que", toda ocorrência de < entre duas entradas em qualquer parte do programa ficaria ao contrário.

Você receberá seis entradas que representam três jogadores:

  1. Nome do primeiro jogador
  2. Pontuação do primeiro jogador (um número)
  3. Nome do segundo jogador
  4. Pontuação do segundo jogador (um número)
  5. Nome do terceiro jogador
  6. Pontuação do terceiro jogador (um número)

No arquivo principal, crie um placar de classificação, adicione as três entradas, chame :sort() e, em seguida, chame :display() para mostrar os resultados ordenados.

Por exemplo, se as entradas forem Alice, 1500, Bob, 2300, Charlie e 1800, a saída deve ser:

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

Se as entradas forem Zara, 500, Max, 750, Luna e 600, a saída deve ser:

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

Experimente você mesmo

-- Arquivo principal: reúna tudo
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- Leia as entradas dos três jogadores
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: Crie um novo Leaderboard

-- TODO: Crie objetos ScoreEntry para cada jogador

-- TODO: Adicione as três entradas ao Leaderboard

-- TODO: Ordene o Leaderboard

-- TODO: Exiba os resultados ordenados

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de Lua online