"Fair" is a word that gets used as if it meant "not too hard". It does not. A fair game can be brutally difficult; an unfair game can be trivially easy. The distinction is something more precise and, usefully, testable:

A level is fair when every failure has a cause the player could have identified before it happened.

That definition turns fairness from a feeling into an engineering requirement, and this guide covers the specific constraints that satisfy it.

Rule one: everything placed must be reachable

The most basic violation is placing a collectible where the character physically cannot go. It is also the easiest to prevent, because it is arithmetic.

For a jumping character, the reachable horizontal distance is a projectile range. With jump speed v, gravity g and horizontal speed s, airtime is 2v/g and horizontal reach is s × 2v/g.

Our generator recomputes that figure whenever the speed changes and sizes gaps at 62% of it. The 38% margin is not caution for its own sake — it accounts for the fact that a player under pressure does not jump at the theoretical optimum, and for the coyote-time window during which the jump may fire slightly late.

The same principle applies elsewhere:

  • Corridor games. The vertical shift between consecutive gates is capped at the lesser of 30% of screen height or 55% of the gate spacing, so every gate is reachable from the previous one.
  • Maze games. A depth-first maze is fully connected by construction, which guarantees every cell — and therefore every token placed on one — is reachable.
  • Climbing games. Vertical platform gaps are capped at a distance the jump always clears, and horizontal placement accounts for the screen wrap.

Rule two: hazards must be telegraphed

A hazard the player cannot see before it hurts them is not difficulty; it is a coin flip with extra steps.

Telegraphing has a minimum duration, and it is set by human reaction time. A visual stimulus takes roughly a quarter of a second to produce a simple motor response, and rather longer if a decision is involved. At 390 units per second — Sushi Sprint's scroll speed — a quarter of a second is about 98 units of travel.

So a hazard must be visible at least that far ahead of the player, and preferably twice that to allow for the decision. In practice that means hazards enter from the screen edge and are never spawned inside the visible area.

Explicit telegraphs

For hazards that appear rather than approach — a burner igniting, a vent firing — an explicit telegraph is used: a pulsing dashed outline drawn for a fixed period before the hazard becomes dangerous. During the telegraph the hazard has no collision at all.

Silhouette is the fastest telegraph

At speed, colour is the slowest visual channel to process and shape is the fastest. Every hazard on this site has a distinct silhouette: crates are square, cones are triangular, whisks are radial, rocks are irregular polygons, flames have a flickering peak.

That also makes them distinguishable for colour-blind players without any special mode.

Rule three: nothing spawns on top of the player

A hazard that materialises where the player already is cannot be avoided, which violates the definition directly. Three mechanisms prevent it.

  1. Edge spawning. Arena hazards always enter from outside the play field — one of the four edges — and travel inward.
  2. Exclusion radius. Where a hazard must be placed inside the field, a clear radius is enforced around the player's position: 80 units for scatter placement, 140 units in challenge rounds. If the random position falls inside it, the position is reflected to the opposite corner.
  3. Post-hit separation. After a collision, the hazard is pushed 110 to 120 units away from the player. Without this, a hazard sitting on the respawn point takes two lives in a second.

Rule four: difficulty must be windowed, not sampled

Procedural level generators typically pick content at random from a library. If the library contains sections of widely varying difficulty, random sampling will occasionally produce a sequence that is far harder than the current intensity justifies.

The fix is to filter before sampling. Every chunk in the library is tagged with a demand value from 0 to 1. The generator filters to chunks whose demand is at most the current intensity plus about 0.22, then biases its selection toward the harder end of what remains.

That produces content that is consistently near the edge of what the player can handle, without ever going far past it. The small window above current intensity is deliberate: it keeps the game slightly ahead of the player, which is where the interesting part of a difficulty curve lives.

Rule five: forced rest sections

Even with windowing, a run of four maximum-demand chunks in sequence will defeat almost anyone. The generator therefore counts consecutive demanding chunks and forces a rest chunk — demand zero, flat ground, a food trail, no hazards — after four.

This has a second benefit beyond survival. A rest section is where the player can rebuild a combo chain, collect a saved risk placement or spend a power-up. Without it, a long run becomes uniformly tense, and uniform tension stops registering as tension at all.

Try it yourself: Food Jump Challenge

Land within a few pixels of a platform edge for a precision bonus — and a life back.

Play Food Jump Challenge

Rule six: collection must be generous

