What’s a State Machine?
What if I ask you, what is the name of this game above?
- It's Mario
Okay, now let's imagine you’re playing Mario. Mario can:
- Stand
- Throw fireballs
- Run
- Jump
- Do nothing (idle)
- Die
But he can’t do all of them at the same time. Mario’s “state” decides what he’s doing right now.
That is where state machines come in handy:
A state machine is just a system that:
- Knows what state it’s in (standing, running, jumping…)
- Knows how to switch between states (e.g., press jump → Mario jumps)
- Doesn’t let you do illegal stuff (e.g., you can’t throw fireballs while dying)
How Does It Work?
The most popular example used while explaining state machines is the Traffic Light.
Think of a traffic light :
- Green → Yellow → Red
- It’s not random. You don’t go Green → Green → Red → Red → Yellow.
- Each state only allows certain transitions.
- You can't be in 2 states at one time.
Same in games:
- Can Mario jump from "Dying"? Nope.
- Can an enemy attack while "Dead"? Nope.
That’s the beauty of a state machine.
Why NOT Just Use If-Else?
if player.is_jumping: # Jump logicelif player.is_running: # Run logicelif player.is_dead: # Death logic
Looks cool right now, look at this.
SOURCE ARTIFICIAL INTELLIGNECE, CODE NOT MEANT TO BE RUN ITS JUST FOR EXAMPLE
class Player: def __init__(self): self.is_idle = True self.is_running = False self.is_jumping = False self.is_shooting = False self.is_dead = False self.is_crouching = False self.is_falling = False self.is_attacking = False def update(self, inputs): if self.is_dead: print("Play death animation") # Game Over logic return if inputs.get("press_jump"): if self.is_crouching: print("Can't jump while crouching... but wait it still happens!") self.is_jumping = True self.is_idle = False self.is_running = False print("Jumping...") if inputs.get("press_run"): if self.is_jumping: print("Running mid-air like Naruto (why?)") self.is_running = True self.is_idle = False print("Running...") if inputs.get("press_crouch"): if self.is_jumping: print("Crouching mid-air. This isn’t Fortnite bro.") self.is_crouching = True self.is_idle = False print("Crouching...") if inputs.get("press_attack"): if self.is_dead: print("Attacking while dead? Ghost attacks?") else: self.is_attacking = True print("Attacking!") if inputs.get("fall_detected"): if self.is_running: print("Falling while running? Sure why not.") self.is_falling = True print("Falling...") # Reset states randomly (why? because spaghetti) if inputs.get("landed"): self.is_jumping = False self.is_falling = False self.is_idle = True self.is_running = False self.is_attacking = False self.is_crouching = False print("Landed. Reset everything!")player = Player()# Simulate random inputsinputs = { "press_jump": True, "press_run": True, "press_crouch": True, "press_attack": True, "fall_detected": True, "landed": False}player.update(inputs)
In this code:
- You can run, crouch, jump, attack, AND fall at the same time.
- No clear “current state” — it’s just flags all over.
- Adding ONE more state means more if-else hell.
- Debugging? I would rather not respond to that.
Now, let's say you usea state machine
SOURCE ARTIFICIAL INTELLIGENCE, CODE NOT MEANT TO BE RUN IT'S JUST FOR EXAMPLE
class State: def enter(self, player): pass def exit(self, player): pass def handle_input(self, player, inputs): passclass IdleState(State): def enter(self, player): print("Mario is now standing still (Idle)") def handle_input(self, player, inputs): if inputs.get("press_run"): player.change_state(RunningState()) elif inputs.get("press_jump"): player.change_state(JumpingState()) elif inputs.get("press_crouch"): player.change_state(CrouchingState()) elif inputs.get("press_attack"): player.change_state(AttackingState()) elif inputs.get("die"): player.change_state(DeadState())class RunningState(State): def enter(self, player): print("Mario starts running 🏃♂️") def handle_input(self, player, inputs): if inputs.get("release_run"): player.change_state(IdleState()) elif inputs.get("press_jump"): player.change_state(JumpingState()) elif inputs.get("press_attack"): player.change_state(AttackingState()) elif inputs.get("die"): player.change_state(DeadState())class JumpingState(State): def enter(self, player): print("Mario jumps into the air 🦘") def handle_input(self, player, inputs): if inputs.get("landed"): player.change_state(IdleState()) elif inputs.get("die"): player.change_state(DeadState())class CrouchingState(State): def enter(self, player): print("Mario crouches 👀") def handle_input(self, player, inputs): if inputs.get("release_crouch"): player.change_state(IdleState()) elif inputs.get("die"): player.change_state(DeadState())class AttackingState(State): def enter(self, player): print("Mario attacks 🔥") def handle_input(self, player, inputs): if inputs.get("attack_done"): player.change_state(IdleState()) elif inputs.get("die"): player.change_state(DeadState())class DeadState(State): def enter(self, player): print("Mario has died 💀") def handle_input(self, player, inputs): pass # No transitions from Deadclass Player: def __init__(self): self.state = IdleState() self.state.enter(self) def change_state(self, new_state): self.state.exit(self) self.state = new_state self.state.enter(self) def update(self, inputs): self.state.handle_input(self, inputs)# Example usageplayer = Player()inputs = { "press_run": True}player.update(inputs)inputs = { "press_jump": True}player.update(inputs)inputs = { "landed": True}player.update(inputs)inputs = { "die": True}player.update(inputs)
In this code:
- ONE single state active at a time
- No state weird combos
- Adding new states is EASY
Why You NEED State Machines in Game Dev
- Clean code
- Predictable behavior
- Easy debugging
- Handles complex characters/enemies like bosses with multiple phases
TL;DR
- Our character/enemy is always doing ONE thing at a time.
- A state machine keeps track of “what” and “what’s next”.
- It prevents bugs like "walking, shooting, and dying simultaneously".
Outro
TASK
Now… are you gonna JUST read this and scroll TikTok after? Or code a state machine today?
Try this to learn FSM:
- Traffic lights
- A vending machine
- A door
- A player
Watch These
- 👉I made a game in Mini script with No Experience
- 👉Godot's Unity Asset Store Killer
- 👉Pastopia: When Gaming Meets Coding
Till Then, Stay Awesome and Good Bye.
Top comments(0)
For further actions, you may consider blocking this person and/orreporting abuse