Menu
Coddy logo textTech

Revisão - Rastreador de Pontuação

Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 69 de 70.

challenge icon

Desafio

Fácil

Vamos construir um sistema de rastreamento de pontuação para um placar de jogos! Você criará duas classes que trabalham juntas — uma representando entradas de pontuação individuais e outra gerenciando o placar com recursos de ordenação alimentados por 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 possui um playerName e um score. Inclua um método :getInfo() que retorna uma string no formato "{playerName}: {score} points". O recurso principal aqui é implementar o metamétodo __lt — mas lembre-se, para ordem decrescente (maiores pontuações primeiro), sua comparação deve retornar true quando a pontuação da primeira entrada for maior que a da segunda.
  • Leaderboard.lua: Construa uma classe Leaderboard que gerencia uma coleção de entradas de pontuação. Seu placar precisa de:
    • :addEntry(entry) — adiciona um ScoreEntry à lista interna
    • :sort() — ordena as entradas da maior para a menor pontuação usando table.sort
    • :display() — imprime 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 que você receber, ordene o placar e exiba os resultados.

A parte elegante deste design é que o table.sort usa automaticamente seu metamétodo __lt para comparar objetos ScoreEntry. Ao definir como as entradas se comparam entre si, a ordenação integrada do Lua simplesmente funciona com seus objetos personalizados!

Você receberá seis entradas representando 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 seu arquivo principal, crie um placar, adicione todas 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úne tudo
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- Lê as entradas para 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: Criar um novo Leaderboard

-- TODO: Criar objetos ScoreEntry para cada jogador

-- TODO: Adicionar todas as três entradas ao leaderboard

-- TODO: Ordenar o leaderboard

-- TODO: Exibir os resultados ordenados

Todas as lições de Object Oriented Programming