Reach a landing pad
Draw a pad and make alignment matter.
Continue with Make each burn count. The craft can land gently, but anywhere on the flat ground currently counts. Draw a pad and make alignment matter.
Add lines 210, 220, 230, 240, 250, 640, 730. Replace lines 60, 70, 80, 130, 160, 380, 390, 710, 720.
60 PRINT AT 6,2;"O / P: steer left / right"
70 PRINT AT 8,2;"Use one control key at a time."
80 PRINT AT 10,2;"Pad: ======== Safe: 0 to 12"
130 LET x=18: LET y=400: LET v=0: LET fuel=45: LET r=4: LET burn=0
160 PRINT AT 1,1;"O/P STEER SPACE THRUST Q QUIT"
210 LET nx=x
220 IF k$="o" THEN LET nx=nx-1
230 IF k$="p" THEN LET nx=nx+1
240 IF nx<1 THEN LET nx=1
250 IF nx>30 THEN LET nx=30
380 PRINT AT r,x;" ";AT nr,nx;a$
390 LET x=nx: LET y=ny: LET r=nr
640 FOR c=20 TO 27: PRINT PAPER 6;INK 0;AT 20,c;"=": NEXT c
710 LET m$="Off the pad."
720 IF x>=20 AND x<=27 THEN LET m$="Too fast for the pad."
730 IF x>=20 AND x<=27 AND v<=12 AND v>=0 THEN LET m$="Safe landing!"
A place to aim for
The practice pad covers columns 20 through 27, including both ends. It is eight cells wide, marked with = on yellow PAPER. The ground remains in row 20, so the vertical contact position stays 1900. The craft starts at column 18, just outside the pad, with its usual height, velocity and fuel.
Line 640 draws the same inclusive interval used by the result tests. The ordinary terrain is marked #; the pad is identifiable without its colour.
nx is the candidate horizontal position. It starts as x, then O subtracts one or P adds one. Lines 240 and 250 clamp it to columns 1–30, keeping a one-cell margin at each edge. The drawing statement uses the candidate column; only afterwards does line 390 store it in x.
Read one choice per update
This checkpoint uses one k$=INKEY$ reading for quitting, steering and thrust. Press O or P to move sideways, release it, then use Space to brake. There is no horizontal momentum: releasing a steering key stops sideways movement, while gravity still changes the vertical motion.
Try holding P and Space together. Ordinary INKEY$ reports a character when exactly one ordinary key is recognised; with multiple keys it cannot supply the independent states we need. The program has not learned to combine steering and thrust yet. Keep the one-key-at-a-time instruction for this version; we will replace that restriction next.
If we steer in one IF and test Space in another IF, why doesn’t that alone solve simultaneous control?
Show the explanation
Both tests still depend on the same single-character keyboard reading. Adding more comparisons cannot recover key states that INKEY$ did not report. We need a different way to read the controls.
Position and speed both matter
At contact, the result begins as Off the pad.. Being inside the pad interval changes it to a hard-pad message. Only an arrival in the pad interval and within the safe velocity interval changes it to success. AND requires all those conditions to hold.
A slow landing at column 19 is still off the pad; column 20 is its first valid position. At the other end, 27 is valid and 28 is not. Our craft is one cell wide. A wider drawing would need a different footprint rule, not just a more impressive picture.
Practise moving into the pad’s columns while high, then releasing the steering key and concentrating on braking. These one-key controls let you steer early, then concentrate on the descent. A missed attempt is a chance to change when you brake, not a test you must pass to continue.
For boundary experiments, prepare a nearly landed craft with the same low speed and change only its column. Compare 19, 20, 27 and 28. Restore the ordinary starting line before judging the approach itself.
Complete program for this step
10 BORDER 0: PAPER 0: INK 7: BRIGHT 1: CLS
50 PRINT AT 3,9;"TOUCHDOWN"
60 PRINT AT 6,2;"O / P: steer left / right"
70 PRINT AT 8,2;"Use one control key at a time."
80 PRINT AT 10,2;"Pad: ======== Safe: 0 to 12"
90 PRINT AT 12,2;"Empty tank? You still coast."
100 PRINT AT 15,2;"S launches. Q quits."
110 GO SUB 800: IF k$="q" THEN GO TO 850
120 CLS: GO SUB 600
130 LET x=18: LET y=400: LET v=0: LET fuel=45: LET r=4: LET burn=0
140 PRINT AT r,x;"A"
150 PRINT AT 0,1;"FUEL SPEED MAX 12"
160 PRINT AT 1,1;"O/P STEER SPACE THRUST Q QUIT"
200 LET k$=INKEY$: IF k$="q" THEN GO TO 850
210 LET nx=x
220 IF k$="o" THEN LET nx=nx-1
230 IF k$="p" THEN LET nx=nx+1
240 IF nx<1 THEN LET nx=1
250 IF nx>30 THEN LET nx=30
260 LET burn=0
270 IF k$=" " AND fuel>0 THEN LET burn=1: LET fuel=fuel-1
280 LET v=v+2-6*burn
290 IF v>60 THEN LET v=60
300 IF v<-30 THEN LET v=-30
310 LET ny=y+v: LET contact=0: LET limit=1900
330 IF ny>=limit THEN LET contact=1
340 IF contact=1 THEN LET ny=limit
350 IF ny<300 THEN LET ny=300: LET v=0
360 LET nr=INT (ny/100)
370 PRINT AT 0,6;fuel;" ";AT 0,19;v;" "
375 LET a$="A": IF burn=1 THEN LET a$="*"
380 PRINT AT r,x;" ";AT nr,nx;a$
390 LET x=nx: LET y=ny: LET r=nr
400 IF contact=1 THEN GO TO 700
410 PAUSE 2: GO TO 200
600 FOR c=0 TO 31
610 FOR j=20 TO 21: PRINT PAPER 4;INK 0;AT j,c;" ";: NEXT j
620 PRINT PAPER 4;INK 0;AT 20,c;"#"
630 NEXT c
640 FOR c=20 TO 27: PRINT PAPER 6;INK 0;AT 20,c;"=": NEXT c
650 RETURN
700 PRINT AT r,x;"A"
710 LET m$="Off the pad."
720 IF x>=20 AND x<=27 THEN LET m$="Too fast for the pad."
730 IF x>=20 AND x<=27 AND v<=12 AND v>=0 THEN LET m$="Safe landing!"
740 PRINT AT 2,1;m$;" "
770 PRINT AT 1,1;"R retries. Q quits. "
780 IF INKEY$<>"" THEN GO TO 780
790 LET k$=INKEY$: IF k$<>"r" AND k$<>"q" THEN GO TO 790
795 IF INKEY$<>"" THEN GO TO 795
796 IF k$="q" THEN GO TO 850
797 GO TO 120
800 IF INKEY$<>"" THEN GO TO 800
810 LET k$=INKEY$: IF k$<>"s" AND k$<>"q" THEN GO TO 810
820 IF INKEY$<>"" THEN GO TO 820
830 RETURN
850 IF INKEY$<>"" THEN GO TO 850
860 PAPER 0: INK 7: CLS: PRINT "Finished.": STOP
Sources
Steven Vickers, edited by Robin Bradbeer, ZX Spectrum BASIC Programming, second edition (Sinclair Research, 1983), chapters 3 and 13 (comparisons and compound conditions), chapters 15–16 (screen placement and colour), and chapter 18 (INKEY$).