控制结构可以有多个条件。关键字 else 和 elseif 可以创建额外的场景,以确定在多种条件下应该发生什么。语法如下:
显示 elseif 和 else 的语法if isGreen thenprint("前进")elseif isYellow thenprint("慢")elseif isPedestrians thenprint("等待")elseprint("停止")end
在此项目中,else 和 elseif 被用来编码一个跑酷课程,运动员根据他们的完成时间获得奖励。

编写多个条件的代码
对于这个项目,你可以为每个奖牌编写一个独特的 if 语句来奖励玩家,但这需要花费很多时间。以以下虚构代码为例:
所有 if 语句if finishTime < 5 then-- 获得金牌endif finishTime >= 5 and <= 10 then-- 获得银牌endif finishTime > 10 and <= 15 then-- 获得铜牌end
一种更可读且高效的编码方式是使用一个 if 语句,并使用关键字 elseif 提供可替代条件,以测试之前的条件是否不为真。
使用 elseif 和 elseif finishTime < 5 then-- 获得金牌elseif finishTime >= 5 and <= 10 then-- 获得银牌elseif finishTime > 10 and <= 15 then-- 获得铜牌end
当 if/then 语句运行时,它会从顶部开始,只运行它找到的第一个为真的条件的代码。
设置比赛赛道
首先放置赛道的起点和终点,然后创建一个脚本来计时玩家并颁发不同的奖牌。
创建一个名为 FinishLine 的固定部件。为了加快测试速度,将起点和终点放得靠近一些。完成脚本后可以移动终点。

结束部分 
整个课程 在 FinishLine 中插入一个名为 RaceManager 的脚本。然后,添加一个变量来存储自比赛开始以来经过的秒数,添加第二个变量来引用 FinishLine。
local finishLine = script.Parentlocal timePassed = 0创建一个名为 finish() 的函数。
local timePassed = 0local finishLine = script.Parentlocal function finish()end自己动手:
- 编写一个名为 partTouched() 的函数,在玩家触碰时调用 finish()。
- 将结束线部件连接到 partTouched()。
- 将你的代码与下面的示例进行比较。
local function finish()print("触碰了终点线")endlocal function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenfinish()endendfinishLine.Touched:Connect(partTouched)进行游戏测试,检查在触碰终点线时是否调用 finish()。
防止 finish() 重复调用
目前,每当玩家触碰终点线时,finish() 会被持续调用,只要玩家触碰这个部件。
使用一个布尔值,一个存储真或假的变量,确保 finish() 只被调用一次。
创建一个名为 raceActive 的新变量并将其设置为 true。
local timePassed = 0local finishLine = script.Parentlocal raceActive = true-- 每当玩家触碰终点线部件时运行local function finish()在 if 语句中添加第二个条件,以检查 raceActive 是否为真,然后再调用 finish()。
local function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and raceActive == true thenfinish()endend为了防止再次调用 finish(),将 raceActive 设置为 false。
local function finish()print("触碰了终点线")raceActive = falseend进行游戏测试,检查你的测试打印语句是否只显示一次。
跟踪时间
和 if 语句一样,while 循环也可以使用条件来决定是否运行。为了计时玩家,使用一个 while true do 循环来创建一个定时器,它将仅在 raceActive 布尔值为真的时候运行。
在脚本底部,输入 while raceActive == true do。按回车自动完成并添加 end。
finishLine.Touched:Connect(partTouched)while raceActive == true doend为了计时玩家,在循环中每秒将 timePassed 变量加 1。包括一个打印语句来测试你的工作。
finishLine.Touched:Connect(partTouched)while raceActive == true dotask.wait(1)timePassed += 1print(timePassed)end进行游戏测试,检查在 输出 窗口中是否显示每秒的计时。
奖励玩家奖牌
最后,使用一个包含多个条件的 if 语句,根据玩家的表现给予他们不同的奖品奖牌。使用 if 语句和两个 elseif 语句检查玩家的完成时间,并给予他们正确的奖牌。
为了确认可以授予每个奖牌,使用打印语句。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)end为了授予金牌,编写一个 if 语句,将 timePassed 与所需完成时间进行比较。这个示例检查玩家的时间是否小于或等于 10 秒。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)if timePassed <= 10 thenprint("你获得了金牌!")endend进行游戏测试,确认金牌可以被授予。
添加额外的条件
现在你已经测试过金牌,使用 elseif 关键字为其他奖牌编写条件。
对于银牌,使用 elseif 和下一个所需的时间范围。在这个示例中,该范围是大于 10 秒但小于或等于 20 秒。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)if timePassed <= 10 thenprint("你获得了金牌!")elseif timePassed > 10 and timePassed <= 20 thenprint("你获得了银牌!")endend对于铜牌,使用相同的模式。检查你的代码与下面的示例。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)if timePassed <= 10 thenprint("你获得了金牌!")elseif timePassed > 10 and timePassed <= 20 thenprint("你获得了银牌!")elseif timePassed > 20 and timePassed <= 30 thenprint("你获得了铜牌!")endend对于银牌和铜牌进行游戏测试。
故障排除提示
如果你没有看到银牌和铜牌出现,请尝试以下操作。
- 每个 elseif 后面都应该有一个 then。
- 在 partTouched() 中,确保 if 语句的第二个条件使用 ==,像 raceActive == true。
- 检查每个 elseif 是否在作用域内。每个 elseif 条件必须位于 if/then 语句的第一行和最后一个 end 之间。
添加 else 条件
如果玩家没有获得任何奖牌,你应该鼓励他们再试一次。在这种情况下,你可以使用 else 语句,它在没有其他条件成立时运行,以向他们展示消息。
在最后一个 elseif 之下和 end 之上,开始新的一行并输入 else。不要添加 then。在 else 下面,使用打印语句提示他们再试一次。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)if timePassed <= 10 thenprint("你获得了金牌!")elseif timePassed > 10 and timePassed <= 20 thenprint("你获得了银牌!")elseif timePassed > 20 and timePassed <= 30 thenprint("你获得了铜牌!")elseprint("再试一次!")endend进行游戏测试查看 else 消息。
总结
控制结构可以有多个场景。使用 if 语句设置初始检查语句,然后根据需要添加多个 elseif 条件。最后,使用 else 来说明如果所有给定条件都为假时应该发生什么。
从顶部开始,所有条件将被检查,只有第一个为真的条件将运行代码。其余的条件将不会被检查,且它们的代码也不会运行。
完成项目后,你可以扩展脚本以添加一些新元素。
- 添加代码,让玩家在完成后通过触碰起点重复比赛。
- 设计一种在比赛过程中显示时间的方法。你可以通过使用表面 GUI 在某个部件上显示时间,如在 创建计时桥教程 中那样。
完成的脚本
local timePassed = 0
local finishLine = script.Parent
-- 用于在比赛结束时保持 finish() 和计时器不重复
local raceActive = true
-- 玩家触碰终点线并显示奖项时运行
local function finish()
raceActive = false
print("你完成的时间是 " .. timePassed)
if timePassed <= 10 then
print("你获得了金牌!")
elseif timePassed > 10 and timePassed <= 20 then
print("你获得了银牌!")
elseif timePassed > 20 and timePassed <= 30 then
print("你获得了铜牌!")
else
print("再试一次!")
end
end
-- 检查比赛进行时是否有玩家触碰该部件
local function partTouched(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid and raceActive == true then
finish()
end
end
finishLine.Touched:Connect(partTouched)
-- 在比赛进行时跟踪时间。需要位于脚本底部。
while raceActive == true do
task.wait(1)
timePassed += 1
print(timePassed)
end