Collection is the verb the entire genre is built on. If it feels unreliable, no amount of good level design compensates.

Two decisions make it reliable. First, pickup detection is circular rather than rectangular — rectangles have corners, and a near-miss at a corner reads to the player as a hit the game refused to register.

Second, a deliberate margin is added on top of the combined radii, scaled by a difficulty forgiveness factor: 1.25 on Easy, 1.0 on Medium, 0.85 on Hard, 0.7 on Expert.

That second point is worth emphasising because it is how difficulty should scale. Easy is not merely slower; the collection itself is more generous. Making a game easier by only reducing speed produces a slow version of the same frustrations.

Rule seven: the failure message must be specific

When a run ends, the player should know why. "Game over" tells them nothing; "You ran into a hot pan" tells them what to avoid next time.

Every failure state on this site carries a specific reason string: You fell through a gap in the counter. A spinning whisk caught you mid-climb. The shift bell rang before the floor was clear. Your cone melted completely. The food monster caught you.

It is a small thing that costs almost nothing to implement and materially changes whether a player feels they were beaten or feels they were cheated.

What fairness does not require

Three things are frequently confused with fairness and are not part of it.

  • Fairness is not easiness. Food Jump Challenge defaults to Expert and is the hardest platformer on the site. It is also entirely fair — every gap is jumpable, every hazard is telegraphed, every platform edge is marked in gold.
  • Fairness is not the absence of randomness. Random content is fine as long as it is windowed, reachable and telegraphed. What is unfair is unbounded randomness.
  • Fairness is not the absence of difficulty spikes. A spike the player can see coming is a challenge. A spike they cannot is an ambush.

A fairness checklist

Before a game is published on this site, it is tested against these specific questions:

  1. Is every gap clearable at the current speed with the character's actual jump reach?
  2. Is every collectible reachable, or deliberately reachable only via a specific mechanic that the game teaches?
  3. Does every hazard become visible at least a quarter of a second of travel before it can hurt the player?
  4. Can any hazard spawn inside the exclusion radius around the player?
  5. Is the difficulty window capped, and is a rest section forced after a run of demanding content?
  6. Does the difficulty ramp have a ceiling, or does it rise indefinitely?
  7. Does pickup detection use a circular test with a difficulty-scaled margin?
  8. Does every failure produce a specific, accurate reason message?
  9. Is the run paused automatically when the browser tab is hidden?
  10. Is every mechanic that the level design relies on either taught or self-evident?

Ten questions, all of them answerable yes or no by inspection. That is the point: fairness needs to be testable, or it becomes a matter of opinion and therefore unenforceable.

Key takeaways

  • A level is fair when every failure has a cause the player could have identified beforehand. That is testable, not a matter of taste.
  • Reachability is arithmetic — compute the projectile range and size gaps at a fraction of it, with margin for imperfect timing.
  • Hazards need a quarter of a second of visible travel before they can hurt you, minimum, and distinct silhouettes rather than distinct colours.
  • Nothing spawns on top of the player: edge spawning, exclusion radii and post-hit separation between them cover every case.
  • Filter procedural content by a difficulty window before sampling, and force rest sections after a run of demanding chunks.
  • Make collection generous — circular detection with a difficulty-scaled margin, not a rectangle.
  • Specific failure messages cost nothing and change whether a player feels beaten or cheated.

Frequently Asked Questions

What makes an arcade level fair?

Every failure has a cause the player could have identified before it happened. That means reachable geometry, telegraphed hazards, no spawns on top of the player, windowed difficulty and specific failure messages.

Does fair mean easy?

No. Food Jump Challenge defaults to Expert and is entirely fair — every gap is jumpable, every hazard is telegraphed and the precision targets are painted on the platforms in gold.

How do you guarantee a gap is jumpable?

Compute the projectile range from jump speed, gravity and current horizontal speed, then size gaps at 62% of that figure. The margin covers imperfect timing and the coyote-time window.

How long does a hazard need to be visible?

At least a quarter of a second of travel before it can hurt you — about 98 units at Sushi Sprint's speed — and preferably twice that where a decision is involved rather than a reflex.

Is random level generation unfair?

Not inherently. Unbounded randomness is unfair; randomness filtered by a difficulty window, constrained by reachability and punctuated by forced rest sections is fine.

Why does difficulty change the pickup radius?

Because making a game easier by only reducing speed produces a slow version of the same frustrations. Easy gets a 25% larger pickup margin, which makes the core verb more reliable while you learn.