This app was built as a modern web-based project using
Microsoft Blazor
and WebAssembly,
partly because I wanted the challenge,
and partly because I wanted the whole thing to run in the browser in a clean and direct way.
What I thought would be fairly straightforward at first
turned out to be a very good way to learn a lot more than I expected
about Blazor, WASM, browser rendering, user interaction,
and how to structure a game so that it stays understandable.
One of the big attractions of Blazor and WebAssembly for this kind of app
is that the game logic runs in the user’s browser
instead of constantly going back to the server.
A game like this can become very computationally expensive very quickly.
If every movement,
every calculation,
every screen update,
and every user action has to be handled centrally on the server.
By moving the load from the server to the client:
- The app becomes more responsive for the player,
- Reducing server compute and network workload (therefore also hosting costs).
- At the cost of a larger (slower) initial download.
When you want something like this
to be used by a large number of people,
this tuning matters.
This was not built in one neat straight line.
There were lots of test versions, lots of experiments, many (far too many) dead ends,
and lots of refinements.
I kept trying ideas, looking at what worked, changing what did not, and then trying again.
Some parts were rebuilt several times as I learned more about what the game needed,
what the player needed to see,
and what made the whole thing feel more natural and more fun.
ChatGPT and Microsoft Copilot both helped along the way.
They were useful for discussing designs, generating code, reviewing approaches,
suggesting alternatives,
and helping me move past the many little roadblocks that come with a project like this.
That did not remove the thinking from the job.
These are great tools, and used well they make it easier for developers to draft work,
explore alternatives, and move through ideas more quickly,
then keep the ones that worked and throw away the ones that did not.
One of the most interesting parts of the project has been how much I learned while building it.
I started out thinking mainly about a Lunar Lander game.
Along the way I found myself learning much more about Blazor component structure,
WebAssembly behaviour, browser event handling, graphics, layout,
and the practical realities of making an interactive app feel responsive and clear.
In that sense, the project has been a learning exercise as well as a game.
From the start, the design question was not just,
“Can I make a lander move?”
It was,
“Can I make a lander game that is fun, understandable, and worth coming back to?”
That question has driven the many versions so far,
and it is still driving the refinements now.
Written with the view that the best JavaScript
is often the JavaScript you did not need to write:
just enough JavaScript to do the job,
but not so much that it becomes cumbersome.