Menu
CoddyTech

Repaso - Seguimiento de puntuación

Parte de la sección Programación orientada a objetos del Journey de Lua de Coddy. Lección 69 de 70.

challenge icon

Desafío

Fácil

¡Vamos a crear un sistema de seguimiento de puntuaciones para una clasificación de videojuegos! Crearás dos clases que trabajan juntas: una representa las puntuaciones individuales y la otra administra la clasificación con capacidades de ordenamiento 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 con el formato "{playerName}: {score} points". La característica clave aquí es el metamétodo __lt: a < b debe ser true cuando la puntuación de a sea menor que la de b, de la misma manera que < funciona con números.
  • Leaderboard.lua: Crea una clase Leaderboard que administre una colección de entradas de puntuación. Tu clasificación necesita:
    • :addEntry(entry): agrega un ScoreEntry a la lista interna
    • :sort(): ordena las entradas de la puntuación más alta a la más baja usando table.sort. Por sí solo, table.sort coloca primero el valor más pequeño, así que pásale una comparación que invierta el orden: function(a, b) return b < a end. Esa comparación sigue usando tu __lt.
    • :display(): imprime la información de cada entrada, una por línea
  • main.lua: ¡Júntalo todo! Crea una clasificación, agrega las entradas de puntuación según los datos de entrada que recibas, ordena la clasificación y muestra los resultados.

Comparar dos entradas con < llama a tu metamétodo __lt, así que table.sort puede ordenar los objetos ScoreEntry. Haz que __lt signifique «menor que» e invierte el orden en la llamada de ordenamiento: si __lt significara «mayor que», todas las comparaciones con < entre dos entradas en cualquier parte del programa se interpretarían al revés.

Recibirás seis datos de entrada 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 clasificación, agrega las tres entradas, llama a :sort() y luego llama a :display() para mostrar los resultados ordenados.

Por ejemplo, si los datos de entrada son Alice, 1500, Bob, 2300, Charlie y 1800, el resultado debería ser:

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

Si los datos de entrada son Zara, 500, Max, 750, Luna y 600, el resultado debería ser:

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

Pruébalo tú mismo

-- Archivo principal: reúne todo
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- Lee los datos de entrada de 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: Crea un nuevo Leaderboard

-- TODO: Crea objetos ScoreEntry para cada jugador

-- TODO: Añade las tres entradas al Leaderboard

-- TODO: Ordena el Leaderboard

-- TODO: Muestra los resultados ordenados

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de Lua online