Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

Давайте создадим систему отслеживания результатов для игрового leaderboard! Вы создадите два класса, которые работают вместе: один представляет отдельные записи о результатах, а другой управляет leaderboard с возможностями сортировки, реализованными с помощью перегрузки операторов.

Вы организуете код в трёх файлах:

  • ScoreEntry.lua: Создайте класс ScoreEntry, представляющий результат одного игрока. Каждая запись содержит playerName и score. Включите method :getInfo(), который возвращает строку в формате "{playerName}: {score} points". Ключевая особенность здесь — реализация metamethod __lt, но помните: для descending order (сначала highest результаты) ваше сравнение должно возвращать true, когда результат первой записи greater, чем результат второй.
  • Leaderboard.lua: Создайте класс Leaderboard, управляющий набором записей о результатах. Ваш leaderboard должен включать:
    • :addEntry(entry): добавляет ScoreEntry во внутренний список
    • :sort(): сортирует entries от highest к lowest результату с помощью table.sort
    • :display(): выводит info для каждой записи, по одной на line
  • main.lua: Объедините всё вместе! Создайте Leaderboard, добавьте записи о результатах на основе полученных inputs, отсортируйте leaderboard и отобразите результаты.

Элегантность этого дизайна заключается в том, что table.sort automatically использует ваш __lt metamethod для сравнения объектов ScoreEntry. Определив, как записи сравниваются друг с другом, встроенная сортировка Lua просто работает с вашими пользовательскими объектами!

Вы получите шесть inputs, представляющих трёх игроков:

  1. Имя first игрока
  2. Результат first игрока (число)
  3. Имя second игрока
  4. Результат second игрока (число)
  5. Имя third игрока
  6. Результат third игрока (число)

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

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

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

Если inputs — это 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: Добавить все три записи в leaderboard

-- TODO: Отсортировать leaderboard

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

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

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