Menu
CoddyTech

Повторение: Трекер счета

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 69 из 70.

challenge icon

Задание

Легко

Давай создадим систему отслеживания очков для игровой таблицы лидеров! Ты создашь два взаимодействующих класса: один будет представлять отдельные записи с очками, а другой — управлять таблицей лидеров и сортировать её благодаря перегрузке операторов.

Ты разместишь код в трёх файлах:

  • ScoreEntry.lua: создай класс ScoreEntry, представляющий очки одного игрока. У каждой записи есть playerName и score. Добавь метод :getInfo(), который возвращает строку в формате "{playerName}: {score} points". Главное здесь — метаметод __lt: a < b должно быть true, когда результат игрока a меньше результата игрока b, так же как работает < для чисел.
  • Leaderboard.lua: создай класс Leaderboard, который управляет набором записей с очками. Для таблицы лидеров понадобятся:
    • :addEntry(entry): добавляет ScoreEntry во внутренний список
    • :sort(): сортирует записи от наибольшего количества очков к наименьшему с помощью table.sort. Сам по себе table.sort ставит на первое место наименьшее значение, поэтому передай ему сравнение, которое меняет порядок на обратный: function(a, b) return b < a end. В этом сравнении по-прежнему используется твой __lt.
    • :display(): выводит информацию о каждой записи, по одной на строку
  • main.lua: объедини всё вместе! Создай Leaderboard, добавь записи с очками на основе полученных данных, отсортируй таблицу лидеров и выведи результаты.

Сравнение двух записей с помощью < вызывает метаметод __lt, поэтому table.sort может упорядочивать объекты ScoreEntry. Пусть __lt означает «меньше», а порядок меняется на обратный при вызове сортировки: если бы __lt означал «больше», любое использование < для двух записей в программе приводило бы к обратному результату.

Ты получишь шесть входных данных для трёх игроков:

  1. Имя первого игрока
  2. Количество очков первого игрока (число)
  3. Имя второго игрока
  4. Количество очков второго игрока (число)
  5. Имя третьего игрока
  6. Количество очков третьего игрока (число)

В главном файле создай таблицу лидеров, добавь все три записи, вызови :sort(), а затем вызови :display(), чтобы показать отсортированные результаты.

Например, если входные данные — Alice, 1500, Bob, 2300, Charlie и 1800, вывод должен быть таким:

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

Если входные данные — Zara, 500, Max, 750, Luna и 600, вывод должен быть таким:

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

Попробуйте сами

-- Основной файл: соберите всё вместе
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- Считайте входные данные для трёх игроков
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: Создайте новый Leaderboard

-- TODO: Создайте объекты ScoreEntry для каждого игрока

-- TODO: Добавьте все три записи в таблицу лидеров

-- TODO: Отсортируйте таблицу лидеров

-- TODO: Выведите отсортированные результаты

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua