Skip to main content

Command Palette

Search for a command to run...

What We Actually Learned (And Where to Go Next)

Published
4 min read
What We Actually Learned (And Where to Go Next)
D

An engineer with a curious mind and a love for systems that go beyond the surface.I enjoy exploring how things work under the hood — whether it's rendering pixels, routing audio, or handling low-level protocols. My work spans across game development, system programming, and occasionally web tech when the problem is worth solving. I’m driven by the desire to build things that are fast, efficient, and just a bit unconventional. This blog is my space to document experiments, challenges, and the weirdly satisfying bugs that teach you more than tutorials ever could.

Outside of tech, I enjoy observing how people use technology, and occasionally breaking things just to fix them better.

By now, the game is complete.

Not just playable — but structured, understandable, and extendable.

So instead of adding more features, this final part is about stepping back and understanding what this project really taught us.

Because the most important lessons here have nothing to do with ncurses.

This Was Never About ncurses

ncurses was just a tool.

A convenient way to:

  • draw characters

  • read input

  • control the screen

But the real learning happened underneath.

What we actually built was a game loop, a state machine, and a set of interacting systems.

Those ideas exist in every game, no matter the technology.

The Core Ideas You Now Understand

Let’s make this explicit.

1. The Game Loop

You now understand that a game is not:

  • a sequence of steps

  • or a bunch of functions

A game is a loop that repeatedly does:

  1. Read input

  2. Update the world

  3. Render the result

Everything else is detail.

Once this clicks, game development stops feeling mysterious.

2. Non-Blocking Input

Games don’t wait.

You learned why:

  • blocking input breaks motion

  • real-time interaction requires constant polling

  • responsiveness comes from timing, not speed

This concept alone transfers directly to:

  • SDL

  • Raylib

  • game engines

  • even UI programming

3. Time and Control

You saw firsthand what happens when:

  • logic runs as fast as the CPU

  • movement is tied to frames

And you learned simple ways to control time:

  • fixed FPS

  • frame-based movement

  • delaying updates intentionally

Later, this naturally evolves into delta-time — but now you know why it exists.

4. Game State Thinking

This is the big one.

Instead of asking:

“Is the game running?”

You learned to ask:

“What state is the game in?”

Home. Playing. Game Over.

This single idea:

  • simplifies logic

  • removes edge cases

  • scales to complex games

Menus, pauses, cutscenes, levels — all of them are just states.

5. Structure Over Scripts

You didn’t write one long, messy script that does everything.

Instead, you naturally ended up separating things:

  • the player and how it moves

  • bullets and how they behave

  • enemies and how they spawn and fall

  • scoring and progression

Each of these has:

  • its own data

  • its own rules

  • its own lifetime inside the game

This kind of separation makes the code easier to reason about and easier to extend.
It’s also how real games stay manageable as they grow.

Why Starting in the Terminal Was a Good Idea

Working in the terminal removes distractions.

There are no graphics or effects to cover up problems.
If something behaves incorrectly, you see it immediately.

Every movement has to be intentional, and every change in behavior comes from logic you wrote yourself.

You can’t rely on animation or visuals to make things “feel right”.
The only way forward is to understand what the code is actually doing.

That’s what makes this approach so effective for learning.

How This Knowledge Scales Up

This is the part that really matters.

Nothing you built here is specific to the terminal. The same ideas show up again when you move to larger tools.

Characters become pixels.
The terminal becomes a window.
The loop you wrote becomes the engine’s update cycle.

When you open a real game library or engine and see things like update, draw, scenes, or states, they won’t feel unfamiliar.

You’ve already worked through these ideas once — just in a simpler form.

Where to Go Next

If you want to continue from here, good next steps are:

  • Rebuild this game using Raylib

  • Add sound using a real audio library

  • Experiment with time-based movement

  • Split logic into multiple files

  • Add new mechanics instead of new visuals

Final Thought

This game runs in a terminal.

But the ideas behind it scale all the way up to modern game engines.

If you understand this loop, these states, and these rules —
you understand the core of game development.

Everything else is just tools.