Menu
CoddyTech

Ôn tập: hệ thống kho hàng

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 67 trên 70.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống quản lý kho đồ hoàn chỉnh cho trò chơi nhập vai! Bạn sẽ tạo một hệ thống phân cấp các loại vật phẩm cùng một lớp quản lý để sắp xếp chúng, kết hợp kế thừa (inheritance), đa hình (polymorphism) và kết hợp (composition) trong một dự án thống nhất.

Bạn sẽ tổ chức code trong năm tệp:

  • Item.lua: Lớp cơ sở cho mọi vật phẩm. Mỗi vật phẩm có name và value (tính bằng đồng vàng). Thêm phương thức :getInfo() trả về một chuỗi theo định dạng "{name}: {value} gold".
  • Weapon.lua: Một loại vật phẩm chuyên biệt kế thừa từ Item. Vũ khí có thêm thuộc tính damage. Ghi đè :getInfo() để trả về "{name}: {value} gold, {damage} damage".
  • Potion.lua: Một loại vật phẩm chuyên biệt khác kế thừa từ Item. Bình thuốc có thuộc tính healAmount. Ghi đè :getInfo() để trả về "{name}: {value} gold, heals {healAmount} HP".
  • Inventory.lua: Một lớp quản lý lưu trữ tập hợp các vật phẩm. Thêm phương thức :addItem(item) để thêm mọi loại vật phẩm, phương thức :listItems() để in ra :getInfo() của từng vật phẩm (mỗi vật phẩm trên một dòng), và phương thức :getTotalValue() trả về tổng giá trị của tất cả vật phẩm.
  • main.lua: Kết hợp mọi thứ! Tạo một kho đồ và thêm vào đó các vật phẩm dựa trên đầu vào bạn nhận được. Sau đó, liệt kê tất cả vật phẩm và in tổng giá trị kho đồ ở dòng cuối cùng.

Điểm hay của thiết kế này là đa hình được áp dụng thực tế. Inventory không cần biết nó đang lưu Weapon hay Potion. Nó chỉ gọi :getInfo(), và mỗi vật phẩm sẽ phản hồi phù hợp với loại của nó.

Bạn sẽ nhận sáu đầu vào mô tả hai vật phẩm cần thêm:

  1. Loại của vật phẩm thứ nhất ("weapon" hoặc "potion")
  2. Tên vật phẩm thứ nhất
  3. Giá trị vật phẩm thứ nhất (một số)
  4. Loại của vật phẩm thứ hai ("weapon" hoặc "potion")
  5. Tên vật phẩm thứ hai
  6. Giá trị vật phẩm thứ hai (một số)

Với vũ khí, hãy dùng sát thương cố định là 25. Với bình thuốc, hãy dùng lượng hồi máu cố định là 50.

Sau khi thêm cả hai vật phẩm, hãy gọi :listItems() để in thông tin của từng vật phẩm, rồi in Total: {value} gold ở dòng cuối cùng.

Ví dụ, nếu đầu vào là weapon, Iron Sword, 150, potion, Health Elixir và 75, đầu ra sẽ là:

Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 gold

Nếu đầu vào là potion, Mana Potion, 50, weapon, Steel Axe và 200, đầu ra sẽ là:

Mana Potion: 50 gold, heals 50 HP
Steel Axe: 200 gold, 25 damage
Total: 250 gold

Tự làm thử

-- main.lua: Kết hợp tất cả lại

local Weapon = require('Weapon')
local Potion = require('Potion')
local Inventory = require('Inventory')

-- Đọc đầu vào cho vật phẩm thứ nhất
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())

-- Đọc đầu vào cho vật phẩm thứ hai
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())

-- Giá trị cố định: vũ khí gây 25 sát thương, bình thuốc hồi 50 HP

-- TODO: Tạo một kho đồ

-- TODO: Tạo vật phẩm thứ nhất dựa trên type1 ("weapon" hoặc "potion")
-- và thêm vào kho đồ

-- TODO: Tạo vật phẩm thứ hai dựa trên type2 ("weapon" hoặc "potion")
-- và thêm vào kho đồ

-- TODO: Gọi listItems() để in ra thông tin của từng vật phẩm

-- TODO: In ra "Total: {value} gold" bằng getTotalValue()

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