"Fair" is one of those words that sounds like a synonym for "easy" and is not. Some of the most demanding games ever made are scrupulously fair, and plenty of easy games are not. The distinction is worth defining precisely, because once you have it, most level design decisions answer themselves.
What fairness actually means
A fair level satisfies two conditions.
Every failure is caused by the player. The game did not kill you with something you could not have avoided, could not have seen, or could not have reacted to in time.
Every failure is legible to the player. You can say what you did wrong. Not necessarily immediately, and not necessarily in technical terms — but the information needed to improve was available.
Both matter, and the second is the one more often missed. A level can be perfectly winnable and still feel terrible if players cannot work out why they keep dying. "It just went wrong" is a design failure regardless of whether the level was technically completable.
What follows are the seven rules we hold our own levels to, with the failure each one prevents.
Rule 1: everything placed must be reachable
An unreachable collectible is the single most frustrating thing a collection game can produce. It is not a challenge — it is a promise the game cannot keep, and it makes a player doubt every other placement too.
The obvious approach is to generate freely and then verify reachability. This is worse than it sounds: verification is expensive, it has to run at generation time in the browser, and any bug in the verifier produces exactly the failure it was meant to prevent.
The better approach is to generate from structures that cannot produce an unreachable placement.
A recursive-backtracker maze guarantees a path between any two cells by construction. A cave built by joining every room to the previous one with a corridor is connected by construction. A platform ladder whose vertical rises are capped at what the jump can clear and whose horizontal runs are capped at what the run speed can reach cannot produce an unreachable platform, because the parameters that would do so are outside its range.
Once the structure guarantees reachability, collectibles can be placed anywhere on it without checking anything. The guarantee comes free.
This is the general shape of the argument for templates over noise, and it applies well beyond reachability: constrain the generator so bad outputs are impossible rather than filtered.
Rule 2: every threat telegraphs
A hazard that becomes dangerous without warning is not difficult. It is a dice roll, and it teaches the player nothing except that the game cannot be trusted.
Three forms of telegraphing cover almost everything:
Spatial. The hazard enters from beyond the play area and travels into view. Nothing ever spawns on top of the player. This one rule eliminates the majority of unfair deaths in scrolling games.
Temporal. Timed hazards run on a fixed period with a visible warning phase before they become dangerous. Because the period never changes mid-cycle, a player can count it — and counting is more reliable than reacting, which means the game rewards understanding over reflexes.
Behavioural. Moving hazards follow fixed, visible paths. A patrolling cutter travels a set range on a set axis at a set speed. One cycle of observation reveals its entire future behaviour, which makes "watch one cycle before you commit" genuinely useful advice rather than a platitude.
The test for all three: could a player who was paying attention have avoided this? If the honest answer is no, the hazard is not telegraphing enough.
Rule 3: there is always a route through
In generated content it is entirely possible for a wave to come out with every lane blocked, or a corridor to come out with a hazard in the only gap. When that happens the player has not been challenged; they have been ended.
Our wave generators handle it structurally. In lane games, one lane is selected as clear before anything else is placed, and the generator is simply not permitted to put a blocker there. In corridor flyers, the safe channel has a minimum height that shrinks with difficulty but never below a floor. In runner chunks, gaps are sized against the jump distance the player actually has.
The important part is the ordering. Choosing the safe route first and then decorating around it guarantees the route exists. Decorating first and then hoping does not, and no amount of tuning makes "hoping" reliable.
Rule 4: the reaction window has a floor
As difficulty rises, speed increases and spacing tightens. Both shorten the time between an object becoming visible and reaching the player. Left unchecked, that time eventually falls below what a person can act on.
Once that happens, the game has silently changed. Survival no longer depends on skill; it depends on whether the generator produces something you happen to be positioned for. Every player's run ends at approximately the same place, and the game stops measuring anything.
So the curve stops. Our difficulty curves approach a defined maximum and hold, tuned so the worst-case reaction window stays above roughly a third of a second — enough time to perceive, decide and act on a choice, including input latency.
That has a pleasant side effect beyond fairness: because the late game's conditions are stable, a player can practise them. A curve that never stops rising means every deep run is a new game, which is exactly the wrong thing to hand a player who is trying to improve.
Rule 5: forgive collection, tighten collision
This one is invisible and does more for perceived fairness than anything else on the list.
A collection game spends its entire runtime asking you to move toward things — and the things are frequently near hazards. Under pixel-exact rules, that produces two distinct frustrations: gems you clearly touched that did not register, and hazards you clearly missed that killed you.
The fix is to adjust both, in opposite directions.
Collection is generous. The pickup test allows a few extra pixels beyond both radii — four to nine depending on the game. If it looked like a collection, it was one.
Collision is stingy. Deadly hits are tested against a box inset by a few pixels from the visual. If it looked like a near miss, it was one.
Neither changes anything a player can see. Together they remove nearly all the moments where the game feels arbitrary, and they cost nothing in difficulty — the challenge is still to be in the right place, just without the sub-pixel lottery.
Rule 6: failure must be attributable
After a failure, the player should be able to name the cause. This is a design requirement, not a nicety, because a player who cannot diagnose a failure cannot improve, and a player who cannot improve stops playing.
Several things support attribution:
Explicit game-over reasons. Our games state what happened: "You hit a Cutter", "You fell into a gap", "The stage timer ran out". It sounds trivial and it removes an entire category of confusion.
Reward layouts that double as diagnostics. Because gem arcs are drawn on jump curves, the pattern of what you collected tells you what went wrong. Missing the front means you jumped late; missing the back means you jumped from too far away. The level is giving you feedback on your execution whether you asked for it or not.
Visible state. Gravity direction, current speed, magnet radius, power-up timers, combo multiplier — all displayed, because a player cannot attribute a failure to a state they could not see.
Consistency. The same input in the same situation always produces the same result. Any randomness in the simulation breaks attribution completely, because the player's model of the game stops predicting it.
Rule 7: difficulty never serves the operator
The last rule is about intent rather than mechanics, and it is worth stating because the genre's history is full of the opposite.
Arcade cabinets tuned difficulty to end sessions on a schedule, because sessions ending generated revenue. That produced some genuinely excellent games and a great many cheap ones — difficulty spikes that existed to extract a coin rather than to challenge a player.
A browser game has no coin slot, and reproducing that logic would be cargo cult design. So:
- We do not tune curves to produce a target run length.
- We do not add difficulty spikes at points where a player is likely to be engaged.
- We do not make failure expensive to encourage anything.
- We do not make games artificially hard to increase session time.
Every difficulty decision answers one question: does this make the game better to play? If the honest answer is "no, but it keeps people here longer", it does not ship.
How we test for all seven
Rules are worth having only if something checks them. Every game here goes through the same manual pass before publication, on at least one desktop browser and one phone:
- Reachability. Play through several generated levels and confirm every collectible can be taken. Because generation is structurally constrained, this is a sanity check rather than a hunt — but it has caught tuning errors where a jump was nerfed and a ladder's rise cap was not updated to match.
- Telegraphing. Play deliberately badly and note every death. Any death where the cause was not visible beforehand is a bug.
- Safe routes. Run the game to maximum difficulty and confirm waves still contain a passable route.
- Reaction floor. Measure the worst-case window at maximum difficulty and confirm it is above the floor.
- Forgiveness. Deliberately clip gems and hazards at the edges and confirm both behave the way they look.
- Attribution. After twenty deaths, could we name the cause of each one? If any were "not sure", something needs surfacing.
- Honesty. Read the difficulty configuration and ask what each number is for. Any number whose justification is about session length rather than play gets changed.
None of this is exotic, and that is rather the point. Fairness in a collection game is not achieved by a clever system; it is achieved by a small number of rules applied consistently, and by actually checking them before the game goes out.
Key takeaways
- Fairness means every failure was caused by the player and legible to the player — not that the game is easy.
- Generate from templates with bounded parameters so unreachable placements are impossible by construction, not caught by testing.
- Every wave must contain at least one safe route; a wall with no gap is an ending, not an obstacle.
- Collection detection is generous and hazard collision is stingy, which makes near misses and near collections both behave the way they look.
- A player who cannot say what they did wrong has not been beaten by difficulty — they have been beaten by unclear design.
Frequently asked questions
Does fair mean easy?
No. Our expert-tier games are extremely demanding and entirely fair. Fairness is about whether a failure was caused by the player and understandable to them, not about how often failure happens.
How do you guarantee a generated level is completable?
By generating from structures that cannot produce an impossible layout. A recursive-backtracker maze always connects; a platform ladder caps its rises and runs at what the jump can clear; a wave generator always leaves one lane clear.
Why is collection more generous than collision?
Because a collection game constantly asks you to move toward danger. A pixel-exact pickup test makes success feel arbitrary; a pixel-exact collision test makes failure feel arbitrary. Adjusting both a few pixels in opposite directions fixes it.
What is a reaction floor?
The shortest window the game will ever give you to respond. Ours does not compress below roughly a third of a second, because below that, survival stops depending on skill and starts depending on luck.
Why do you not make difficulty rise indefinitely?
Because an uncapped curve eventually makes every player's run end at the same place regardless of skill, which destroys the only thing an endless game measures.
Put it into practice
Reading about collection routes only gets you so far. Pick a game and try one idea from this guide on your next run.