控制结构可以有多于一个条件。关键字 else 和 elseif 可以创建在多种条件下应发生的额外场景。语法看起来像这样:
显示elif和else的语法
if isGreen thenprint("Go")elseif isYellow thenprint("Slow")elseif isPedestrians thenprint("Wait")elseprint("stop")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 和 else
if finishTime < 5 then-- 获得一枚金牌elseif finishTime >= 5 and <= 10 then-- 获得一枚银牌elseif finishTime > 10 and <= 15 then-- 获得一枚铜牌end
当 if/然后声明运行时,它将从顶部开始并仅运行找到的第一个 真实条件 的代码。
设置竞赛路线
首先放置课程的起点和终点,然后创建一个脚本来计时玩家并奖励不同的奖牌。
创建一个名为 FinishLine 的锚定部件。为了加快测试速度,将开始和结束放在一起。您可以在完成脚本后移动完成线。
完成部分 >整个课程 >在完成线中,插入名为 RaceManager 的脚本。然后,添加一个变量来存储比赛开始以来多少秒已过,并添加第二个变量来引用终点线。
local finishLine = script.Parentlocal timePassed = 0创建一个名为 finish() 的函数。
local timePassed = 0local finishLine = script.Parentlocal function finish()end自拥有的:
- 编写一个名为 partTouched() 的函数,当玩家触碰它时运行 finish() 。
- 将完成线部分连接到 partTouched() .
- 将您的代码与下面的示例进行比较。
local function finish()print("touched the finish line")endlocal function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenfinish()endendfinishLine.Touched:Connect(partTouched)玩游戏测试,检查 finish() 当你触碰完成线时被调用。
防止 finish() 重复
现在,每当玩家触碰终点线时,finish() 将继续调用,直到玩家触碰到部分为止。
使用一个 boolean 变量,该变量存储真实或虚假,以确保 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("touched the finish line")raceActive = falseend测试你的游戏以确保你只看到你的测试打印声明一次。
跟踪时间
像 if 声明一样, while 循环也可以使用条件来确定是否应该运奔跑。要计时玩家,使用 while true do 循环创建一个计时器,只在 raceActive 布oolen是真实的时运行。
在脚本底部,输入 while raceActive == true do . 按下 Enter 自动完成并添加 end 。
finishLine.Touched:Connect(partTouched)while raceActive == true doend为了计时玩家,在循环中,每秒钟将 1 添加到 timePassed 变量。包括打印声明来测试你的工作。
finishLine.Touched:Connect(partTouched)while raceActive == true dotask.wait(1)timePassed += 1print(timePassed)end玩游戏,检查你是否看到每秒钟在输出窗口显示。
奖励玩家奖牌
为了完成,使用多个条件的 if 声明来奖励玩家根据其表现获得不同的奖牌。使用 if 声明和两个 elseif 声明来检查玩家的完成时间并奖励他们正确的奖牌。
要确认每个奖牌可以授予,请使用打印声明。
local function finish()raceActive = falseprint("You finished in " .. timePassed)end要授予一枚金牌,编写一个 if 声明,将 timePassed 与所需的完成时间进行比较。这个例子检查玩家的时间是否小于或等于 10 秒。
local function finish()raceActive = falseprint("You finished in " .. timePassed)if timePassed <= 10 thenprint("You get a gold medal!")endend进行游戏测试并确认可以授予金牌。
添加额外条件
现在你已经测试了金牌,使用 elseif 关键字测试了其他奖牌的代码条件。
对于银牌奖,使用 elseif 和下一个需要的时间范围。在这个例子中,范围大于 10 秒,但小于或等于 20 秒。
local function finish()raceActive = falseprint("You finished in " .. timePassed)if timePassed <= 10 thenprint("You get a gold medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("You get a silver medal!")endend使用相同的模式为青铜奖牌。检查您的代码与以下示例。
local function finish()raceActive = falseprint("You finished in " .. timePassed)if timePassed <= 10 thenprint("You get a gold medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("You get a silver medal!")elseif timePassed > 20 and timePassed <= 30 thenprint("You get a bronze medal!")endend为银牌和青铜牌进行游戏测试。
排除问题的提示
如果你没有看到银和青铜金属出现,尝试以下方法之一。
- 每个 elseif 应该在其条件之后有一个 then。
- 在 partTouched() 中,确保 if 声明的第二个条件使用 == ,如在 raceActive == true 中。
- 检查每个 elseif 是否处于范围内。每个 elseif 条件必须位于 if/then 声明的第一行和它的最后 end 之间。
添加其他条件
如果玩家没有获得任何奖牌,你应该鼓励他们再试一次。在这种情况下,您可以使用一个 else 声明,如果 没有其他条件 是真实的,将显示给他们一条信息。
在最后的 elseif 和上面的 end 之下,开始新行并键入 else 。 不要 在此添加。在其他情况下,使用打印声明来提示他们再试一次。
local function finish()raceActive = falseprint("You finished in " .. timePassed)if timePassed <= 10 thenprint("You get a gold medal!")elseif timePassed > 10 and timePassed <= 20 thenprint("You get a silver medal!")elseif timePassed > 20 and timePassed <= 30 thenprint("You get a bronze medal!")elseprint("Try again!")endend
2。播放测试以查看其他消信息。
摘要
控制结构可以有多个场景。使用 if 语句来设置初始语句进行检查,然后添加尽可能多的 elseif 条件。最后,使用 else 来说明所有给出条件都为假的情况下应发生的事情。
从顶部开始,所有条件都会被检查,只有第一个真正条件才会运行代验证码。剩余的条件不会被检查,也不会奔跑他们的代码。
完成项目后,您可以扩展脚本以在几种额外方式添加新元素。
- 添加代码,让玩家在完成后触碰开始线即可重复比赛。
- 设计一个方法来在比赛期间显示时间。您可以使用 Surface GUI 显示时间在零件上,如在 创建时间桥教程 中。
Completed script
local timePassed = 0
local finishLine = script.Parent
-- 用于防止在竞赛结束时结束()和计时器重复使用
local raceActive = true
-- 当玩家触碰终点线时运行,并向他们展示奖项
local function finish()
raceActive = false
print("You finished in " .. timePassed)
if timePassed <= 10 then
print("You get a gold medal!")
elseif timePassed > 10 and timePassed <= 20 then
print("You get a silver medal!")
elseif timePassed > 20 and timePassed <= 30 then
print("You get a bronze medal!")
else
print("Try again!")
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