Combinatorial Game Theory

About

Who wins, and by how much. What this site is for, how every value on it is computed, and why several of the figures will beat the reader.

This is a growing collection of illustrated essays about two-player games with no chance and no hidden information. Each one takes a single idea and draws it until the argument is visible — and where the argument is about a position, computes what that position is worth.

What this is not

It is not a book of puzzles, and it is not a guide to winning at anything in particular. There is no "how to always win at Nim" here, because that is one trick and the internet has it several thousand times over. An essay exists because there is a figure that explains something better than a paragraph can, and if there is no such figure there is no essay.

It is also not about the other game theory. Prisoner's dilemmas, Nash equilibria, auctions and mixed strategies are a different subject with an unfortunate name collision. Everything here is combinatorial: perfect information, no randomness, and players who move alternately until one of them cannot.

The values are computed, not quoted

Every illustration is generated as SVG at build time by code in this repository, and every value on it comes out of lib/cgt.js rather than out of a table. The recursion is the definition — a game is its options — and everything else follows from it.

A generator that would label a figure with a value it does not have throws, and the build stops. That is not a formality: the Hackenbush figures compute each string's value twice — once by the game recursion, once by reading the string as a binary numeral — and refuse to render if the two disagree.

Some figures will beat you

This is the site's way of showing its working, and it is a stronger form of it than usual. Where a figure carries a position, it names the winner before anybody moves. Then it lets a reader try.

The replies are not searched for at click time and they are not heuristic. Every reachable position and its correct answer were computed at build time from the same theory the essay is about, so a reader who beats one of these figures has found an error in a theorem rather than in an opponent. That is a much stronger claim than a game that merely plays well, and it is available only because these games are small enough to be solved completely.

The rule is the one the sibling sites' sound and printable patterns follow: play corroborates, it never carries. The position, its value and the outcome are in the server-rendered figure, so a reader with no JavaScript, or no interest in playing, loses nothing but the chance to test it.

Where the theory stops

It stops in three places, and they break different things — which is worth separating rather than lumping together as difficulty.

Misère play, where the player who cannot move wins, leaves the games untouched and destroys nearly all the machinery for evaluating them. Loops break the induction the whole recursion rests on, and introduce an outcome that normal-play theory has no name for. Complexity leaves every theorem true and puts the answers out of reach: deciding the winner of a generalised board game is PSPACE-complete, and an exact evaluator runs out after a few dozen moves.

Where a figure relies on a position being small, the essay says so. Nothing here claims to evaluate a position the code cannot actually evaluate.

On being wrong

Corrections are welcome and will be made. A value that is elegant and wrong is worse than none, because somebody will act on it — and on this site, somebody can play against it and find out.