Skip to content

Hide a new code

Generate a hidden code and give the round two endings.

  • Sinclair ZX Spectrum
  • BASIC

Now turn the inspection program into a game. Hide a newly chosen code, open the lock as soon as the player finds it and close the round after ten misses.

Replace lines 200, 1020, 1070, 5100, 5220.

Add lines 210, 430, 5000, 5010.

changes.bas
 200 RANDOMIZE : DIM c(4)
 210 FOR i=1 TO 4: LET c(i)=INT (RND*6)+1: NEXT i
 430 IF bulls=4 THEN GO TO 5000
1020 PRINT AT 2,1; INK 7;"Digits 1-6. Repeats allowed."
1070 PRINT AT 21,1;"ENTER: check  R: new  Q: quit"
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.        "
5220 PRINT AT 20,1;"R: new code   Q: quit          "

RUN the changed program.

Complete source at this checkpoint
locksmith.bas
  10 BORDER 0: PAPER 0: INK 7: BRIGHT 1: CLS
 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 RETURN

The practice caption disappears. Each round has four digits from 1 to 6, with repeats allowed. The code remains unchanged while you guess. Four EXACT opens the lock; ten unsuccessful guesses leave it locked. Both endings reveal the answer and keep the history visible.

Choose each position separately

RND supplies a pseudo-random value from zero up to, but not including, one. Multiplying by six spreads it over the interval from zero to just below six. INT rounds down to 0–5, then adding one gives 1–6.

Line 210 performs that draw for each of the four positions. No test rejects duplicates, so codes such as 1111 and 6262 are allowed. There are six choices for each position: 6 * 6 * 6 * 6, or 1,296 possible codes.

RANDOMIZE without a number seeds the generator from the machine’s frame counter. It does not promise that every round differs from the last. The code is chosen at 200–210; the normal guess loop goes back to 230 and never chooses it again.

Why would returning to line 200 after every submitted guess break the deduction game?

Show the explanation

It would choose a new code and clear the round. Earlier clues would no longer describe the same answer. Deduction depends on a fixed secret until the round ends or the player asks for a new one.

Check success before the limit

After drawing the latest result, line 430 tests bulls. Four exact matches jump to the OPEN message. Only an unsuccessful guess reaches the ten-attempt test at 440. This order means a correct tenth guess wins.

The result routines join at 5200, which clears the advice row and reveals c. The result loop accepts R or Q; it does not let another guess overwrite the finished history. R during play also abandons that round and starts a new code at 200.

Try a round using the clues together. For a predictable limit check, submit 1111: if it opens, restart; otherwise repeat that same unsuccessful guess until attempt ten. The clues should remain identical and the round should end locked. Repetition still consumes an attempt. Then press R and check that the old rows and editable guess have cleared.

If the answer changes during a round, inspect the jumps to 200. If a correct tenth guess loses, inspect the order of 430 and 440. There is no time limit: the interesting pressure comes from choosing how to spend ten guesses.

Sources

Steven Vickers, edited by Robin Bradbeer, ZX Spectrum BASIC Programming, second edition (Sinclair Research, 1983), chapter 9, chapter 11. RND, INT and RANDOMIZE supply the four independent draws.

Run it here

This unit's program, built for you.

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

Download locksmith.tap