12 opponents A ladder of blunder rates — every card shows its own.
3 ways to play The computer, two chairs at this screen, or a friend on a link.
1 cannot lose LETHAL plays perfectly, 0% blunders — against him a draw is the win.
Choose an opponent, then New game
You — X
0:00
vs
Computer — O
0:00
Controls
Game
Engine
Clock
Board
Choose opponent

The engine

Engine

  • Minimax with alpha-beta pruning, full width, depth-limited per opponent
  • Win scores are depth-adjusted, so it takes the fastest win available and the longest loss — it will not dawdle over a mate it already has, or walk into one a move early
  • A small centre bonus breaks ties between otherwise equal moves

What separates the twelve

  • Tic-tac-toe is a solved game. A perfect player can never lose, so a ladder built only on search depth is a ladder where every rung plays the same. The twelve differ by a blunder rate: the chance of playing a random legal move instead of the best one
  • Every card shows its own rate. LETHAL is 0% and cannot be beaten — against it a draw is the win
  • Search depth still varies (4 to 6) and still matters in the opening, where a shallow search can miss a fork one ply past its horizon

The board

  • Three rules and nine cells: the grid is the gap between the cells, not a border on every third one
  • X and O are stroked SVG, so they hold their shape and weight at any size and draw themselves on
  • The winning three are marked on the board and struck through in the winner's own colour

Playing without a mouse

  • Tab to a cell, Enter or Space to play it. Arrow keys walk the grid
  • Escape closes the result overlay; the status line is announced as it changes

New in v5.1

  • Live match — two devices over the wire, invite by link or code, visitor links for spectators, the clock carried with the game

New in v5.0

  • Its own address at labs.llc/tictactoe/ — paper is the front door, the dark room is indexdark.html, the old URLs forward
  • Pass & play — two people, one screen, X and O taking turns holding it
  • Time controls sized for a nine-cell game: ∞, 10s, 30s, 1m per side, with the flag falling for whoever runs dry

Changed in v4.0

  • The nine visual themes are gone, and with them the runtime colour injection they needed — one palette, plain CSS, both editions
  • Undo used to call lastIndexOf on the board array, which finds the highest index holding a mark and not the last move played. There is a real move history now
  • The board was a checkerboard at 1.19:1; the marks were text with a five-layer glow; the winning line was never shown; the board could not be played from the keyboard
  • Preferences persist. Board colours are shared with chess and checkers