Các cấu trúc điều khiển có thể có nhiều hơn một điều kiện. Các từ khóa else và elseif có thể tạo ra các kịch bản bổ sung cho những gì nên xảy ra dưới nhiều điều kiện khác nhau. Cú pháp trông như sau:
if isGreen then
print("Đi")
elseif isYellow then
print("Chậm lại")
elseif isPedestrians then
print("Chờ")
else
print("dừng lại")
endTrong dự án này, else và elseif được sử dụng để lập trình một khóa học parkour nơi các vận động viên nhận giải thưởng tùy thuộc vào thời gian hoàn thành của họ.

Lập trình nhiều điều kiện
Đối với dự án này, bạn có thể viết một câu lệnh if độc nhất cho mỗi huy chương để trao cho người chơi, nhưng điều đó tốn rất nhiều thời gian. Lấy ví dụ, mã tưởng tượng dưới đây.
if finishTime < 5 then
-- Nhận huy chương vàng
end
if finishTime >= 5 and <= 10 then
-- Nhận huy chương bạc
end
if finishTime > 10 and <= 15 then
-- Nhận huy chương đồng
endMột cách lập trình dễ đọc và hiệu quả hơn là sử dụng một câu lệnh if duy nhất và sử dụng từ khóa elseif để cung cấp các điều kiện thay thế để kiểm tra nếu các điều kiện trước đó không đúng.
if finishTime < 5 then
-- Nhận huy chương vàng
elseif finishTime >= 5 and <= 10 then
-- Nhận huy chương bạc
elseif finishTime > 10 and <= 15 then
-- Nhận huy chương đồng
endKhi câu lệnh if/then chạy, nó sẽ bắt đầu từ trên cùng và chỉ chạy mã cho điều kiện đúng đầu tiên mà nó tìm thấy.
Thiết lập đường đua
Bắt đầu bằng cách đặt điểm xuất phát và vạch đích của khóa học, sau đó tạo một kịch bản để đo thời gian của người chơi và trao các huy chương khác nhau.
Tạo một phần được neo có tên là FinishLine. Để làm cho việc kiểm tra nhanh hơn, hãy đặt điểm bắt đầu và kết thúc gần nhau. Bạn có thể di chuyển vạch đích sau khi hoàn thành kịch bản.

