Ô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.
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óplayerNamevà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 < bphải làtruekhi điểm củaathấp hơn điểm củab, 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ằngtable.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__ltcủ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:
- Tên người chơi thứ nhất
- Điểm số của người chơi thứ nhất (một số)
- Tên người chơi thứ hai
- Điểm số của người chơi thứ hai (một số)
- Tên người chơi thứ ba
- Đ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 pointsNếu đầu vào là Zara, 500, Max, 750, Luna và 600, đầu ra sẽ là:
Max: 750 points
Luna: 600 points
Zara: 500 pointsTự 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
1Khái niệm “self”
Bảng với hàm“self” tường minhCú pháp dấu hai chấmDấu chấm và dấu hai chấmÔn tập: Điểm chuyển động4Dự án: Ngân hàng số
Thiết lập dự ánPhương thức nạp tiền2Mẫu Prototype cho lớp
Khái niệm PrototypeLiên kết bằng __indexHàm khởi tạo :new()Khởi tạo thuộc tínhCác instance độc lậpÔn tập: Nhà máy ô tô5Nạp chồng toán tử trong OOP
Cộng các đối tượngTrừ các đối tượngNối các đối tượngSo sánh các đối tượng (<, >)Ôn tập: phép tính với ví tiền8Đóng gói
Quy ước đặt tênClosure để bảo mậtTruy cập qua closureBảng chỉ đọcLogic kiểm tra hợp lệTổng kết: Két an toàn11Mẫu thiết kế (cơ bản)
Hàm tạo đối tượngBảng SingletonMẫu IteratorObserver (Listener)Ôn tập: Factory Logger3Trạng thái và hành vi của đối tượng
Biến instancePhương thức getterPhương thức setterThuộc tính tính toánĐịnh dạng chuỗiKiểm tra tính bằng nhauÔn tập: điểm số học sinh6Cơ bản về kế thừa
Thiết lập kế thừaKế thừa phương thứcMở rộng hàm khởi tạoThêm phương thức cho lớp conDùng chung và riêngÔn tập: hệ phân cấp hình dạng9Kết hợp và mixin
Quan hệ có-mộtỦy quyềnMixin đơn giảnÁp dụng nhiều mixinMixin và kế thừaÔn tập: Lắp ráp robot12Thử thách cuối
Ôn tập: hệ thống kho hàngÔn tập: trình quản lý người dùngÔn tập: trình theo dõi điểm sốKiểm tra cuối về lập trình hướng đối tượngTự luyện tập: Trình biên dịch Lua online