Keep the same program. This lesson changes how you read the traffic rather than adding another rule.
There are no numbered-line changes. Use the six-lane version from the previous lesson.
Complete source for the experiment
10 GO SUB 7000
100 DIM p(6): DIM d(6): DIM t(6): DIM v(6): DIM r(6): DIM a$(6,30): DIM b$(6,30)
110 LET x=7: LET y=8: LET steps=0: RESTORE 7100
120 FOR i=1 TO 6: READ p(i),d(i),v(i),r(i): LET t(i)=v(i): NEXT i
140 FOR i=1 TO 6: FOR j=0 TO 2: FOR k=0 TO 3
150 LET c=2 *p(i)+10 *j+k: LET c=c-30 *INT (c/30)+1
160 LET a$(i,c)=CHR$ (144 +k): LET b$(i,c)=CHR$ (148 +k)
170 NEXT k: NEXT j: NEXT i
180 GO SUB 1000: GO SUB 3000: LET dx=0: LET dy=0: LET tick=PEEK 23672
200 LET k$=INKEY$
220 IF k$="q" OR k$="Q" THEN GO TO 9000
230 IF k$="r" OR k$="R" THEN GO TO 100
280 LET elapsed=PEEK 23672 -tick: IF elapsed<0 THEN LET elapsed=elapsed+256
290 IF elapsed<32 THEN GO TO 200
291 LET k$=INKEY$
292 LET dx=0: LET dy=0
293 IF k$="q" OR k$="Q" THEN GO TO 9000
294 IF k$="r" OR k$="R" THEN GO TO 100
295 IF k$="i" OR k$="I" THEN LET dy=-1
296 IF k$="k" OR k$="K" THEN LET dy=1
297 IF k$="j" OR k$="J" THEN LET dx=-1
298 IF k$="l" OR k$="L" THEN LET dx=1
300 LET tick=PEEK 23672: LET nx=x+dx: LET ny=y+dy
310 IF nx<0 OR nx>14 OR ny<0 OR ny>8 THEN LET nx=x: LET ny=y
320 GO SUB 2000
330 IF hit=1 THEN LET e$="That gap was not clear.": GO TO 4000
340 IF nx=x AND ny=y THEN GO TO 350
341 GO SUB 3100: LET x=nx: LET y=ny: GO SUB 3000
350 FOR i=1 TO 6: LET t(i)=t(i)-1
360 IF t(i)>0 THEN GO TO 430
370 LET t(i)=v(i): LET p(i)=p(i)+d(i)
380 IF p(i)=15 THEN LET p(i)=0
390 IF p(i)=-1 THEN LET p(i)=14
400 IF d(i)=1 THEN LET a$(i)=a$(i,29 TO 30)+a$(i,1 TO 28): LET b$(i)=b$(i,29 TO 30)+b$(i,1 TO 28)
410 IF d(i)=-1 THEN LET a$(i)=a$(i,3 TO 30)+a$(i,1 TO 2): LET b$(i)=b$(i,3 TO 30)+b$(i,1 TO 2)
420 GO SUB 1200: IF y=r(i) THEN GO SUB 3000
430 NEXT i
440 GO SUB 2000: LET steps=steps+1
450 IF hit=1 THEN LET e$="The lane caught you.": GO TO 4000
460 IF x=7 AND y=0 THEN LET e$="Across! A well-timed journey.": GO TO 4000
470 LET dx=0: LET dy=0: GO TO 200
1000 BORDER 0: PAPER 0: INK 7: CLS
1010 PRINT AT 0,1; INK 5;"QUICKSTEP";AT 0,21; INK 4;"EXIT ABOVE"
1030 FOR j=0 TO 8 STEP 4
1040 PRINT AT 2+2*j,1; PAPER 1; INK 5;s$;AT 3+2*j,1;s$
1060 NEXT j
1070 PRINT AT 2,15; PAPER 4; INK 7;" ";AT 3,15;" "
1080 FOR i=1 TO 6: GO SUB 1200: LET z$=">": IF d(i)=-1 THEN LET z$="<"
1081 PRINT AT row,0; PAPER 0; INK colour;z$;AT row,31;z$
1082 NEXT i
1090 PRINT AT 20,2; PAPER 0; INK 7;"I up J left K down L right"
1110 PRINT AT 21,2; INK 7;"R retry Q quit";
1120 RETURN
1200 LET row=2 +2 *r(i): LET colour=6: IF d(i)=-1 THEN LET colour=5
1210 PRINT AT row,1; PAPER 0; INK colour;a$(i);AT row+1,1;b$(i)
1240 RETURN
2000 LET hit=0: IF ny=0 OR ny=4 OR ny=8 THEN RETURN
2010 LET lane=ny: IF ny>4 THEN LET lane=ny-1
2015 LET delta=nx-p(lane): LET delta=delta-5 *INT (delta/5)
2020 IF delta<2 THEN LET hit=1
2030 RETURN
3000 LET shade=0: IF y=0 OR y=4 OR y=8 THEN LET shade=1
3010 IF y=0 AND x=7 THEN LET shade=4
3020 PRINT AT 2+2*y,1+2*x; PAPER shade; INK 7;h$;AT 3+2*y,1+2*x;f$
3030 RETURN
3100 IF y<>0 AND y<>4 AND y<>8 THEN PRINT AT 2+2*y,1+2*x; PAPER 0;" ";AT 3+2*y,1+2*x;" ": RETURN
3110 PRINT AT 2+2*y,1+2*x; PAPER 1; INK 5;g$;AT 3+2*y,1+2*x;g$: RETURN
4000 PRINT AT 1,1; PAPER 0; INK 6;e$
4010 PRINT AT 20,2; PAPER 0; INK 7;"R plays again. Q quits. "
4020 IF INKEY$<>"" THEN GO TO 4020
4030 LET k$=INKEY$
4040 IF k$="q" OR k$="Q" THEN GO TO 9000
4050 IF k$="r" OR k$="R" THEN GO TO 100
4060 GO TO 4030
7000 RESTORE 7200: FOR j=0 TO 103: READ n: POKE USR "a"+j,n: NEXT j
7010 LET h$=CHR$ 152 +CHR$ 153: LET f$=CHR$ 154 +CHR$ 155
7020 LET g$=CHR$ 156 +CHR$ 156: LET s$="": FOR j=1 TO 15: LET s$=s$+g$: NEXT j: RETURN
7100 DATA 0,1,3,1,9,-1,4,2,11,1,2,3
7110 DATA 7,-1,3,5,1,1,4,6,10,-1,2,7
7200 DATA 0,0,63,127,120,120,120,120
7210 DATA 0,0,255,255,24,24,24,24
7220 DATA 0,0,255,255,24,24,24,24
7230 DATA 0,0,252,254,30,30,30,30
7240 DATA 127,127,127,127,63,7,7,0
7250 DATA 255,255,255,255,255,192,192,0
7260 DATA 255,255,255,255,255,3,3,0
7270 DATA 254,254,254,254,252,224,224,0
7280 DATA 0,7,15,13,15,7,3,31
7290 DATA 0,224,240,176,240,224,192,248
7300 DATA 63,55,7,7,6,6,14,0
7310 DATA 252,236,224,224,96,96,112,0
7320 DATA 0,0,0,0,0,16,0,0
9000 PAPER 0: INK 7: PRINT AT 21,0;"Finished. RUN to try again. ";: STOPReach the central strip and stop there for a moment. Look at the next two lanes together. A gap that admits one move may place you where the following move is blocked and waiting is dangerous.
Trace a safe wait
The following state occurred during a complete crossing. The player is at (9,4), on the central strip. Each row below lists all six lane values in top-to-bottom order.
| Moment | Phases p(1)..p(6) | Countdowns t(1)..t(6) | Player |
|---|---|---|---|
| Before waiting | 3, 7, 0, 4, 3, 6 | 3, 3, 1, 3, 3, 1 | (9,4) |
| After waiting | 3, 7, 1, 4, 3, 5 | 2, 2, 2, 2, 2, 2 | (9,4) |
| After moving up | 3, 7, 1, 4, 3, 5 | 1, 1, 1, 1, 1, 1 | (9,3) |
On the waiting update, only lanes 3 and 6 are due. They move in opposite directions. The player is on a safe row, so neither contact query can fail.
On the next update, moving up proposes (9,3). That is lane 3, now at phase 1. Its occupied cells are 1,2,6,7,11,12; cell 9 is clear. No lane is due to move on this update, so the second query also passes.
Waiting has changed the traffic without changing the player’s position. It gives a different next decision, not automatic protection for every later step.
The same action inside a lane
Here is another observed sequence. Focus on the bottom lane, whose row is 7, direction is left and period is 2. The other lanes cannot hit a player in this row.
| Moment | Bottom-lane phase | Countdown | Player |
|---|---|---|---|
| Before moving right | 9 | 2 | (7,7) |
| After moving right | 9 | 1 | (8,7) |
| After waiting | 8 | 2 | (8,7), caught |
Moving right succeeds: phase 9 occupies 9,10,14,0,4,5, leaving cell 8 empty. The countdown falls to one, so traffic stays put. On the following update, a wait passes the first query, then traffic moves left to phase 8. Cell 8 becomes occupied and the second query ends the attempt.
In the second example, would moving right again be a way to escape instead of waiting?
Show the explanation
No. The destination would be cell 9, which is already occupied before traffic advances. The first query would reject it. Moving up, left or down needs its own checks; this example does not establish that every escape route is blocked.
Make a prediction you can test
Use R to restore a known opening. Choose a route to the central strip and try to repeat it, paying attention to the traffic rather than only the number of key presses. Real time continues between commands, and this version still misses some short taps, so manual attempts need not reproduce identical update counts.
Before leaving the strip, say which cell you intend to enter, which lane it belongs to, and whether that lane is about to move. Then name a possible next step. If you lose, distinguish entering an occupied cell from traffic arriving afterwards: the two result messages tell you which query failed.
These tables are traces from keyboard-driven runs of this program. They are not starting values to POKE into a live game. They let you reason about a complete stated position without requiring precisely timed manual replay.
The important change is the size of the decision. “Can I enter this gap?” remains necessary, but “What can I do after entering it?” helps explain the fuller crossing.
Run it here
This unit's program, built for you.
- Program
- quickstep.tap
- Machine
- ZX Spectrum 48K (PAL)