Phần Vạch Đích 
Toàn bộ Khóa Học Trong FinishLine, chèn một kịch bản có tên là RaceManager. Sau đó, thêm một biến để lưu trữ số giây đã trôi qua kể từ khi cuộc đua bắt đầu và một biến thứ hai để tham chiếu đến FinishLine.
local finishLine = script.Parentlocal timePassed = 0Tạo một hàm có tên finish().
local timePassed = 0local finishLine = script.Parentlocal function finish()endTự làm:
- Lập trình một hàm có tên partTouched() mà chạy finish() khi một người chơi chạm vào nó.
- Kết nối phần vạch đích với partTouched().
- So sánh mã của bạn với ví dụ dưới đây.
local function finish()print("chạm vào vạch đích")endlocal function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenfinish()endendfinishLine.Touched:Connect(partTouched)Chơi thử và kiểm tra rằng finish() được gọi khi bạn chạm vào vạch đích.
Ngăn chặn finish() lặp lại
Hiện tại, bất cứ khi nào một người chơi chạm vào vạch đích, finish() sẽ được gọi liên tục miễn là người chơi chạm vào phần đó.
Sử dụng một biến boolean, một biến lưu trữ giá trị đúng hoặc sai, để đảm bảo rằng finish() chỉ được gọi một lần.
Tạo một biến mới có tên raceActive và đặt nó thành true.
local timePassed = 0local finishLine = script.Parentlocal raceActive = true-- Chạy mỗi khi người chơi chạm vào phần vạch đíchlocal function finish()Thêm một điều kiện thứ hai vào câu lệnh if để kiểm tra xem raceActive có đúng không trước khi gọi finish().
local function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and raceActive == true thenfinish()endendĐể ngăn finish() được gọi lại, hãy đặt raceActive thành false.
local function finish()print("chạm vào vạch đích")raceActive = falseendChơi thử trò chơi của bạn để kiểm tra rằng bạn chỉ thấy câu lệnh in thử nghiệm của mình một lần.
Theo dõi thời gian
Giống như một câu lệnh if, một vòng lặp while cũng có thể sử dụng một điều kiện để xem nó có nên chạy hay không. Để đo thời gian của người chơi, hãy tạo một bộ đếm thời gian bằng cách sử dụng vòng lặp while true do chỉ chạy khi biến boolean raceActive là đúng.
Ở cuối kịch bản, gõ while raceActive == true do. Nhấn Enter để tự động hoàn thành và thêm end.
finishLine.Touched:Connect(partTouched)while raceActive == true doendĐể đo thời gian của người chơi, trong vòng lặp, thêm 1 vào biến timePassed mỗi giây. Bao gồm một câu lệnh in để kiểm tra công việc của bạn.
finishLine.Touched:Connect(partTouched)while raceActive == true dotask.wait(1)timePassed += 1print(timePassed)endChơi thử trò chơi và kiểm tra rằng bạn thấy mỗi giây được hiển thị trong cửa sổ Output.
Trao huy chương cho người chơi
Để hoàn thành, hãy sử dụng một câu lệnh if với nhiều điều kiện để trao cho người chơi một huy chương khác nhau dựa trên hiệu suất của họ. Sử dụng một câu lệnh if và hai câu lệnh elseif để kiểm tra thời gian hoàn thành của người chơi và trao cho họ huy chương đúng.
Để xác nhận mỗi huy chương có thể được trao, hãy sử dụng các câu lệnh in.
local function finish()raceActive = falseprint("Bạn đã hoàn thành trong " .. timePassed)endĐể trao huy chương vàng, lập trình một câu lệnh if so sánh timePassed với thời gian hoàn thành mong muốn. Ví dụ này kiểm tra xem thời gian của người chơi có nhỏ hơn hoặc bằng 10 giây hay không.
local function finish()raceActive = falseprint("Bạn đã hoàn thành trong " .. timePassed)if timePassed <= 10 thenprint("Bạn nhận huy chương vàng!")endendChơi thử và xác nhận rằng huy chương vàng có thể được trao.
Thêm các điều kiện bổ sung
Bây giờ bạn đã kiểm tra huy chương vàng, hãy lập trình các điều kiện cho các huy chương khác bằng cách sử dụng từ khóa elseif.
Đối với huy chương bạc, sử dụng elseif và khoảng thời gian mong muốn tiếp theo. Trong ví dụ này, khoảng thời gian lớn hơn 10 giây nhưng nhỏ hơn hoặc bằng 20 giây.
local function finish()raceActive = falseprint("Bạn đã hoàn thành trong " .. timePassed)if timePassed <= 10 thenprint("Bạn nhận huy chương vàng!")elseif timePassed > 10 and timePassed <= 20 thenprint("Bạn nhận huy chương bạc!")endendSử dụng cùng một mẫu cho huy chương đồng. Kiểm tra mã của bạn với ví dụ dưới đây.
local function finish()raceActive = falseprint("Bạn đã hoàn thành trong " .. timePassed)if timePassed <= 10 thenprint("Bạn nhận huy chương vàng!")elseif timePassed > 10 and timePassed <= 20 thenprint("Bạn nhận huy chương bạc!")elseif timePassed > 20 and timePassed <= 30 thenprint("Bạn nhận huy chương đồng!")endendChơi thử cho huy chương bạc và đồng.
Mẹo khắc phục sự cố
Nếu bạn không thấy huy chương bạc và đồng xuất hiện, hãy thử một trong những điều dưới đây.
- Mỗi elseif nên có một then sau điều kiện của nó.
- Trong partTouched(), hãy đảm bảo rằng điều kiện thứ hai của câu lệnh if sử dụng ==, như trong raceActive == true.
- Kiểm tra rằng mỗi elseif nằm trong phạm vi. Mỗi điều kiện elseif phải nằm giữa dòng đầu tiên của câu lệnh if/then và end cuối cùng của nó.
Thêm điều kiện else
Nếu người chơi không kiếm được bất kỳ huy chương nào, bạn nên khuyến khích họ thử lại. Trong trường hợp này, bạn có thể sử dụng một câu lệnh else, sẽ chạy nếu không có điều kiện nào khác là đúng, để hiển thị cho họ một thông điệp.
Dưới câu lệnh elseif cuối cùng và trên end, bắt đầu một dòng mới và gõ else. Không thêm then. Dưới else, sử dụng một câu lệnh in để nhắc nhở họ thử lại.
local function finish()raceActive = falseprint("Bạn đã hoàn thành trong " .. timePassed)if timePassed <= 10 thenprint("Bạn nhận huy chương vàng!")elseif timePassed > 10 and timePassed <= 20 thenprint("Bạn nhận huy chương bạc!")elseif timePassed > 20 and timePassed <= 30 thenprint("Bạn nhận huy chương đồng!")elseprint("Thử lại nhé!")endendChơi thử để xem thông điệp else.
Tóm tắt
Các cấu trúc điều khiển có thể có nhiều hơn một kịch bản. Sử dụng các câu lệnh if để thiết lập câu lệnh ban đầu để kiểm tra, và sau đó thêm nhiều điều kiện elseif cần thiết. Cuối cùng, sử dụng else để chỉ ra những gì nên xảy ra nếu tất cả các điều kiện đã cho đều sai.
Bắt đầu từ trên cùng, tất cả các điều kiện sẽ được kiểm tra, và chỉ điều kiện đúng đầu tiên sẽ chạy mã. Các điều kiện còn lại sẽ không được kiểm tra, cũng như mã của chúng sẽ không chạy.
Sau khi hoàn thành dự án, bạn có thể mở rộng kịch bản để thêm các yếu tố mới theo một vài cách bổ sung.
- Thêm mã để người chơi có thể lặp lại cuộc đua bằng cách chạm vào vạch xuất phát khi họ hoàn thành.
- Thiết kế một cách để hiển thị thời gian trong một cuộc đua. Bạn có thể hiển thị thời gian trên một phần sử dụng Surface GUI, như trong Tạo một cây cầu có thời gian.
local timePassed = 0
local finishLine = script.Parent
-- Được sử dụng để giữ cho finish() và bộ đếm thời gian không lặp lại khi cuộc đua kết thúc
local raceActive = true
-- Chạy khi người chơi chạm vào vạch đích và hiển thị cho họ một giải thưởng
local function finish()
raceActive = false
print("Bạn đã hoàn thành trong " .. timePassed)
if timePassed <= 10 then
print("Bạn nhận huy chương vàng!")
elseif timePassed > 10 and timePassed <= 20 then
print("Bạn nhận huy chương bạc!")
elseif timePassed > 20 and timePassed <= 30 then
print("Bạn nhận huy chương đồng!")
else
print("Thử lại nhé!")
end
end
-- Kiểm tra xem một người chơi có chạm vào phần khi cuộc đua đang hoạt động không
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)
-- Theo dõi thời gian cuộc đua trong khi cuộc đua đang hoạt động. Cần ở dưới cùng của kịch bản.
while raceActive == true do
task.wait(1)
timePassed += 1
print(timePassed)
end