回顾:库存系统
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 67 课,共 70 课。
挑战
简单一起来为角色扮演游戏构建一个完整的物品栏管理系统吧!你将创建一个物品类型的层级结构,以及一个用于管理物品的管理类,在一个完整的项目中结合继承、多态和组合。
你将把代码组织在 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 个输入,用于描述要添加的两个物品:
- 第一个物品的类型(
"weapon"或"potion") - 第一个物品的名称
- 第一个物品的值(一个数字)
- 第二个物品的类型(
"weapon"或"potion") - 第二个物品的名称
- 第二个物品的值(一个数字)
武器的伤害固定为 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 在线编译器