Menu
CoddyTech

回顾:机器人组装

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

challenge icon

挑战

简单

让我们用单独的组件组装一个 Robot!你不会使用继承,而是通过组合单独的 Arm、Leg 和 Head 对象来构建机器人,每个对象都有自己的专属行为。机器人会通过委托来协调这些组件。

你需要将代码分成 5 个文件:

  • Arm.lua:创建一个 Arm 类,并添加构造函数 :new(side),用于存储手臂所在的一侧(例如,"left" 或 "right")。添加一个 :raise() 方法,输出 {side} arm raised,再添加一个 :lower() 方法,输出 {side} arm lowered。
  • Leg.lua:创建一个 Leg 类,并添加构造函数 :new(side),用于存储腿所在的一侧。添加一个 :step() 方法,输出 {side} leg steps forward。
  • Head.lua:创建一个 Head 类,并添加构造函数 :new()。添加一个 :nod() 方法,输出 Head nods,再添加一个 :shake() 方法,输出 Head shakes。
  • Robot.lua:创建一个 Robot 类,其构造函数 :new(name) 用于存储名称,并在内部创建所有组件:左臂、右臂、左腿、右腿和头部。Robot 应包含以下方法,这些方法会委托相应组件执行操作:
    • :greet():输出 {name} says hello!,然后抬起右臂,再放下右臂
    • :walk():先让左腿迈步,再让右腿迈步
    • :respond(answer):如果 answer 是 "yes",头部就点头;如果是 "no",头部就摇头
  • main.lua:读取机器人的名称和一个是/否回应作为输入。创建一个 Robot,让它打招呼、行走,然后根据输入作出回应。

你会收到两个输入:

  1. 机器人的名称(一个字符串)
  2. 一个回应:yes 或 no

输出应显示机器人如何协调各个组件:

{name} says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head nods

如果回应是 no,输出如下:

{name} says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head shakes

例如,如果输入是 Robo 和 yes,输出应为:

Robo says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head nods

注意,Robot 并不知道手臂是如何抬起的,也不知道腿是如何迈步的。它只需告诉每个组件要做什么。每个组件都是独立且可复用的,而机器人则负责协调,将它们组合在一起!

亲手试试

-- main.lua:Robot 组合挑战的入口

local Robot = require('Robot')

-- 读取输入
local name = io.read()
local answer = io.read()

-- TODO:用给定的名字创建一个 Robot
-- TODO:让机器人打招呼
-- TODO:让机器人行走
-- TODO:让机器人根据输入的答案作出回应

面向对象编程中的所有课

自己练习: Lua 在线编译器