10 REM ASCII SNAKE FAST INLINE ONE-BYTE VIDEO FOR MICROBEE 32K
20 REM KEYS A UP Z DOWN < LEFT > RIGHT - PREMIUM ARROWS OR JOY
30 REM LOAD ASCII THEN SAVE "SNAKE" TO CREATE SNAKE.MWB
40 DIM X(150),Y(150)
50 STRS(300)
60 GOTO 100
100 CLS
110 PRINT
120 PRINT "          A S C I I   S N A K E"
130 PRINT
140 PRINT "       EAT * TO GROW AND SCORE"
150 PRINT "       DO NOT HIT WALL OR BODY"
160 PRINT
170 PRINT "       A=UP       Z=DOWN"
180 PRINT "       <=LEFT     >=RIGHT"
190 PRINT "       PREMIUM ARROWS AND JOYSTICK WORK"
200 PRINT
210 PRINT "       PRESS ANY KEY TO START"
220 A0$=KEY
230 IF A0$="" THEN GOTO 220
240 GOTO 1000
300 REM PUT FOOD ON EMPTY SQUARE - INTEGER ONLY
310 P=P+7
315 IF P>W THEN LET P=P-W
320 Q=Q+3
325 IF Q>H THEN LET Q=Q-H
330 FOR I=1 TO L
340 IF X(I)=P AND Y(I)=Q THEN GOTO 310
350 NEXT I
360 RETURN
400 REM FAST STARTUP - SNAKE AND FOOD FIRST, BORDERS SECOND
410 CLS
420 PRINT "SCORE";S;" LENGTH";L
430 FOR I=L TO 2 STEP -1
440 K=-4096+(Y(I)+1)*64+X(I):POKE K,79
450 NEXT I
460 K=-4096+(Y(1)+1)*64+X(1):POKE K,64
470 K=-4096+(Q+1)*64+P:POKE K,42
480 REM DRAW TOP AND BOTTOM AS TWO COMPLETE STRINGS
490 CURS 1,2:PRINT "+------------------------------------------------------------+";
500 CURS 1,H+3:PRINT "+------------------------------------------------------------+";
510 REM DRAW ONLY THE TWENTY SIDE-BORDER CHARACTERS
520 FOR R=1 TO H
530 K=-4096+(R+1)*64:POKE K,124
540 J=K+W+1:POKE J,124
550 NEXT R
560 CURS 1,H+4:PRINT "A Z < >/PREMIUM ARROWS/JOY Q=QUIT";
590 RETURN
600 REM GAME OVER
610 PRINT
620 PRINT "GAME OVER - SCORE";S;" LENGTH";L
625 PRINT "PRESS ANY KEY";
630 A0$=KEY
640 IF A0$="" THEN GOTO 630
650 GOTO 100
700 REM READ KEYBOARD AND JOYSTICK
710 A0$=KEY:A=IN(0)
720 IF A0$="Q" OR A0$="q" THEN GOTO 10000
730 REM
740 IF (A0$="A" OR A0$="a") AND E<>1 THEN LET D=0:LET E=-1
750 IF (A0$="Z" OR A0$="z") AND E<>-1 THEN LET D=0:LET E=1
760 IF A0$=CHR$(60) AND D<>1 THEN LET D=-1:LET E=0
765 IF A0$=CHR$(44) AND D<>1 THEN LET D=-1:LET E=0
770 IF A0$=CHR$(62) AND D<>-1 THEN LET D=1:LET E=0
775 IF A0$=CHR$(46) AND D<>-1 THEN LET D=1:LET E=0
780 IF A0$=CHR$(5) AND E<>1 THEN LET D=0:LET E=-1
790 IF A0$=CHR$(24) AND E<>-1 THEN LET D=0:LET E=1
800 IF A0$=CHR$(19) AND D<>1 THEN LET D=-1:LET E=0
810 IF A0$=CHR$(4) AND D<>-1 THEN LET D=1:LET E=0
820 IF A=254 AND E<>1 THEN LET D=0:LET E=-1
830 IF A=253 AND E<>-1 THEN LET D=0:LET E=1
840 IF A=251 AND D<>1 THEN LET D=-1:LET E=0
842 IF A=247 AND D<>-1 THEN LET D=1:LET E=0
844 RETURN
850 REM
860 RETURN
1000 REM NEW GAME
1010 W=60:H=10:L=4:S=0:D=1:E=0:V=1
1020 X(1)=30:Y(1)=5
1030 X(2)=29:Y(2)=5
1040 X(3)=28:Y(3)=5
1050 X(4)=27:Y(4)=5
1060 OUT 1,255
1070 GOSUB 300
1080 GOSUB 400
1100 REM MAIN GAME LOOP
1110 GOSUB 700
1120 REM ONE INPUT POLL PER MOVE
1130 REM
1140 N=X(1)+D:M=Y(1)+E
1150 IF N<1 OR N>W OR M<1 OR M>H THEN GOTO 600
1160 G=0
1170 IF N=P AND M=Q THEN LET G=1
1180 K=L-1+G
1190 FOR I=2 TO K
1200 IF X(I)=N AND Y(I)=M THEN GOTO 600
1210 NEXT I
1220 T=X(L):U=Y(L)
1230 IF G=1 THEN LET L=L+1
1240 IF L>150 THEN LET L=150
1250 FOR I=L TO 2 STEP -1
1260 X(I)=X(I-1):Y(I)=Y(I-1)
1270 NEXT I
1280 X(1)=N:Y(1)=M
1290 IF G=1 THEN GOTO 1320
1300 I=-4096+(U+1)*64+T:POKE I,32
1310 GOTO 1370
1320 REM FOOD EATEN
1330 S=S+10
1340 REM NO EXTRA DELAY - MWB IS SLOW ENOUGH
1350 GOSUB 300
1355 CURS 1,1:PRINT "SCORE ";S+0;" LENGTH ";L+0;"        ";
1360 I=-4096+(Q+1)*64+P:POKE I,42
1370 I=-4096+(Y(2)+1)*64+X(2):POKE I,79
1375 I=-4096+(M+1)*64+N:POKE I,64
1380 REM NEXT MOVE
1390 GOTO 1100
10000 CLS
10010 END
