Skip to content

Keep earlier clues

Give each guess a row and preserve the clues already earned.

  • Sinclair ZX Spectrum
  • BASIC

One clue is useful. Several clues together can eliminate possibilities that each clue leaves open. Give every submitted guess its own row so the player can compare them.

Replace lines 420, 1010, 1040.

Add lines 440, 450, 460, 5100, 5200, 5210, 5220, 5230, 5240, 5250, 5260, 5270, 5280.

changes.bas
 420 GO SUB 4000
 440 IF t=10 THEN GO TO 5100
 450 LET t=t+1: LET g$=""
 460 PRINT AT 18,2;"                            "
1010 PRINT AT 0,1; INK 5;"LOCKSMITH";AT 0,21; INK 7;"10 TRIES"
1040 FOR j=5 TO 14: PRINT AT j,1; INK 1;"-";AT j,7;". . . .";AT j,21;".";AT j,28;".": NEXT j
5100 PRINT AT 17,1; INK 6;"Ten practice guesses recorded. "
5200 PRINT AT 18,1;"                              ";AT 18,1; INK 7;"The code: ";
5210 FOR i=1 TO 4: PRINT c(i);: NEXT i
5220 PRINT AT 20,1;"R: clear board   Q: quit       "
5230 PRINT AT 21,1;"                              "
5240 GO SUB 9000
5250 LET k$=INKEY$: IF k$="" THEN GO TO 5250
5260 IF k$="r" OR k$="R" THEN GO TO 200
5270 IF k$="q" OR k$="Q" THEN GO TO 8000
5280 GO TO 5250

RUN the changed program.

Complete source at this checkpoint
locksmith.bas
  10 BORDER 0: PAPER 0: INK 7: BRIGHT 1: CLS
 200 DIM c(4): LET c(1)=1: LET c(2)=1: LET c(3)=2: LET c(4)=2
 220 LET t=1: LET g$="": GO SUB 1000
 230 GO SUB 9000
 240 GO SUB 2000
 250 LET k$=INKEY$: IF k$="" THEN GO TO 250
 260 IF k$="q" OR k$="Q" THEN GO TO 8000
 270 IF k$="r" OR k$="R" THEN GO TO 200
 280 IF k$=CHR$ 13 THEN GO TO 400
 290 IF k$="d" OR k$="D" OR k$=CHR$ 12 THEN GO TO 350
 300 IF k$<"1" OR k$>"6" THEN GO TO 230
 310 IF LEN g$=4 THEN GO TO 230
 320 LET g$=g$+k$: GO TO 230
 350 IF LEN g$>0 THEN LET g$=g$( TO LEN g$-1)
 360 GO TO 230
 400 IF LEN g$<>4 THEN PRINT AT 18,2; INK 6;"Enter four digits first.     ": GO TO 230
 410 GO SUB 3000
 420 GO SUB 4000
 440 IF t=10 THEN GO TO 5100
 450 LET t=t+1: LET g$=""
 460 PRINT AT 18,2;"                            "
 470 GO TO 230
