Keep a tape that starts Locksmith from its title. Then load it in a fresh Spectrum session and check the whole game. There are no numbered-line changes in this lesson.
Complete source at this checkpoint
10 BORDER 0: PAPER 0: INK 7: BRIGHT 1: CLS
20 PRINT AT 3,7; INK 5;"L O C K S M I T H"
30 PRINT AT 5,5; INK 6;"+--------------------+"
40 PRINT AT 6,5; INK 6;"+ ? ? ? ? +"
50 PRINT AT 7,5; INK 6;"+--------------------+"
60 PRINT AT 10,2; INK 7;"Four digits. Each from 1 to 6."
70 PRINT AT 11,2;"Digits may repeat. Ten tries."
80 PRINT AT 13,2; INK 4;"EXACT: right digit and place"
90 PRINT AT 14,2; INK 6;"OTHER: right digit elsewhere"
100 PRINT AT 16,2; INK 7;"Each digit counts only once."
110 PRINT AT 19,6; INK 5;"S starts. Q quits."
120 GO SUB 9000
130 LET k$=INKEY$: IF k$="" THEN GO TO 130
140 IF k$="q" OR k$="Q" THEN GO TO 8000
150 IF k$<>"s" AND k$<>"S" THEN GO TO 130
200 RANDOMIZE : DIM c(4)
210 FOR i=1 TO 4: LET c(i)=INT (RND*6)+1: NEXT i
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
430 IF bulls=4 THEN GO TO 5000
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;"Digits 1-6. Repeats allowed."
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: new 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
5000 PRINT AT 17,1; INK 4;"OPEN! Attempts used: ";t;" "
5010 GO TO 5200
5100 PRINT AT 17,1; INK 6;"LOCKED. Ten tries used. "
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: new code 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 RETURNSave the program
Quit with Q and prepare your emulator’s tape recording controls. Enter this command without a line number:
SAVE "locksmith" LINE 10The name identifies the program; LINE 10 supplies the starting point when it loads. Follow Keep a copy outside the Spectrum for recording and exporting the tape file.
A BASIC program save can include its variables, but this starting point deliberately creates a new game. It is not a way to resume an unfinished deduction. An emulator save state has a different purpose: it preserves the machine session.
Load and play from the beginning
Open a fresh 48K Spectrum session, attach the exported tape and start playback with the emulator’s controls. Enter:
LOAD "locksmith"The title should appear after loading. Start with S and enter a guess. Check deletion and a short submission, finish a round, then use R to begin again. The old history should disappear. Quit with Q and use RUN to return to the title.
If the loader keeps waiting, check the attached tape, playback and program name. If the listing loads without starting, check whether you saved it with LINE 10. RUN will start a correctly loaded program, but repeat the save and fresh-load check to verify the automatic start too.
The tape loads and the title appears. Have we also checked that replay clears the old clues?
Show the explanation
No. Automatic loading checks the entry point. Starting, playing and replaying exercise later paths. A finished game needs those paths to agree about what belongs to a round: a fresh code, attempt 1, an empty editable guess and a cleared history.
Explain one clue
Choose a submitted guess and explain its result after the code is revealed. First compare the four positions. Then count each digit on both sides, add the smaller counts and subtract the exact matches. EXACT plus OTHER must never exceed four.
You can now follow the whole journey: a key becomes a character, four characters become numeric values, two counts become a clue, and several clues become evidence for a decision. Keep the working tape so any experiment starts from a game you can recover.
Sources
Steven Vickers, edited by Robin Bradbeer, ZX Spectrum BASIC Programming, second edition (Sinclair Research, 1983), chapter 20. Program tape files and SAVE LINE provide the fresh-start path checked here.
Run it here
This unit's program, built for you.
- Program
- locksmith.tap
- Machine
- ZX Spectrum 48K (PAL)