Skip to content

Chessko · Difficulty

How Chessko's difficulty levels work: temperature, slips and Stockfish limits

A weak chess opponent is harder to build than a strong one. Making a program play badly in a way that feels human, without hanging its queen for no reason, takes deliberate design. Here is how each of Chessko's seven levels is made.

The seven levels

#NameBrainHow it is weakened
1JigglyJelly search, depth 4, 800 msWobble 340 cp, 45% slips
2WobblyJelly search, depth 4, 800 msWobble 210 cp, 28% slips
3BouncyJelly search, depth 4, 800 msWobble 120 cp, 14% slips
4SpringyJelly search, depth 4, 800 msWobble 55 cp, 5% slips
5BlobmasterJelly search, depth 4, 800 msNone: always the best move it finds
6GelatitanStockfish 19 (WASM), 700 msUCI_Elo 2000
7Set in StoneStockfish 19 (WASM), 1500 msNone: full strength

Levels 1 to 5 share the same search depth. What differs is how often, and how far, the engine steps away from the best move it found.

Wobble: sampling instead of always picking the best

After searching, the jelly engine has a score for each legal root move. At level 5 it plays the top one. At lower levels it samples: each move gets weight exp((score − best) / temperature), the weights are normalised, and a move is drawn at random. A move 100 centipawns worse than the best is barely less likely at a high temperature, and rare at a low one. The temperature is the “wobble” number in the table, in centipawns: bigger means a wilder spread of moves.

This is the same idea as temperature in language-model sampling, applied to chess moves. It makes the engine's mistakes graded (it is much more likely to play the second-best move than the fifth-best) instead of uniformly random.

Slips: deliberate blunders

Sampling alone makes mistakes small. Beginners also make occasional large ones, so each low level has a “slip” probability. On a slip, the engine picks at random from the moves that are worse than the best by more than 25 centipawns but less than 900, so it errs noticeably but does not throw the queen away. Level 1 slips in about 45% of moves, level 4 in about 5%.

Why the top levels use Stockfish

The jelly search is a small JavaScript engine with a 16-weight evaluation. It is meant to be beatable, and to wobble. To give stronger players something real to play against, the ladder changes engine above level 5 instead of stretching the same one: Stockfish limited by its own Elo limiter at level 6, unlimited at level 7. See Stockfish in the browser for how that works.

Adapting to you

Not knowing which level to pick is normal. The UCB1 bandit watches how well you play on the jelly levels and suggests a step up or down. It leaves the two Stockfish levels alone: they are fixed points on the ladder.

Ready? Play Chessko.

Quick answers

How does Chessko make the computer play worse?
On the lower levels it samples among the engine's candidate moves with a temperature, so it sometimes plays a slightly worse move, and it adds an occasional deliberate slip. The two Stockfish levels use Stockfish's own UCI_Elo limiter, or no limit at all.

More about Chessko