Columns

Three jewels fall as one column. You cannot rotate it — you cycle the order of the three gems inside it, and that single move is the whole puzzle. Match three of a kind across, down or on either diagonal.

The download is a folder of plain files with three.js already inside, so it runs offline. Browsers block ES modules on file://, so serve it rather than opening index.html directly: python3 -m http.server inside the folder, then open localhost:8000.

Engine
three.js r183
Assets
All cut in code
Build step
None
Download
199 KB zip
Well
6 × 13

The one move you have

Tetris gives you rotation. Columns gives you something stranger and, once it clicks, better: the piece is always a vertical column of three, and the only thing you can change is which gem is on top. Cycling shifts all three round.

That constraint is what makes the game. You are not fitting shapes together, you are choosing which of three jewels to leave at the bottom of a column — and the other two are going to land on top of it whether they help or not.

Chains are where the points are

Clearing three jewels is worth very little. What is worth something is clearing three so that what falls into the gap makes another three, and that makes another. Each link multiplies the whole score, so a four-link cascade is worth far more than four separate clears.

It changes how you play almost immediately. The greedy move — take the match in front of you — is usually the wrong one. You end up deliberately stacking near-misses and waiting for the jewel that collapses the lot.

Telling the jewels apart

Each of the six gems has its own cut as well as its own colour: an octahedron for the ruby, an emerald cut for the topaz, a trillion for the citrine, a brilliant for the emerald, a cushion for the sapphire, a hexagon for the amethyst.

That is not only decoration. A matching puzzle that signals only in colour is unplayable for a good number of people, and roughly one man in twelve has some form of colour blindness. Distinct silhouettes mean the board can be read by shape alone — and it reads faster for everyone else too.

Controls

KeyAction
Move the falling column
or SpaceCycle the three jewels
Drop faster
EnterDrop all the way
P / MPause / sound

There is an on-screen pad as well, so it plays on a phone.

Where Columns came from

Columns was written in 1989 by Jay Geertsen, an engineer at Hewlett-Packard, and released for the Macintosh. Sega licensed it, put it in arcades in 1990, and then shipped it on the Mega Drive, Master System and Game Gear — where, as the Game Gear's pack-in title, it reached far more people than the original ever did.

The flashing magic jewel, which takes every gem of whatever colour it lands on, came with Sega's version rather than the original. It is in this one because a game this tight benefits from one piece that can rescue a bad board.

How it's put together

  • src/board.js — the rules: matching, gravity, chains, scoring. Deliberately contains no three.js at all, which means it can be tested on its own.
  • src/gems.js — the six cuts and their materials
  • src/audio.js — every sound, synthesised through WebAudio
  • src/main.js — the well, the falling piece, clear animations, input and HUD

Keeping the rules separate from the rendering is the only structural decision here that really mattered. Match detection across four directions, with runs that overlap and cascades that have to settle before the next check, is the part that is easy to get subtly wrong — and it is far easier to be sure about when it is a grid of small integers you can test at a command line, with no browser anywhere near it.

Running it yourself

ES modules need to be served over HTTP rather than opened from disk:

python3 -m http.server 8137

Then open http://localhost:8137.