How it works
How we built chess bots that blunder like humans
6 rated bots from 400 to 2000, plus personalities. Here is how they decide what to play, and how we measure that they play like people.
Last updated
touch_appPlay a few opening moves: the bot answers from the human opening book, the same way it does in a game.
Measured: real players vs our bots, 400 to 2000
Bot figures: 120 positions from recent Chess.com games of oladev1, each bot choosing a move exactly as in the app, scored by a deeper Stockfish search (losses capped at 1000 per move). Real-player figures: the typical loss per move at each rating, from a trend fitted through 41 real Chess.com rapid players whose own recent games were measured the same way. Generated 2026-11-06.
- 9.2
- 400: bot blunders per 100 moves (real players ≈10.9)
- 5.8
- 800: bot blunders per 100 moves (real players ≈7.2)
- 5
- 1000: bot blunders per 100 moves (real players ≈6.4)
- 4.2
- 1200: bot blunders per 100 moves (real players ≈6.1)
- 4.2
- 1600: bot blunders per 100 moves (real players ≈3.8)
- 2.5
- 2000: bot blunders per 100 moves (real players ≈2.8)
Why a weakened engine feels wrong
The usual way to make a chess bot weaker is to limit Stockfish's strength setting. It works on paper, but it plays like a strong engine having a bad day: perfect moves, then a random-looking blunder nobody would ever play. Real club players make different mistakes. They miss your threat because they only looked one move ahead, they grab a pawn and lose a piece, they bring the queen out early. Our bots are built to make those mistakes.
How we measured this
Measured on 41 Chess.com players' public games, November 2026.
We picked random public Chess.com players rated 400 to 2000 and took their 5 most recent rapid games. Stockfish scored every move they played from move 5 on, comparing it with the best move, and we averaged the loss per move. We fitted a smooth trend through all the players so no single game sways a rating, then ran our bots through exactly the same measurement.
Correction: our first version used textbook reference values that overstated human mistakes; the bots are now tuned to these measured numbers.
Three knobs per rating
- Depth: how far ahead the bot looks. 2 moves at 800 (so it misses your threats), 6 at 1600.
- Temperature: how willing it is to pick a slightly worse move among the reasonable-looking ones. Lower ratings spread their choice more.
- Blunder chance: on a small share of moves, a real mistake: a plausible-looking move that loses between 1.5 and 7 pawns of value, never an absurd one.
A human opening book
In the first moves the bots don't calculate at all: they pick from what amateurs actually play, weighted by how often. Below 1000 the weights change, because beginners love the early queen attack and sometimes walk into Scholar's Mate. Here is what a bot plays as White after 1.e4 e5:
Natural moves over engine moves
Among moves of similar value, people choose the ones that look purposeful. Each candidate gets a small bonus or penalty before the bot chooses:
- captures (more for bigger pieces), checks and threats against a valuable piece: bonus;
- castling and developing a knight or bishop in the opening: bonus;
- central pawn moves early: bonus. Edge pawns, early rook lifts, king walks and moving a developed piece back home: penalty;
- below 1000, an early queen sortie gets a small bonus; above it, a penalty.
Stronger bots lean on these habits less and on calculation more, as strong players do.
Human think time
A bot that answers instantly every move feels like a machine. Ours take about a second for opening and obvious moves (a recapture, the only good move), two to six seconds when several moves are close in value, and speed up in faster time controls and when their clock runs low.
- 3s
- 800: average think, 10-minute game
- 3.8s
- 1200: average think, 10-minute game
- 4.2s
- 1600: average think, 10-minute game
- 4.1s
- 2000: average think, 10-minute game
An example game at 1200
- 1.e4
- e5
- 2.f4
- b6?
- 3.a3
- d5
- 4.Nf3
- Bg4
- 5.Be2
- exf4
- 6.Ng1?
- Nf6?
- 7.Bxg4
- dxe4
- 8.b4?
- h5
- 9.Bh3
- Qe7
- 10.Bc8?
- Kd8?
- 11.Bb7
- g6
- 12.c3
- Qe8
- 13.b5?
- a6?
- 14.Bxa8
- Qe6
- 15.h3
- Bd6
- 16.h4
- Ng4
- 17.Bb2?
- axb5??
- 18.Ne2
- c6
- 19.Nd4
- Qc4
- 20.Rh3
- Qc5
- 21.Ke2
- Ke8
- 22.d3
- Be5
- 23.Qb3?
- Rg8?
- 24.Qb4
- Ne3
- 25.Bb7?
- Nd5
- 26.Qxc5
- bxc5
- 27.Nf3??
- exf3+
- 28.Rxf3
- Kd8
- 29.Ba8
- Re8
- 30.Kf1
- Bh8
- 31.Nd2
- c4?
- 32.a4
- Ne3+
- 33.Kg1
- Re7
- 34.d4
- bxa4
- 35.d5?
- Kd7?
- 36.Ba3
- Nxd5
- 37.Rc1
- Ne3
- 38.g3
- Re5
- 39.Re1
- Bg7?
- 40.Kh1?
- Rd5
- 41.Rxf4
- g5?
- 42.Rxf7+
- Kd8
- 43.hxg5
- Ng4?
- 44.Be7+
- Ke8
- 45.Rxg7
- Rd3
- 46.Ba3+
- Ne3
- 47.Bc5
- a3
- 48.g6
- Kd8
- 49.Rg8+?
- Kd7
- 50.Kg1?
- h4
- *