10 REMark QL Racer by Tim Hartnell from ZX Computing Oct/Nov.1984
11 window #1,512,256,0,0:REMark I had to add this line, as otherwise the game fails with an "out of range" error when trying to set up the screen, as it was written assuming a different window configuration from the default. [JimG]
20 high_score=0
30 difficulty=21
40 REPeat cycle
50 initialise
60 REPeat race
70 increment_score
80 read_keyboard
90 erase_old_car
100 check_if_smash
110 IF smash=1 THEN EXIT race
120 place_new_car
130 BEEP 1000,RND(240 TO 250)
140 FOR delay=1 TO difficulty
150 END FOR delay
160 END REPeat race
170 REMark ---------------
180 REMark Smash sequence
190 FOR j=1 TO 70
200 AT car_down,car_across
210 INK RND(1 TO 7)
220 PRINT "*"
230 BEEP 10,RND(1 TO 20)
240 AT car_down,car_across
250 PRINT "+"
260 BEEP 10,RND(40 TO 70)
270 AT car_down,car_across
280 PRINT CHR$(254)
290 END FOR j
300 AT 0,0
310 STRIP 1:INK 7:PAPER 1
320 FLASH 1
330 PRINT "Your score is ";score
340 IF score>high_score THEN 
350 high_score=score
360 END IF 
370 AT 18,16
380 PAPER 2
390 PRINT "High score is ";high_score
400 FLASH 0
410 FOR y=1 TO 100
420 BEEP 50,y
430 BEEP 70,200-2*y
440 END FOR y
450 END REPeat cycle
460 REMark ---------------
470 DEFine PROCedure increment_score
480 score=score+1
490 AT 1,32
500 PRINT score
510 get$=DATE$
520 INK 7:PAPER 2
530 AT 9,5
540 PRINT get$(16 TO 20)
550 PAPER 0
560 END DEFine increment_score
570 REMark ---------------
580 DEFine PROCedure place_new_car
590 INK 6
600 AT car_down,car_across
610 PRINT car$
620 END DEFine place_new_car
630 REMark ---------------
640 DEFine PROCedure check_if_smash
650 smash=c(car_down,car_across)
660 END DEFine check_if_smash
670 REMark ---------------
680 DEFine PROCedure erase_old_car
690 AT erase_down,erase_across
700 PRINT " "
710 END DEFine erase_old_car
720 REMark ---------------
730 DEFine PROCedure read_keyboard
740 erase_across=car_across
750 erase_down=car_down
760 new$=INKEY$
770 IF new$="" THEN new$=old$
780 IF new$=CHR$(192) THEN 
790 car_across=car_across-1
800 car$=CHR$(188)
810 END IF 
820 IF new$=CHR$(200) THEN 
830 car_across=car_across+1
840 car$=CHR$(189)
850 END IF 
860 IF new$=CHR$(208) THEN 
870 car_down=car_down-1
880 car$=CHR$(190)
890 END IF 
900 IF new$=CHR$(216) THEN 
910 car_down=car_down+1
920 car$=CHR$(191)
930 END IF 
934 REMark I had to put this IF around line 940, otherwise the program would loop through increment_score indefinitely if a key other than an arrow key was pressed, with the 'car' stationary until an arrow key was pressed. [JimG]
935 IF new$=CHR$(192) OR new$=CHR$(200) OR new$=CHR$(208) OR new$=CHR$(216) THEN
940 old$=new$
945 END IF
950 END DEFine read_keyboard
960 REMark ---------------
970 DEFine PROCedure initialise
980 PAPER 0:INK 3:BORDER 4,2
990 CLS:CLS #0
1000 score=0
1010 IF difficulty>1 THEN difficulty=difficulty-1
1020 PAPER 7:INK 2
1030 AT 0,30:PRINT "Score:"
1040 AT 4,32:PRINT " ";difficulty;" "
1050 DIM a(233),b(233),c(20,30)
1060 REMark Build racetrack
1070 PAPER 6:INK 4
1080 CSIZE 2,0
1090 RESTORE 
1100 FOR j=1 TO 233
1110 READ a(j),b(j)
1120 c(a(j),b(j))=1
1130 AT a(j),b(j)
1140 PRINT CHR$(254)
1150 END FOR j
1160 PAPER 1
1170 FOR j=1 TO 29
1180 READ x,y
1190 AT x,y
1200 INK RND(2 TO 7)
1210 PRINT CHR$(253):BEEP 100,5*j
1220 END FOR j
1230 REMark Place car
1240 car_across=3:car_down=3
1250 erase_across=car_across
1260 erase_down=car_down
1270 old$=CHR$(200)
1280 smash=0
1290 PAPER 0:INK 6
1300 FOR y=1 TO 50:BEEP 100,y
1310 SDATE 1984,7,3,0,0,0
1320 END DEFine initialise
1330 REMark ---------------
1340 REMark Track data
1350 DATA 1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11
1360 DATA 1,20,1,21,1,22,1,23,1,24,1,25,1,26
1370 DATA 1,27,1,28,1,29
1380 DATA 2,2,2,3,2,4,2,11,2,12
1390 DATA 2,18,2,19,2,20,2,29,2,30
1400 DATA 3,1,3,2,3,12,3,16,3,17,3,18,3,30
1410 DATA 4,1,4,6,4,7,4,8,4,12,4,13
1420 DATA 4,16,4,23,4,24,4,25,4,26,4,30
1430 DATA 5,1,5,4,5,5,5,6,5,7,5,8,5,9
1440 DATA 5,13,5,14,5,15,5,16,5,21,5,22
1450 DATA 5,23,5,26,5,27,5,30
1460 DATA 6,1,6,4,6,9,6,19,6,20,6,21
1470 DATA 6,22,6,23,6,24,6,25,6,26,6,30
1480 DATA 7,1,7,4,7,9,7,10,7,19,7,20
1490 DATA 7,21,7,22,7,30
1500 DATA 8,1,8,4,8,10,8,11,8,12,8,13,8,14
1510 DATA 8,15,8,16,8,17,8,18,8,19
1520 DATA 8,20,8,28,8,29,8,30
1530 DATA 9,1,9,4,9,10,9,11,9,12,9,13
1540 DATA 9,14,9,15,9,16,9,17,9,18
1550 DATA 9,24,9,25,9,26,9,27,9,28,9,29
1560 DATA 10,1,10,4,10,11,10,18,10,19
1570 DATA 10,20,10,23,10,24
1580 DATA 11,1,11,4,11,5,11,6,11,7,11,8
1590 DATA 11,11,11,19,11,20,11,24,11,25
1600 DATA 11,26,11,27,11,28,11,29
1610 DATA 12,1,12,7,12,8,12,9,12,10,12,11
1620 DATA 12,14,12,15,12,19,12,20,12,21
1630 DATA 12,28,12,29
1640 DATA 13,1,13,10,13,11,13,14,13,15,13,16
1650 DATA 13,19,13,20,13,21,13,22
1660 DATA 13,29,13,30
1670 DATA 14,1,14,2,14,6,14,10,14,11
1680 DATA 14,15,14,16,14,19,14,20,14,22
1690 DATA 14,23,14,24,14,25,14,26,14,30
1700 DATA 15,2,15,4,15,5,15,6,15,7,15,10
1710 DATA 15,11,15,12,15,15,15,16
1720 DATA 15,20,15,21,15,22,15,23,15,24
1730 DATA 15,25,15,29,15,30
1740 DATA 16,2,16,3,16,4,16,7
1750 DATA 16,15,16,16,16,17,16,28,16,29
1760 DATA 17,7,17,8,17,14,17,15
1770 DATA 17,17,17,18,17,28
1780 DATA 18,8,18,9,18,10,18,11,18,12,18,13
1790 DATA 18,14,18,18,18,19,18,20
1800 DATA 18,21,18,22,18,23,18,24
1810 DATA 18,25,18,26,18,27,18,28
1820 DATA 14,21,7,7,9,5,6,5,9,8
1830 DATA 10,9,7,5,11,10,6,6
1840 DATA 9,6,5,25,6,8,9,7
1850 DATA 10,7,6,7,5,24,7,6
1860 DATA 7,8,11,9,8,5,10,10
1870 DATA 8,6,10,8,8,7,10,6
1880 DATA 8,8,8,9,10,5,9,9
