Feedback and another round
Add readable colours, short sounds and a choice to play again.
Lucky Number now has a secret worth finding. We’ll give its clues a clear visual setting, add brief sounds and let the player choose another round.
Continue with Choose a new secret. A fresh entry can use the complete first listing below; the preceding lessons explain the guessing and validation code. Use Host Keyboard mode in the same 48K setup.
Make the words easy to read
Add lines 6, 7, 8 and 9:
5 RANDOMIZE
6 BORDER 0
7 PAPER 0
8 INK 7
9 CLS
10 LET secret=INT (RND*10)+1
15 LET tries=0
20 PRINT "Guess a whole number 1 to 10"
30 INPUT "Your guess ";g
31 IF g<1 THEN GO TO 100
32 IF g>10 THEN GO TO 100
33 IF g<>INT g THEN GO TO 100
35 CLS
36 LET tries=tries+1
40 IF g=secret THEN PRINT "Correct!"
50 IF g<secret THEN PRINT "Too low"
60 IF g>secret THEN PRINT "Too high"
70 IF g<>secret THEN GO TO 30
80 PRINT "Guesses: ";tries
90 STOP
100 CLS
110 PRINT "Whole number from 1 to 10"
120 GO TO 30
BORDER 0 makes the surrounding border black. PAPER 0 selects black for the
background of characters; INK 7 selects white for their foreground. CLS then
clears the main display using the new paper colour. Changing PAPER alone does
not repaint every existing character cell.
Enter BORDER with B after a line number. For PAPER, press and release
Shift+left Option/Alt, then press left Option/Alt+C. For INK, use the
same extended-mode chord followed by left Option/Alt+X. Release the keys
between chords. CLS is V after the line number.
Black and white provide a clear starting contrast. The ordinary colour numbers
are 0 black, 1 blue, 2 red, 3 magenta, 4 green, 5 cyan, 6 yellow and 7 white.
Try INK 6 in line 8, compare the readability, then restore 7. The player still
receives words for every clue; remembering a colour is not part of the rules.
Let the clue sound as well
Add lines 41, 51 and 61:
5 RANDOMIZE
6 BORDER 0
7 PAPER 0
8 INK 7
9 CLS
10 LET secret=INT (RND*10)+1
15 LET tries=0
20 PRINT "Guess a whole number 1 to 10"
30 INPUT "Your guess ";g
31 IF g<1 THEN GO TO 100
32 IF g>10 THEN GO TO 100
33 IF g<>INT g THEN GO TO 100
35 CLS
36 LET tries=tries+1
40 IF g=secret THEN PRINT "Correct!"
41 IF g=secret THEN BEEP 0.1,12
50 IF g<secret THEN PRINT "Too low"
51 IF g<secret THEN BEEP 0.1,0
60 IF g>secret THEN PRINT "Too high"
61 IF g>secret THEN BEEP 0.1,-12
70 IF g<>secret THEN GO TO 30
80 PRINT "Guesses: ";tries
90 STOP
100 CLS
110 PRINT "Whole number from 1 to 10"
120 GO TO 30
BEEP takes two values separated by a comma: duration in seconds, then pitch
in semitones above middle C. Negative pitches are below middle C. Our notes last
one tenth of a second. The too-low clue plays middle C, the too-high clue an
octave below it, and success an octave above it. Think of the wrong-guess sounds
as suggestions to move up or down, alongside the written clues.
After THEN, enter extended mode with Shift+left Option/Alt, release it,
then use left Option/Alt+Z for BEEP. Type 0.1,0, 0.1,-12 or 0.1,12
as shown. A pitch number is not a volume setting.
For a listening test, temporarily use secret 7 in line 10 and guess 4, 9, 7. Expect three short notes with the success note highest. Restore the random line. Repeat with host audio muted: the words must still give all the information. If there is no sound, check the host volume and emulator audio before changing the guessing logic.
BASIC waits while each BEEP plays. A long note would delay the next input;
our short notes acknowledge the result without adding a long pause. This is a
design cost of the sound, not just a choice of tune.
Offer another round
Add lines 81–84. Keep line 90 and the validation handler at 100–120:
5 RANDOMIZE
6 BORDER 0
7 PAPER 0
8 INK 7
9 CLS
10 LET secret=INT (RND*10)+1
15 LET tries=0
20 PRINT "Guess a whole number 1 to 10"
30 INPUT "Your guess ";g
31 IF g<1 THEN GO TO 100
32 IF g>10 THEN GO TO 100
33 IF g<>INT g THEN GO TO 100
35 CLS
36 LET tries=tries+1
40 IF g=secret THEN PRINT "Correct!"
41 IF g=secret THEN BEEP 0.1,12
50 IF g<secret THEN PRINT "Too low"
51 IF g<secret THEN BEEP 0.1,0
60 IF g>secret THEN PRINT "Too high"
61 IF g>secret THEN BEEP 0.1,-12
70 IF g<>secret THEN GO TO 30
80 PRINT "Guesses: ";tries
81 INPUT "Again? y or n ";a$
82 IF a$="y" THEN GO TO 9
83 IF a$="n" THEN GO TO 90
84 GO TO 81
90 STOP
100 CLS
110 PRINT "Whole number from 1 to 10"
120 GO TO 30
INPUT stores the reply in a$, a string variable. Line 82 accepts lower-case
y; line 83 accepts lower-case n. Any other answer reaches line 84 and repeats
the prompt. It does not print another upper-screen message, so repeated invalid
replies do not fill the screen or hide the final count.
GO TO 9 clears the previous result, chooses the next secret at line 10 and
resets tries at line 15. It leaves the colour setup and the original seeding
alone. The next random value comes from the existing sequence.
Why would returning to line 30 make a poor new round?
It would keep the same secret and the old count. Line 30 is the next guess within a round; line 9 is the start of a new round. Both are loops, but they repeat different amounts of work.
Play two rounds. Try an invalid replay answer, then y, then finish the second
round and answer n. Expect a fresh count in round two and a 9 STOP report
on exit. That report is our deliberate stop, not a crash. Try a correct first
guess in a labelled fixed-secret test: its count should be 1 in both rounds.

Save with SAVE "lucky", then use Emu198x’s tape export as described in
Remember a name; keep the program.
Reopen the saved tape in a fresh emulator and check a round. Give someone the
game without extra spoken instructions: can they find the range, interpret a
clue and leave when they have finished? Use that observation to improve the
wording. Lucky Number is now a complete small game.
Next, Choose an answer begins a new program.
Sources
Steven Vickers, edited by Robin Bradbeer, ZX Spectrum BASIC Programming, second edition (Sinclair Research, 1983), chapter 16, “Colours”, pp. 111–116; chapter 19, “BEEP”, pp. 133–138; chapters 2 and 3 for INPUT, comparisons and GO TO.