Making a game actually fun
What makes a game fun? There’s plenty of reading material on the subject if you are interested, and the answer is usually “potentially many things” or “it depends on the player.” The purpose of this post is not to get into all that, but to chronicle my adventures in trying to make my latest game actually fun to play. Well, at least fun for me 😊
The Game: “Gravity”
This is one of my “arcade” games. I find game genres to be a generally confusing and imprecise concept, so I’ll just explain what I mean when I say arcade game. There is no mechanism to win or beat the game; you play until you lose. Difficulty increases over time and you try to last as long as you can and collect as many game points as possible while doing so, hoping to achieve a high score.
Background: How a high school project got me into making games
The concept for this game goes way back to the high school project where I first learned programming. The project was to use a computer simulation to test the viability of alternate theories of gravity. In theory, a modified version of gravity (i.e. general relativity) that is increased over extreme distances can explain away the necessity of dark matter, or at least the initial and primary evidence for dark matter: the rotational velocity of stars near the edges of galaxies. While the astrophysical question is fascinating and all, I found that I was much less interested in learning anything of scientific value, and much more interested in trying to turn my project into a playable game. At the time I ended up with neither a useful scientific project nor a playable game, but I did teach myself some very basic programming and get an easy A 🤷.
First Iteration: Basic playable mechanics
So finally, 10+ years later, I decided to dig this old concept up from the graveyard of my mind and make a functional game out of it. With a number of other arcade-style games under my belt (on my github if interested), I jumped right into it. The game is based on a discrete-time simulation of simplified Newtonian gravity… no relativity or calculus here folks. Every game tick, each game object (aka colored circle, naturally… any semblance of graphics is always bottom of the priority list for me) accelerates every other piece based on mass and distance. Very simple and gets the job done. You interact with the game by moving your mouse (the small pink piece) around, using it to coax other objects to move in a desired direction. The blue piece is conceptually the true “player” piece; this piece is used to collect score (green objects) and the game is over if it loses all of its shields by running into the black and red “enemy” objects. The player piece cannot be controlled directly and must be moved around via gravitational attraction to your mouse piece, just like every other game object.
This basic idea is the first iteration of the game, and was pretty fun for a time, due to nothing other than the novelty and difficulty of the game controls. However, the fun wore off pretty quickly. There was no strategy whatsoever to maximizing your score, you just had to vaguely avoid doing anything dumb or getting unlucky for as long as possible. I added a hidden difficulty mechanic that steadily increased the number and mass of enemy pieces over time (as well as decreasing the mass of the mouse piece - making the game increasingly difficult to control), so sooner or later it gets too tough and you lose. I tweaked the shield regeneration rate based on your distance from the center of the game area, incentivizing you to stay somewhat close to the action. Still no actual strategy and not enough interesting mechanics to keep you playing for long, however. New concepts were needed.
Second Iteration: Adding strategy with fresh ideas
Enter the “difficulty meter” (top green bar) and a second type of score object to collect (purple):
The meter is a related but separate concept to the time-based difficulty. The bar turns green and stretches to the right when positive, and red to the left when negative, the size of the colored bar indicating how heavily positive or negative it is. There is also a text number that ticks up over time, showing you the previously hidden time-based difficulty of the game:
The score objects have been separated into 2 types: green pieces now increase your difficulty meter towards the positive direction, and purple pieces give you actual game score but decrease the meter. The meter also drops steadily over time, and drops anytime a new green piece appears. The score pieces “decay”, or shrink, over time and the amount of score/meter collected is tied to the size. We now have an incentive to collect the green pieces as quickly as possible - get them before they decay and keep up with the automatically dropping meter. This also presents our first available strategic decision to be made over whether or not to collect any given purple piece for score at the cost of your meter.
Fine, you say, but what does the meter actually do? At first, the meter only controlled one thing: how fast the time-based true difficulty of the game increased. This meant that if you kept your meter high, difficulty climbed more slowly, and you had more time to maximize your score. Finally, we had some semblance of strategy, and the game was resultingly getting somewhat more engaging!
Third Iteration: Now it’s fun
However, the second iteration of the game still had a key problem when it comes to fun: the incentive to keep your meter high was based around a long term effect and relied on delayed gratification. Now, again without getting too much into what all can make a game “fun”, delayed gratification can in fact be very fun in a game if used correctly, but not here and not in this simple game where the only gameplay is to hurriedly move your mouse around the screen trying to keep objects from flying out of your control…. So, I added a couple more direct effects of the meter: it increases your shield regeneration rate and affects the size and density of the game-controlling mouse piece. The latter of these two effects turned out to be exactly what I was looking for: you now immediately notice how much harder it is to get things to move around when your meter drops. Let’s roll up our sleeves and cut to an imaginary montage of balancing, adding more difficulty-based game mechanics such as a different type of enemy piece that uses randomized gravity multipliers to throw you off, and more continual rebalancing.
Success! The game is now pretty fun, and I find myself immediately smashing the “new game” button upon losing, thinking to myself, “C’mon man, you can do better than that!” However, I do still have a complaint with the state of things as they stand before I can call the game’s third iteration solid: I’ve balanced and tweaked a number of different mechanics around two completely different difficulty mechanisms. We have the controllable meter and the hands-off timer, functioning in related but separate fashions, each affecting certain things but not others to the point where I can’t even remember what does what anymore, despite having been the one making it work. So as I write this post, I’m consolidating these separate concepts into a single function that is used to include a difficulty effect on any game mechanic, with a couple of control parameters allowing for much easier and more precise balance tweaks:
That's a simple introduction to how I come up with and develop games. More posts to follow. Hit me up if you have any ideas of your own. @GrohmanMatthew