Menu
Coddy logo textTech

Repaso - Seguimiento de puntuación

Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 69 de 70.

challenge icon

Desafío

Fácil

¡Vamos a construir un sistema de seguimiento de puntuaciones para una tabla de clasificación de juegos! Crearás dos clases que trabajan juntas: una que representa entradas de puntuación individuales y otra que gestiona la tabla de clasificación con capacidades de ordenación potenciadas por la sobrecarga de operadores.

Organizarás tu código en tres archivos:

  • ScoreEntry.lua: Crea una clase ScoreEntry que represente la puntuación de un solo jugador. Cada entrada tiene un playerName y un score. Incluye un método :getInfo() que devuelva una cadena en el formato "{playerName}: {score} points". La característica clave aquí es implementar el metamétodo __lt; pero recuerda, para el orden descendente (puntuaciones más altas primero), tu comparación debe devolver true cuando la puntuación de la primera entrada sea mayor que la de la segunda.
  • Leaderboard.lua: Construye una clase Leaderboard que gestione una colección de entradas de puntuación. Tu tabla de clasificación necesita:
    • :addEntry(entry) — añade un ScoreEntry a la lista interna
    • :sort() — ordena las entradas de mayor a menor puntuación usando table.sort
    • :display() — imprime la información de cada entrada, una por línea
  • main.lua: ¡Une todo! Crea un Leaderboard, añade entradas de puntuación basadas en las entradas que recibas, ordena la tabla de clasificación y muestra los resultados.

La parte elegante de este diseño es que table.sort utiliza automáticamente tu metamétodo __lt para comparar objetos ScoreEntry. ¡Al definir cómo se comparan las entradas entre sí, la ordenación integrada de Lua simplemente funciona con tus objetos personalizados!

Recibirás seis entradas que representan a tres jugadores:

  1. Nombre del primer jugador
  2. Puntuación del primer jugador (un número)
  3. Nombre del segundo jugador
  4. Puntuación del segundo jugador (un número)
  5. Nombre del tercer jugador
  6. Puntuación del tercer jugador (un número)

En tu archivo principal, crea una tabla de clasificación, añade las tres entradas, llama a :sort() y luego llama a :display() para mostrar los resultados ordenados.

Por ejemplo, si las entradas son Alice, 1500, Bob, 2300, Charlie y 1800, la salida debería ser:

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

Si las entradas son Zara, 500, Max, 750, Luna y 600, la salida debería ser:

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

Pruébalo tú mismo

-- Archivo principal: Reunir todo
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- Leer las entradas para tres jugadores
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: Crear una nueva Leaderboard

-- TODO: Crear objetos ScoreEntry para cada jugador

-- TODO: Añadir las tres entradas al leaderboard

-- TODO: Ordenar el leaderboard

-- TODO: Mostrar los resultados ordenados

Todas las lecciones de Object Oriented Programming