Menu
CoddyTech

Ôn tập: trình theo dõi điểm số

Thuộc phần Lập trình hướng đối tượng trong hành trình Lua của Coddy. Bài học 69 trên 70.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống theo dõi điểm số cho bảng xếp hạng trò chơi! Bạn sẽ tạo hai lớp phối hợp với nhau: một lớp đại diện cho từng mục điểm số, lớp còn lại quản lý bảng xếp hạng và có khả năng sắp xếp nhờ nạp chồng toán tử.

Bạn sẽ sắp xếp code thành ba tệp:

  • ScoreEntry.lua: Tạo lớp ScoreEntry đại diện cho điểm số của một người chơi. Mỗi mục có playerName và score. Thêm phương thức :getInfo() trả về một chuỗi theo định dạng "{playerName}: {score} points". Tính năng then chốt ở đây là phương thức metamethod __lt: a < b phải là true khi điểm của a thấp hơn điểm của b, giống như cách < hoạt động với các số.
  • Leaderboard.lua: Xây dựng lớp Leaderboard quản lý một tập hợp các mục điểm số. Bảng xếp hạng cần có:
    • :addEntry(entry): thêm một ScoreEntry vào danh sách nội bộ
    • :sort(): sắp xếp các mục theo thứ tự điểm từ cao xuống thấp bằng table.sort. Mặc định, table.sort đưa phần tử nhỏ nhất lên đầu, vì vậy hãy truyền vào một phép so sánh đảo ngược thứ tự: function(a, b) return b < a end. Phép so sánh đó vẫn sử dụng __lt của bạn.
    • :display(): in thông tin của từng mục, mỗi mục trên một dòng
  • main.lua: Kết hợp tất cả lại với nhau! Tạo một Leaderboard, thêm các mục điểm số dựa trên đầu vào bạn nhận được, sắp xếp bảng xếp hạng rồi hiển thị kết quả.

So sánh hai mục bằng < sẽ gọi phương thức metamethod __lt của bạn, nhờ đó table.sort có thể sắp xếp các đối tượng ScoreEntry. Hãy giữ cho __lt mang nghĩa "nhỏ hơn" và đảo ngược thứ tự trong lời gọi sort: nếu __lt mang nghĩa "lớn hơn", mọi phép so sánh < giữa hai mục ở bất cứ đâu trong chương trình đều sẽ có nghĩa ngược lại.

Bạn sẽ nhận sáu đầu vào đại diện cho ba người chơi:

  1. Tên người chơi thứ nhất
  2. Điểm số của người chơi thứ nhất (một số)
  3. Tên người chơi thứ hai
  4. Điểm số của người chơi thứ hai (một số)
  5. Tên người chơi thứ ba
  6. Điểm số của người chơi thứ ba (một số)

Trong tệp chính, hãy tạo một bảng xếp hạng, thêm cả ba mục, gọi :sort(), sau đó gọi :display() để hiển thị kết quả đã sắp xếp.

Ví dụ, nếu đầu vào là Alice, 1500, Bob, 2300, Charlie và 1800, đầu ra sẽ là:

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

Nếu đầu vào là Zara, 500, Max, 750, Luna và 600, đầu ra sẽ là:

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

Tự làm thử

-- Tệp chính: Kết hợp mọi thứ lại
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- Đọc đầu vào của ba người chơi
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: Tạo một Leaderboard mới

-- TODO: Tạo đối tượng ScoreEntry cho từng người chơi

-- TODO: Thêm cả ba mục vào bảng xếp hạng

-- TODO: Sắp xếp bảng xếp hạng

-- TODO: Hiển thị kết quả đã sắp xếp

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Lua online