Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

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

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

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

  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: Создать новую таблицу лидеров

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

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

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

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

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

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