What We Actually Learned (And Where to Go Next)

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:
Read input
Update the world
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.



