Menu
Coddy logo textTech

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

Часть раздела Object Oriented Programming путешествия по 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: Отобразить отсортированные результаты

Все уроки раздела Object Oriented Programming