Play a free card-matching game in four grid sizes, from 12 to 36 cards. Your fewest moves and best time are saved per size, in your browser only.
Moves 0
Time 0:00
Pairs 0 / 8
Best moves -
Best time -
Flip two cards per turn. A matching pair stays face up; a mismatch turns back down after a moment. Arrow keys move between cards, Enter or Space flips the focused card, Home and End jump to the first and last card. Each card has a symbol and a colour, so a pair is never told apart by colour alone.
Each game picks the symbols it needs at random from a set of 18, puts two of each in a deck and shuffles it with a Fisher-Yates shuffle, which makes every ordering equally likely. The randomness comes from your browser's crypto generator, so there is no pattern to learn. One move is two flips. You cannot do better than one move per pair, and that takes luck.
As-is, no warranty. These apps are free under their listed license and run entirely in your browser. Use at your own risk — don't blame me if your PC catches fire, your dog runs away, or the math turns out wrong. Verify anything that actually matters. None of this is professional financial, medical, legal, or engineering advice.
Cards lie face down in a grid. On each turn you flip two. If they show the same symbol, the pair stays face up. If not, both turn back down after about 900 milliseconds, and you cannot flip anything else until they have. Find every pair in as few moves as you can.
One move is two flips. The fewest moves possible is one per pair, which you only get by luck. The timer starts on your first flip and pauses while the tab is hidden.
Pick a size from the Size menu:
| Size | Grid | Cards | Pairs |
|---|---|---|---|
| Small | 4 x 3 | 12 | 6 |
| Medium | 4 x 4 | 16 | 8 |
| Large | 5 x 4 | 20 | 10 |
| Huge | 6 x 6 | 36 | 18 |
Keyboard: Tab into the grid, then use the arrow keys to move between cards, Enter or Space to flip the focused card, and Home and End to jump to the first and last card. Only one card is in the Tab order at a time, so you do not have to tab through all 36.
Every symbol has its own colour, and each pair gets a card face tinted in that colour. Face-down cards have sky and violet stripes with a small diamond, and a matched pair gets a green ring and a tick. Colour is only a second cue. Each card also has a different shape, and its accessible name says “face down”, “face up” or “matched” along with the symbol, so the game never depends on colour alone.
The game is two small pieces: a deck builder and a state machine. Both are pure functions with no page code in them, which is what lets the test suite check the rules directly.
The deck. Each game picks the symbols it needs at random from a set of 18, puts two of each in a deck and shuffles it with a Fisher-Yates shuffle. That shuffle makes every ordering equally likely, provided the random numbers are uniform. In the browser they come from the crypto random generator rather than Math.random. The test suite feeds the shuffle thousands of seeded games and checks that each card position gets each symbol about equally often, and that the partner of a card is equally likely to be anywhere else in the grid. It is a sanity check, not a proof, but it would catch the usual shuffle mistakes.
The state machine. The game is always in one of three phases:
Each state is immutable. A flip returns a new state, or the very same object if the flip is not allowed: flipping a card that is already face up, flipping a matched card, flipping during resolving, or an index outside the grid. After the delay the page asks the machine to resolve, which turns the mismatched pair back down. Winning is simply “pairs found equals total pairs”.
The tests also play whole games: a player who knows the deck finishes in exactly one move per pair on every size, random play always finishes, and a player who remembers cards seen so far needs fewer moves on average than one who does not.
Nothing is uploaded and there is no account. Your fewest moves and your best time for each size are saved in your browser’s local storage under one key, as small numbers inside a small JSON object. The time is kept in whole seconds, rounded down the same way the clock on the page counts, so the saved time matches what the clock showed. They are updated only when you win a game, and only if the result beats the old one. Clearing site data removes them.
Everything runs locally in your browser.
For informational purposes only. Not financial, medical, or legal advice. You are solely responsible for how you use these tools.