"

7 Loops

Kyra Ma; Hasan Malik; and Rutwa Engineer

Learning Objectives

  • Learn about the need for loops
  • Learn about for loops
  • Learn about while loops
  • Learn how to avoid infinite while loops
  • Learn about nested loops
  • Learn about breaks and continues

Introduction

What are Loops?

Loops are programming structures used to repeat a block of code multiple times, either for a specific number of iterations or until a particular condition is met. They help automate repetitive tasks, making programs more efficient and less error-prone.

For example, imagine a factory assembly line where a machine places caps on bottles. Instead of having a worker manually cap each bottle, the machine repeats the same task for every bottle on the line. Loops work like this machine, performing repetitive actions automatically.

Why Are Loops Useful?

Loops reduce redundant code by repeating instructions instead of writing them multiple times. Later on, they will help us handle complex tasks like iterating over lists, spawning objects, or animating characters. Loops make our code shorter, more efficient, and simpler to understand.

For Loops

For loops are used when you know how many times you want to repeat an action.

The basic structure of a for loop in Lua includes the initializer, condition, and incrementer.

The Basic Structure of a For Loop

for variable = start_value, end_value, step_value do

     --code to repeat

end


variable: this is often named i (short for “index”), and acts as the loop control variable

start_value: The starting value of the loop control variable.

end_value: The value at which the loop will stop executing. The loop runs as long as the variable is less than or equal to this value.

step_value (optional): How much the variable changes each iteration (default is 1 if omitted)

Example: Counting Upwards

In this example, the loop starts at 1, and counts by 1 step until it reaches 5. In each iteration, the print function is executed.

for i=1, 5 do

     print("Hello, World!")

end

Output:

Hello, World!

Hello, World!

Hello, World!

Hello, World!

Hello, World!

Example: Counting Backwards

In Lua, you can count backwards using a negative step value.

for i=5, 1, -1 do

     print("Countdown: " .. i)

end


Output:

Countdown: 5

Countdown: 4

Countdown: 3

Countdown: 2

Countdown: 1

Example: Spawning Objects in Roblox

This creates 10 blocks spaced 5 units apart.

for i=1, 10 do

     local part = Instance.new("Part")

     part.Position = Vector3.new(i*5, 0, 0)

     part.Parent = game.Workspace

end

While Loops

While loops are used when you don’t know beforehand how many times the loop should run. They execute as long as the condition evaluates to true.

The Basic Syntax of a While Loop

while condition do

     -- code to repeat

end


condition: A logical expression evaluated before each iteration. If it evaluates to false, the loop stops.

The loop body contains code to execute repeatedly. Usually, something in the loop modifies the condition to prevent an infinite loop.

Example

local count = 0

while count < 3 do

     print("Hello, World!")

     count = count + 1

end


The “count = count + 1” line ensures that the while loop stops after 3 iterations. This is similar to the variable and step count in For Loops.

Output:

Hello, World!

Hello, World!

Hello, World!

Example

local gameRunning = true

while gameRunning do

     print("The game is active!")

     wait(5) --wait 5 seconds

     gameRunning = false -- Condition changes to stop the loop

end


What’s happening in this loop?

In this example, we’re using a boolean variable called gameRunning to control whether our loop continues or stops. At the beginning, gameRunning is set to true, which means the condition for the while loop is met, so the loop starts running.

Inside the loop:

  • The message “The game is active!” is printed in the output.

  • The program waits for 5 seconds using wait(5).

  • After waiting, gameRunning is set to false, which causes the loop to stop the next time it checks the condition.

As you may have noticed, this loop only runs once, because we manually set the condition to false at the end of the first cycle. This is a great example of how we can use booleans and loops together to control how long something happens in our game!

This kind of loop could be used to display a message (“The game is active!”), wait for a short moment (like a countdown or intro), and then stop automatically once the condition is no longer true.

Common Mistake: Infinite Loops

Make sure the loop condition will eventually become false, or the loop will run forever, which results in an infinite loop!

Example:

while true do

     print("This will run forever!")

end


Infinite loops: This happens when the loop’s condition never becomes false, so the loop keeps running forever — which can freeze your game or crash Roblox Studio!

For example, the above loop will run forever because the condition is literally true, and there’s no code inside to stop it. Every frame, it will keep printing the same message over and over, which can make your game unresponsive.

In the previous example, we avoided this by setting gameRunning = false inside the loop. If we didn’t include that line, the loop would just keep printing “The game is active!” and waiting forever. Always make sure your loop has a way to stop. You can do this by:

  • Changing a condition variable (like we did with gameRunning)

  • Adding a break statement when a certain action happens

  • Using timers or counters to limit the number of loop runs

Make sure to take caution!

Looping Tasks

Loops are perfect for:

  • Automating repetitive tasks like spawning objects.
  • Iterating over lists or arrays (e.g., checking players in a game).
  • Animating characters or objects with repeated movements.

For example, if you are creating a countdown in a game:

local countdown = 10

while countdown > 0 do

     print("Time left: " .. countdown)

     wait(1) --wait 1 second

     countdown = countdown - 1

end

print("Go!")

Exercise

Write a loop that spawns 5 balls and makes them fall.

 

Show/Hide

for i =1, 5 do
local ball = Instance.new(“Part”)
ball.shape = Enum.PartType.Ball
ball.Size = Vector3.new(2,2,2)
ball.Position = Vector3.new(0, i*5, 0)
ball.Anchored = false
ball.Parent = game.Workspace
end

Extension: Animations!

Segment on animations:

local animation = Instance.new(“Animation”)

animation.AnimationId = “rbxassetid://15621353377”

local animationTrack  = script.Parent.Humanoid.Animator:LoadAnimation(animation)

animationTrack:Play()

Nested Loops

Nested loops are loops inside of a loop! This is good for more complex tasks that require complex iterations.

This is the basic syntax:

Basic Syntax for Nested Loops

for i=1, outer_limit do

for j=1, inner_limit do

–code to execute

end

end

The outer loop runs first, controlling the number of times the inner loop is executed.

The inner loop completes all its iterations for each iteration of the outer loop.

Example

for x=1, 3 do

     for y=1, 3 do

          print("Coordinates: (" .. x .. ", " .. y .. ")")

      end

end


Output:

Coordinates: (1, 1)

Coordinates: (1, 2)

Coordinates: (1, 3)

Coordinates: (2, 1)

Coordinates: (2, 2)

Coordinates: (2, 3)

Coordinates: (3, 1)

Coordinates: (3, 2)

Coordinates: (3, 3)

Breaks and Continues

Sometimes, you need more control over how a loop executes. Lua provides two key statements: break and continue.

break: Exits the loop entirely

for i=1, 10 do

     if i == 5 then

          break

     end

     print(i)

end


Output:

1

2

3

4

continue: Skips the current iteration and moves to the next one

for i=1, 10 do

     if i%2 == 0 then

          continue -- skip even numbers

     end

     print(i)

end


Output:

1

3

5

7

9

Congratulations—you now know about loops in Lua!

 

 

License

Icon for the Creative Commons Attribution-NonCommercial 4.0 International License

Learn Coding and Animations in Lua Code Copyright © by Kyra Ma; Hasan Malik; and Rutwa Engineer is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License, except where otherwise noted.