1000 CLS
1010 PRINT AT 0,1; INK 5;"LOCKSMITH";AT 0,21; INK 7;"10 TRIES"
1020 PRINT AT 2,1; INK 7;"Practice code: 1122"
1030 PRINT AT 4,1; INK 5;"TRY";AT 4,7;"CODE";AT 4,19;"EXACT";AT 4,26;"OTHER"
1040 FOR j=5 TO 14: PRINT AT j,1; INK 1;"-";AT j,7;". . . .";AT j,21;".";AT j,28;".": NEXT j
1050 PRINT AT 16,1; INK 5;"------------------------------"
1060 PRINT AT 20,1; INK 7;"1-6: digits   D: erase"
1070 PRINT AT 21,1;"ENTER: check  R: clear Q: quit"
1080 RETURN
2000 PRINT AT 17,1; INK 5;"TRY ";t;" ";AT 17,7; INK 7;"_ _ _ _"
2010 FOR i=1 TO LEN g$: PRINT AT 17,5 +2 *i; PAPER 1; INK 7;g$(i): NEXT i
2020 RETURN
3000 DIM g(4): LET bulls=0: LET total=0
3010 FOR i=1 TO 4: LET g(i)=VAL g$(i): IF g(i)=c(i) THEN LET bulls=bulls+1
3020 NEXT i
3030 FOR d=1 TO 6
3040 LET cc=0: LET gc=0
3050 FOR i=1 TO 4
3060 IF c(i)=d THEN LET cc=cc+1
3070 IF g(i)=d THEN LET gc=gc+1
3080 NEXT i
3090 IF cc<=gc THEN LET total=total+cc
3100 IF gc<cc THEN LET total=total+gc
3110 NEXT d
3120 LET cows=total-bulls: RETURN
4000 PRINT AT 4 +t,1; INK 7;t
4010 FOR i=1 TO 4: PRINT AT 4 +t,5 +2 *i; PAPER 1; INK 7;g$(i): NEXT i
4020 PRINT AT 4 +t,21; INK 4;bulls;AT 4 +t,28; INK 6;cows
4030 RETURN
5100 PRINT AT 17,1; INK 6;"Ten practice guesses recorded. "
5200 PRINT AT 18,1;"                              ";AT 18,1; INK 7;"The code: ";
5210 FOR i=1 TO 4: PRINT c(i);: NEXT i
5220 PRINT AT 20,1;"R: clear board   Q: quit       "
5230 PRINT AT 21,1;"                              "
5240 GO SUB 9000
5250 LET k$=INKEY$: IF k$="" THEN GO TO 5250
5260 IF k$="r" OR k$="R" THEN GO TO 200
5270 IF k$="q" OR k$="Q" THEN GO TO 8000
5280 GO TO 5250
8000 PAPER 0: INK 7: BRIGHT 0: PRINT AT 21,1;"LOCKSMITH finished.           ": STOP
9000 IF INKEY$<>"" THEN GO TO 9000
9010 RETURN

The practice code is still 1122. This version records ten practice guesses, even if an earlier guess is correct. We are inspecting history before adding the final game’s winning rule.

Advance the attempt

The drawing routine already uses row 4 + t. It now gets a new t after every submission except the tenth. Attempts 1 through 10 occupy rows 5 through 14, leaving space above for headings and below for the editor.

Line 420 draws the completed guess first. Line 440 checks whether it was the tenth. Otherwise line 450 increases t and empties g$, ready for another guess. Line 460 removes any previous short-guess advice. The next visit to 2000 draws the new attempt number and four empty cells.

The board routine prepares all ten rows with a FOR j loop. Its variable differs from the digit loop’s i: each routine can describe the part of the drawing it is visiting.

Keep the evidence on screen

We have not created an array of old guesses. Their characters and clue counts remain where PRINT put them. Only the current code, editable guess and scoring values are needed for the next comparison.

This representation suits a fixed ten-row game. It also has a limit: after CLS, those earlier guesses are gone. A later feature that needed to analyse old guesses would need to store them explicitly. Reading coloured cells back from the display would make the drawing responsible for game data.

After submitting the third practice guess, which values change and which part of the picture must survive?

Show the explanation

t becomes 4 and g$ becomes empty. The scoring values will be recomputed on the next submission. The first three result rows must remain visible, including the third guess that was printed before g$ was cleared. The code c stays 1122.

Stop at the tenth row

After the tenth submission, the program prints its completion message and code, then waits in a separate loop at 5250. It accepts R to clear the board or Q to quit. The release gate prevents the finishing Enter press from carrying into that loop.

Submit 1122 early: 4 EXACT should appear, and another practice attempt should follow. Continue to ten guesses. The program should stop accepting digits without printing an eleventh row. R should erase the history and restore TRY 1 with the same practice code.

If all results overwrite the first row, check the increment at 450. If earlier clues disappear, check that the main loop returns to 230 rather than calling the CLS routine at 1000.

Sources

Steven Vickers, edited by Robin Bradbeer, ZX Spectrum BASIC Programming, second edition (Sinclair Research, 1983), chapter 4, chapter 15. FOR loops prepare the rows; PRINT AT places each submitted result. Retaining printed output is a choice in this program, not an extra history array.

Run it here

This unit's program, built for you.

Program
locksmith.tap
Machine
ZX Spectrum 48K (PAL)

Download locksmith.tap