2 Tone Game: Crossword Design Notes

 

SPOILER WARNING

This page contains spoilers from the 2-Tone Game. If you haven't already played the game, you might want to do so before continuing reading this page.

2-Tone's Crossword is a variant crossword. In a normal crossword, white squares are for letters and black squares are for... uhm... the lack of letters. But in this variant, the crossword grid's words only contained letters from the words BLACK or WHITE. (E.g., THICK would be a fine word, but THIN would not because there's no "N" in BLACK or WHITE.)

The puzzle's darned tricky to solve because the clues have been altered: all letters from BLACK replaced by black rectangles; all letters from WHITE replaced by white rectangles.

Some teams solved this puzzle without figuring out the BLACK/WHITE thing, only having figured out that "some letters were squares" instead.

This puzzle changed a lot from its first draft. The gimmick stayed the same, but the contents changed plenty. Here's the first draft:

ROSS

1 "... don' snd _____'s n n suprnov." -Dougs dms

3 Prm Mnsr of Und ngdom from 1945 o 1951

5 nsn ompur from "2001"

6 "nd n o mysf... ____ _ ondrfu ord

7 g Sr srs mg dyd s y

8 r of jursdon, uory, or nfun

10 S on's um ou

13 s mor fs n vngr

14 os o n' do do

15 f "r" r Frn, s s o you oud sy

16 Mssg of 140 rrs or fr

17 Sr soy

DON

2 Fr ssod mry unforms

3 gd rmn's xus

4 rgur rrngmn of ngs; ofn grd

6 Popur s ords: "od my r nd _____ s."

8 n nsd y nsors

9 so or n xuonr

11 nun rs s

12 Prnng o, or usd y, o; suddn; rup

13 vr prson

If you solve that puzzle, you'll notice that most of the grid words are common words, not proper nouns. But in the final draft, most of the words are proper nouns. Why the change?

As you might guess, I chose puzzle words by running a simple computer program over a list of words. For the first draft, the best list of words I had was "pocket.txt", a list of common words I snagged from the NPL word lists a while back. This list was nice, since it had common words, things you could put into a puzzle without being too obscure. But it didn't have many proper nouns; those don't belong in a dictionary, after all.

Then I attended Game Control Summit 2010. Specificallly, I saw Dan Egnor's excellent talk Computer Using Computers for Puzzles. He listed puzzle-friendly word lists, including Wikipedia's list of article titles. Aha! Now I had another word list to crank through the computer. And soon I had a new list of words.

So the first batch of playtesters saw that first draft puzzle. Later batches of playtesters saw a grid pretty close to the final draft, though a couple of words changed.

The crossword clues changed plenty as a result of playtesting. E.g., the clue for CALTECH mentioned "D Dy". People saw that and wrote in DORIS DAY, though that wasn't right. (It was DITCH DAY, a Caltech tradition that's not exactly a puzzle hunt, but is in the neighborhood of such.) I watched one playtester pick up this puzzle after a teammate had partially filled it in. The teammate had written "DORIS DAY". This playtester was a Caltech grad, looked at that clue, spotted Caltechisms and said "Oh, this could be Caltech, except for Doris Day, hmm" and then proceeded to not fill in the grid with CALTECH. I lower-cased the "D"s in dITCH dAY, and later playtesters had a much easier time.

I was tweaking the clues pretty often, but doing so was error-prone. It's all very well to say "Replace all letters in WHITE with white rectangles" but's I kept making mistakes while doing so. I ended up writing a little script that read in a text file of plain-text clues and output HTML clues that would have rectangles in the right places.

So the text file looked something like this, easy to understand and edit:

ACROSS

1 American game with a batter but no pitcher

...
And then a little Python script for the formatting:
outfile = open("clues.html", "w")

for line in open("clues.txt"):
  line = line.strip()
  if not line:
      outfile.write("\n\n<p>")
      continue
  outtext = "<b>"
  firstword = True
  for c in line:
      if c in "blackBLACK": 
          outtext += '<img src="crossword_bk.png">'
          continue
      if c in "whiteWHITE": 
          outtext += '<img src="crossword_wh.png">'
          continue
      if c == " ":
          if firstword:
              outtext += "</b>"
              firstword = False
          outtext += "\n"
          continue
      outtext += c
  outfile.write(outtext)

(There's something very discouraging when your attempts to "fix" a puzzle themselves have errors. I ran playtests both days of a weekend. Ideally, I would fix Saturday's errors in time for Sunday's test... while kind of worn out from Saturday's playtest. I was in an error-prone state, and scripts like this helped me out a lot.)

Back