Menu
CoddyTech

回顾:库存系统

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

challenge icon

挑战

简单

一起来为角色扮演游戏构建一个完整的物品栏管理系统吧!你将创建一个物品类型的层级结构,以及一个用于管理物品的管理类,在一个完整的项目中结合继承、多态和组合。

你将把代码组织在 5 个文件中:

  • Item.lua:所有物品的基类。每个物品都有一个 name 和一个 value(以金币计)。添加一个 :getInfo() 方法,返回格式为 "{name}: {value} gold" 的字符串。
  • Weapon.lua:继承自 Item 的专用物品。武器还有一个额外的 damage 属性。重写 :getInfo(),使其返回 "{name}: {value} gold, {damage} damage"。
  • Potion.lua:另一种继承自 Item 的专用物品。药水有一个 healAmount 属性。重写 :getInfo(),使其返回 "{name}: {value} gold, heals {healAmount} HP"。
  • Inventory.lua:用于存放一组物品的管理类。添加一个 :addItem(item) 方法来添加任意类型的物品,一个 :listItems() 方法来逐行打印每个物品的 :getInfo(),以及一个 :getTotalValue() 方法来返回所有物品值的总和。
  • main.lua:把所有内容整合起来!创建一个物品栏,并根据你收到的输入向其中添加物品。然后列出所有物品,并在最后一行打印物品栏的总价值。

这种设计的妙处在于多态的实际应用。你的 Inventory 不需要知道其中存放的是 Weapon 还是 Potion。它只需调用 :getInfo(),每个物品就会根据自己的类型做出相应的响应。

你会收到 6 个输入,用于描述要添加的两个物品:

  1. 第一个物品的类型("weapon" 或 "potion")
  2. 第一个物品的名称
  3. 第一个物品的值(一个数字)
  4. 第二个物品的类型("weapon" 或 "potion")
  5. 第二个物品的名称
  6. 第二个物品的值(一个数字)

武器的伤害固定为 25。药水的治疗量固定为 50。

添加两个物品后,调用 :listItems() 打印每个物品的信息,然后在最后一行打印 Total: {value} gold。

例如,如果输入是 weapon、Iron Sword、150、potion、Health Elixir 和 75,输出应为:

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

如果输入是 potion、Mana Potion、50、weapon、Steel Axe 和 200,输出应为:

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

亲手试试

-- main.lua:把所有部分组合起来

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

-- 读取第一个物品的输入
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())

-- 读取第二个物品的输入
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())

-- 固定值:武器造成 25 点伤害,药水恢复 50 HP

-- TODO:创建一个物品栏

-- TODO:根据 type1("weapon" 或 "potion")创建第一个物品
-- 并将它加入物品栏

-- TODO:根据 type2("weapon" 或 "potion")创建第二个物品
-- 并将它加入物品栏

-- TODO:调用 listItems() 打印每个物品的信息

-- TODO:使用 getTotalValue() 打印 "Total: {value} gold"

面向对象编程中的所有课

自己练习: Lua 在线编译器