Make each burn count
Change one thing: a burn now spends fuel.
Continue with Make another attempt. Keep the same gravity, thrust strength and landing test. Change one thing: a burn now spends fuel.
Add line 90. Replace lines 70, 130, 150, 270, 370.
70 PRINT AT 8,2;"Thrust uses fuel."
90 PRINT AT 12,2;"Empty tank? You still coast."
130 LET x=24: LET y=400: LET v=0: LET fuel=45: LET r=4: LET burn=0
150 PRINT AT 0,1;"FUEL SPEED MAX 12"
270 IF k$=" " AND fuel>0 THEN LET burn=1: LET fuel=fuel-1
370 PRINT AT 0,6;fuel;" ";AT 0,19;v;" "
Decide whether the engine actually fires
Line 130 adds fuel=45 to the starting assignments. The engine condition now needs both a Space reading and a positive reserve. As in the menu filters, AND combines those conditions: both must be true for the rest of that line to execute.
burn still starts at zero. An accepted burn sets it to 1 and subtracts one fuel unit. Velocity and the provisional flame both use that same flag. We do not read the keyboard again to decide what picture to show.
Consider one fuel unit remaining. The condition succeeds, sets burn=1, and changes fuel to zero. That last paid-for burn still changes velocity and shows the engine. On the following update, the fuel condition fails, so burn remains zero even if Space is held.
Why should the flame use burn rather than checking whether fuel is still greater than zero?
Show the explanation
The last valid burn spends the final unit. Fuel is then zero, but the engine fired during this update. The stored burn decision keeps movement, the counter and the picture in agreement.
Empty does not mean finished
Nothing here treats an empty tank as a collision. Gravity still changes velocity, position still changes, and contact still decides the outcome. A slow enough approach can coast onto the ground safely after its last burn.
The instrument row now reserves separate fields for fuel and velocity. The trailing spaces clear leftover digits when a value becomes shorter. The title explains that an empty tank still permits coasting. These changes give the player information about the rule rather than adding another penalty.
Hold Space for a whole attempt. Fuel should reach zero without becoming negative; after that the engine indicator must stop even though you keep holding the key. The craft eventually falls. Retry should restore all 45 units as well as position and velocity.
For a short boundary experiment, save your ordinary version, then change the starting values in line 130 to position 1899, velocity 0, fuel 0 and row 18. Run without thrust. Gravity changes velocity to 2 and proposes position 1901; contact clamps it to 1900, producing a safe coast. This is a deliberately prepared test, not a claimed successful approach from the normal start. Restore the original line afterwards.
Keep practising with the normal start. Using less fuel is useful only if the approach remains controllable. We have not added a fuel-efficiency score or changed the safe-speed limit.
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;"SPACE: brake your fall"
70 PRINT AT 8,2;"Thrust uses fuel."
80 PRINT AT 10,2;"Safe speed: 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=24: 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;"SPACE THRUST Q QUIT"
200 LET k$=INKEY$: IF k$="q" THEN GO TO 850
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,x;a$
390 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
650 RETURN
700 PRINT AT r,x;"A"
710 LET m$="Too fast!"
720 IF v>=0 THEN IF v<=12 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 (conditions and AND), and chapter 18 (input).