Listing of file='SNAKE220' on disk='vmedia/more_games.wvd.zip'
# Sector 1304, program filename = 'SNAKE220'
0000 DEFFN'0 "PRINT HEX(03):LISTSD10,";HEX(0D)
0001 DEFFN' 16"SCRATCHT";HEX(22);"SNAKE 22";HEX(22);":SAVET()";HEX(22);"SNAKE
22";HEX(220D)
0002 DEFFN'126"PRINT HEX(03): LISTSD 0 ,"
0010 REM "SNAKE 22" RELEASE 1.1 (04/10/80)
0020 DIM A$(10)124,B$(2)124,X$2,W$2,L$2,T$2,V$2,I$1,J$1,K$1
: E$="900"
: J1$="40"
0030 GOSUB 740
0040 PRINT HEX(0202020F03)
: F,S,E1,E2,E3,E4,E5,E6,E7,E8,E9,E0,C5=0
: A,B=1
: C,D,C1,D1=3
: V$=HEX(C0C0)
: R1$=HEX(F7FB)
: R2$=HEX(FFFF)
: R3$=HEX(F7FB)
: A1=-1
: A2=24
: H=79
0050 PRINT HEX(0306);AT(0,30),"SNAKEWAR"
: PRINT
0060 PRINT "YOU CONTROL YOUR SNAKE WITH THE FOLLOWING KEYS: W-TO GO UP,A-TO
GO LEFT, X-TO GO DOWN, AND D-TO GO RIGHT."
: PRINT
0070 PRINT "IF YOUR SNAKE HITS A WALL, REVERSES ITSELF, HITS THE COMPUTER'S SN
AKE, OR HITS YOUR OWN SNAKE, YOU LOSE FIVE POINTS. IF YOU HIT A TARGET Y
OU GET FROM 4 TO 20 POINTS. THE FIRST PLAYER TO 100 WINS, OR, TO -100, L
OSES."
0080 PRINT
: LINPUT "YOUR NAME"C$
0090 PRINT AT(12,0);
: LINPUT "SELECT SPEED: 0<=E<=1000",E$
: CONVERT E$ TO E
: ERRORGOTO 90
: IF E<0 OR E>1000 THEN 90
0100 PRINT AT(13,0);
: LINPUT "SELECT DISPLAY DURATION: 0<=D<=100",J1$
: CONVERT J1$ TO J1
: ERRORGOTO 100
0110 IF J1<0 OR J1>100 THEN 100
0120 IF R$<>"DE" THEN GOSUB 710
0130 KEYIN I$,130,130
: RETURN CLEAR ALL
: T$=HEX(0000)
: V,F1,C3=0
: A,B=1
: X,W=22
: IF R$="DE" THEN X,W=23
: Y=17
: Z=61
: IF R$="DE" THEN PRINT HEX(0306);BOX (24,79);
: C=C1
: D=D1
: J$="Q"
: H=79
0140 IF R$<>"DE" THEN GOSUB 730
0150 A$(),B$()=ALL(00)
: STR(A$(),,1),STR(B$(),,1)=BIN(23)
: STR(A$(),2,1)=BIN(17)
: STR(B$(),2,1)=BIN(61)
: STR(A$(),3)=A$()
: STR(B$(),3)=B$()
: STR(A$(),2*C+1),STR(B$(),2*D+1)=ALL(00)
0160 X=X-1
: IF X=A1 THEN 530
: GOSUB 420
: GOTO 240
0170 Y=Y-2
: IF Y=-1 THEN 530
: GOSUB 420
: GOTO 240
0180 X=X+1
: IF X=A2 THEN 530
: GOSUB 420
: GOTO 240
0190 Y=Y+2
: IF Y=79 THEN 530
: GOSUB 420
: GOTO 240
0200 W=W-1
: IF W=A1 THEN 790
: GOSUB 460
: GOTO 320
0210 Z=Z-2
: IF Z=-1 THEN 790
: GOSUB 460
: GOTO 320
0220 W=W+1
: IF W=A2 THEN 790
: GOSUB 460
: GOTO 320
0230 Z=Z+2
: IF Z=79 THEN 790
: GOSUB 460
: GOTO 320
0240 IF E=1000 THEN 250
: FOR J=1 TO 1000-E
: $BREAK 1
: NEXT J
0250 IF H<79 THEN 270
: C2=C2+1
: IF C2>20*RND(1) THEN 840
: GOTO 310
0260 REM TARGET SEEKING CODE
0270 IF W=G AND Z=H THEN 310
: IF B=1 OR B=3 THEN 280
: IF W=G AND B=3+SGN(H-Z) THEN 310
: IF W=G THEN 300
: F1=1
: IF G>W THEN B=3
: ELSE B=1
: GOTO 310
0280 IF Z=H AND B=2+SGN(G-W) THEN 310
: IF Z=H THEN 290
: F1=1
: IF Z>H THEN B=2
: ELSE B=4
: GOTO 310
0290 F1=1
: IF Z>39 THEN B=2
: ELSE B=4
: GOTO 310
0300 F1=1
: IF W>12 THEN B=1
: ELSE B=3
0310 RETURN CLEAR ALL
: ON B GOTO 200,210,220,230
0320 KEYIN I$,340,360
0330 GOTO 360
0340 IF I$=J$ THEN KEYIN I$,340,340
: J$=I$
0350 V=POS("WAXD"=I$)
: IF V=0 THEN 360
: A=V
: GOTO 360
0360 IF I$=HEX(1F) THEN GOSUB '31
: IF 1001*RND(1)<985 THEN 410
0370 PRINT AT(G,H);V$;
0380 G=INT(22*RND(1))+1
: H=2*INT(39*RND(1))+1
0390 IF R$<>"DE" THEN GOSUB 720
0400 T$=BIN(G)
: STR(T$,2)=BIN(H)
: MAT SEARCH STR(A$(),,2*C),=T$ TO L$ STEP 2
: IF L$<>HEX(0000) THEN 380
: MAT SEARCH STR(B$(),,2*D),=T$ TO L$ STEP 2
: IF L$<>HEX(0000) THEN 380
: PRINT AT(G,H);R1$;
0410 ON A GOTO 160,170,180,190
0420 X$ = BIN(X)
: STR(X$,2)=BIN(Y)
: IF X$=T$ THEN GOSUB 500
0430 MAT SEARCH STR(A$(),,2*C),=X$ TO L$ STEP 2
: IF L$<>HEX(0000) THEN GOTO 520
: MAT SEARCH STR(B$(),,2*D),=X$ TO L$ STEP 2
: IF L$<>HEX(0000) THEN GOTO 540
0440 MAT COPY -STR(A$(),,2*C) TO -STR(A$(),,2*C+2)
: STR(A$(),,1) = BIN(X)
: STR(A$(),2,1)=BIN(Y)
0450 PRINT AT(X,Y);R2$;AT(VAL(STR(A$(),2*C+1,1)),VAL(STR(A$(),2*C+2,1)));V$;
: RETURN
0460 W$ = BIN(W)
: STR(W$,2)=BIN(Z)
: IF W$=T$ THEN GOSUB 510
0470 MAT SEARCH STR(B$(),,2*D),=W$ TO L$ STEP 2
: IF L$<>HEX(0000) THEN GOTO 790
: MAT SEARCH STR(A$(),,2*C),=W$ TO L$ STEP 2
: IF L$<>HEX(0000) THEN GOTO 790
0480 MAT COPY -STR(B$(),,2*D) TO -STR(B$(),,2*D+2)
: STR(B$(),,1) = BIN(W)
: STR(B$(),2,1)=BIN(Z)
0490 F1=0
: C3=0
: PRINT AT(W,Z);R3$;AT(VAL(STR(B$(),2*D+1,1)),VAL(STR(B$(),2*D+2,1)));V$;
: RETURN
0500 H=79
: T$=HEX(FFFF)
: K=INT(17*RND(1))
: F=F+K+4
: E7=E7+1
: E8=E8+K+4
: C=C+INT(K*5)
: IF C>619 THEN C=619
: IF F-S>=100 OR F>=100 THEN 610
: RETURN
0510 H=79
: T$=HEX(FFFF)
: K=INT(17*RND(1))
: S=S+5
: E9=E9+1
: E0=E0+5
: D=D+INT(K/4)+1
: IF S-F>=100 OR S>=100 THEN 600
: RETURN
0520 PRINT HEX(0306);AT(0,0),C$;" HIT SELF!"
: E1=E1+1
: GOTO 560
0530 PRINT HEX(0306);AT(0,0),C$;" HIT THE WALL!"
: E2=E2+1
: GOTO 560
0540 PRINT HEX(0306);AT(0,0),C$;" HIT THE COMPUTER!"
: E3=E3+1
: GOTO 560
0550 FOR J=1 TO J1
: $BREAK 255
: NEXT J
: PRINT HEX(0306);AT(0,0),"COMPUTER TRAPPED ITSELF!"
: C5=C5+1
: S=S-15
: GOTO 590
0560 F=F-5
: IF F<=-100 OR S-F>=100 OR S>=100 THEN 600
0570 PRINT
: PRINT C$;" ";F;" COMPUTER ";S;
: FOR J=1 TO J1
: $BREAK 255
: NEXT J
0580 GOTO 130
0590 S=S-5
: IF S<=-100 OR F-S>=100 OR F>=100 THEN 610
: GOTO 570
0600 PRINT HEX(0306);AT(0,0),"COMPUTER WINS! ";S;" ";F
: GOTO 620
0610 PRINT HEX(0306);AT(0,0),C$;" WINS ";F;" ";S
0620 PRINT AT(3,0),C$;" HIT SELF ";E1;" TIMES";AT(4,0),C$;" HIT WALL ";E2;" TI
MES";AT(5,0),C$;" HIT ";"THE COMPUTER";E3;" TIMES"
0630 PRINT AT(6,0),C$;" LOST A TOTAL OF ";(E1+E2+E3)*5;" POINTS ON ERRORS"
0640 PRINT AT(7,0),C$;" HIT ";E7;" TARGETS FOR A TOTAL OF ";E8;" POINTS. AVERA
GE: ";
: PRINTUSING "##.###",ROUND((E8/(E7+.000001),3)
0650 PRINT AT(9,0),"COMPUTER HIT SELF ";E4;" TIMES";AT(10,0),"COMPUTER HIT WAL
L ";E5;" TIMES";AT(11,0),"COMPUTER HIT ";C$;" ";E6;" TIMES"
0660 PRINT AT(12,0),"COMPUTER LOST A TOTAL OF ";(E4+E5+E6)*5+C5*20;" POINTS ON
ERRORS"
0670 PRINT AT(13,0),"COMPUTER HIT ";E9;" TARGETS FOR A TOTAL OF ";E0;" POINTS.
AVERAGE: ";
: PRINTUSING "##.###",ROUND((E0/(E9+.000001),3)
0680 PRINT AT(14,0),"COMPUTER TRAPPED ITSELF ";C5;" TIMES"
0690 PRINT AT(16,0);
: K$="Y"
: LINPUT "DO YOU WANT TO PLAY AGAIN (Y OR N)" K$
: IF K$="Y" THEN 40
0700 DEFFN'31
: LOAD T "SNAKMENU"
0710 A1=0
: A2=23
: V$=HEX(2020)
: R1$=HEX(8B)
: R2$=HEX(58)
: R3$=HEX(4F)
: RETURN
0720 G=INT(21*RND(1))+1
: H=2*INT(39*RND(1))+1
: RETURN
0730 PRINT HEX(0306)
: FOR J=0 TO 23
: PRINT AT(J,79);HEX(86);
: NEXT J
: FOR J=79 TO 0 STEP -1
: PRINT AT(23,J);HEX(2D);
: NEXT J
: FOR J=23 TO 0 STEP -1
: PRINT AT(J,0);HEX(86);
: NEXT J
: FOR J=0 TO 79
: PRINT AT(0,J);HEX(2D);
: NEXT J
: RETURN
0740 KEYIN Q6$,740,740
0750 PRINT HEX(0208090F)
: Q8=0
: Q9=190
: Q6$,Q7$=" "
0760 KEYIN Q7$,770,770
: IF Q8>Q9 THEN 780
: Q8=Q8+1
: GOTO 760
0770 Q6$=Q6$&Q7$
: IF Q7$<>HEX(0D) THEN 760
0780 IF STR(Q6$,,8)=" *2236DE" THEN R$="DE"
: ELSE R$="D"
: RETURN
0790 REM RESTORE SNAKE
: ON B GOTO 800,810,820,830
0800 W=W+1
: GOSUB 870
: GOTO 840
0810 Z=Z+2
: GOSUB 870
: GOTO 840
0820 W=W-1
: GOSUB 870
: GOTO 840
0830 Z=Z-2
: GOSUB 870
0840 REM CHANGE DIRECTION RANDOMLY, FAVORING CENTRALIZATION
: F1=1
: C2=0
: IF B=1 OR B=3 THEN 860
0850 IF RND(1)<FNM((24-W)/24) THEN B=3
: ELSE B=1
: GOTO 310
0860 IF RND(1)<FNM((79-Z)/79) THEN B=4
: ELSE B=2
: GOTO 310
0870 W$=BIN(W)
: STR(W$,2)=BIN(Z)
: IF F1=1 THEN 880
: RETURN
0880 C3=C3+1
: IF C3=4 THEN 550
: B=MOD(B,4)+1
: GOTO 310
0890 DEFFN M(N)=3*N^2-2*N^3