Menu
CoddyTech

回顾:分数跟踪器

本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 69 课,共 70 课。

challenge icon

挑战

简单

让我们来构建一个游戏排行榜积分追踪系统吧!你将创建两个协同工作的类:一个表示单条积分记录,另一个负责管理排行榜,并通过运算符重载实现排序功能。

你需要将代码分到三个文件中:

  • ScoreEntry.lua:创建一个表示单个玩家积分的 ScoreEntry 类。每条记录都有一个 playerName 和一个 score。添加一个 :getInfo() 方法,返回格式为 "{playerName}: {score} points" 的字符串。这里的关键是 __lt 元方法:当 a 的积分低于 b 时,a < b 应为 true,其行为与数字之间的 < 相同。
  • 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 表示“大于”,那么程序中任何地方的两条记录之间使用 < 都会产生相反的含义。

你会收到 6 个输入,分别表示 3 位玩家的信息:

  1. 第一位玩家的名字
  2. 第一位玩家的积分(数字)
  3. 第二位玩家的名字
  4. 第二位玩家的积分(数字)
  5. 第三位玩家的名字
  6. 第三位玩家的积分(数字)

在主文件中,创建一个排行榜,添加全部 3 条记录,调用 :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 在线编译器