Listing of file='QUBIC' on disk='vmedia/more_games.wvd.zip'
# Sector 1148, program filename = 'QUBIC' 0010 REM *QUBIC* : LOAD DC T#6,"GAMES" 0020 DIM A$64,B$64,Q(16),R(76,4),S(64),T(76),U(5,3) 0030 DEFFNS(Z)=S(R(Z,1))+S(R(Z,2))+S(R(Z,3))+S(R(Z,4)) 0040 DEFFNM(Z)=Z+110+6*INT(Z/4-.2)+60*INT(Z/16-.05) 0050 DEFFNG(Z)=INT(T(Z)-5*INT(T(Z)/5)) : RESTORE : MAT READ Q,R : INIT(20)B$,A$ : MAT U=ZER 0060 E,G3=0 : %WHAT'S YOUR NAME? 0070 PRINT HEX(03); : INPUT "WHAT IS YOUR FIRST NAME",B$ : PRINT HEX(03);"THIS IS THE GAME OF QUBIC, ";B$; : INPUT ". DO YOU WANT INSTRUCTIONS",A$ 0080 IF STR(A$,1,1)<>"Y"THEN 140 : %INSTRUCTIONS 0090 PRINT HEX(03);"THE GAME IS TIC-TAC-TOE IN A 4 X 4 X 4 CUBE."; : PRINT "YOU WIN IF YOU GET 4 IN A STRAIGHT LINE,"; : PRINT "(HORIZONTAL, VERTICAL OR ANY DIAGONAL)."; 0100 PRINT "A MOVE IS A THREE-DIGIT NUMBER WITH EACH DIGIT BEING,"; : PRINT "EITHER 1 , 2 , 3 , OR 4 ,"; : PRINT "ENTERED WITHOUT COMMAS (ie: 123, 444, etc.)."; 0110 PRINT "THE DIGITS INDICATE THE LEVEL, ROW, AND COLUMN"; 0120 PRINT "(IN THAT ORDER) OF YOUR MOVE."; : PRINT " PRESS 'EXECUTE' TO START THE GAME." 0130 KEYIN C$,140,130 : GOTO 130 0140 PRINT HEX(03);"YOUR POSITIONS ARE INDICATED BY X'S AND MINE BY O'S."; : PRINT "YOU GET TO PICK A STRATEGY LEVEL BETWEEN 1 AND 5."; 0150 PRINT "(1 IS THE EASIEST, 5 IS THE HARDEST.)" : %WHAT STRATEGY LEVEL? 0160 PRINT "OK ";B$;","; : INPUT " WHAT STRATEGY LEVEL WOULD YOU LIKE TO TRY",L : IF ABS(L-1)=INT(L-1)THEN 170 : GOTO 180 0170 IF L<6THEN 190 : %BAD ANSWER! 0180 PRINT HEX(0307);"YOUR ANSWER MUST BE AN INTERGER BETWEEN 1 AND 5." : FOR X=1TO 350 : NEXT X : PRINT HEX(03) : GOTO 160 0190 Q,Q0=2 : R9=16 : R=INT(76*RND(1))+1 : MAT S=ZER 0200 MAT T=ZER : %DO YOU WANT TO GO FIRST? 0210 PRINT HEX(03);"LEVEL";L; : INPUT "- DO YOU WANT TO GO FIRST",A$ : F1=0 : IF STR(A$,1,1)="Y"THEN 230 0220 ON INT(L/2+.5)GOTO 1250,1340,870 0230 Q=1 : GOTO 250 0240 GOSUB 1080 0250 PRINT "ITS YOUR TURN ";B$;","; 0260 E=RND(1)+LEN(B$) : %WHAT'S YOUR MOVE? 0270 INPUT " WHAT'S YOUR MOVE",F : E1=INT(F/100) : E2=INT(F/10)-10*E1 : E3=F-100*E1-10*E2 : IF E1<5THEN 280 : GOTO 310 0280 IF E2<5THEN 290 : GOTO 310 0290 IF E3<5THEN 300 : GOTO 310 0300 IF ABS(F-111)=INT(F-111)THEN 320 : %ILLEGAL MOVE! 0310 PRINT HEX(07);"ILLEGAL MOVE, TRY AGAIN." : FOR X=1TO 350 : NEXT X : GOTO 270 0320 M=16*E1+4*E2+E3-20 0330 IF S(M)<1THEN 350 : %SQUARE IS TAKEN! 0340 PRINT HEX(07);"THAT SQUARE IS TAKEN, TRY AGAIN." : FOR X=1TO 350 : NEXT X : GOTO 270 0350 S(M)=1 : Q=Q+2 : GOSUB 1110 : GOSUB 1090 : IF Q=3THEN 360 : GOTO 370 0360 IF L=3THEN 1340 : IF L=4THEN 1340 0370 A,B=0 : FOR F=1TO 76 0380 IF T(F)<>4THEN 530 : %YOU WIN!! 0390 PRINT HEX(03070A0A0A);"CONGRATULATIONS, ";B$;"! YOU"; : G3=G3+1 : U(L,3)=U(L,3)+1 0400 PRINT " WIN AS FOLLOWS:";FNM(R(F,1));FNM(R(F,2));FNM(R(F,3)); : PRINT FNM(R(F,4));" FINAL POSITION:" : IF F1<>0THEN 410 : IF F=76THEN 410 : F9=F : F=76 : NEXT F : F=F9 0410 GOSUB 1080 0420 FOR A=1TO 5 : FOR B=1TO 3 : IF U(A,B)<>0THEN 440 : GOTO 450 0430 IF F=76THEN 410 : F9=F : F=76 : NEXT F : F=F9 : GOTO 410 0440 IF B>=3THEN 470 : B9=B : B=3 : NEXT B : B=B9 : GOTO 470 0450 NEXT B 0460 GOTO 490 : %SO FAR... 0470 IF A>=5THEN 480 : A9=A : A=5 : NEXT A : A=A9 0480 PRINT "SO FAR AT LEVEL";A;" YOU'VE WON";U(A,3);" I'VE WON";U(A,1);"- "; : IF U(A,2)=0THEN 490 : PRINT " AND WE'VE DRAWN";U(A,2);". "; 0490 NEXT A : %TRY AGAIN? 0500 PRINT ". WELL ";B$;", "; : INPUT " DO YOU WANT ANOTHER GAME",A$ : IF STR(A$,1,1)="Y"THEN 510 : GOTO 520 0510 PRINT HEX(03); : IF F>=13THEN 160 : F9=F : F=13 : NEXT F : F=F9 : GOTO 160 0520 END 0530 IF T(F)<>15THEN 540 : A=F 0540 IF T(F)<>3THEN 550 : B=F 0550 NEXT F : IF A=0THEN 590 : GOSUB 1070 0560 IF Q0=2THEN 580 : %YOU LOSE!!! 0570 PRINT HEX(03070A0A0A);"TOO BAD, ";B$;"." : PRINT "JUST AS I SAID, "; 0580 PRINT HEX(03);"I MOVE TO";FNM(R(A,C));" AND"; : F=A : F1=1 : U(L,1)=U(L,1)+1 : S(R(A,C))=5 : GOTO 400 0590 IF Q<65THEN 640 : IF Q=66THEN 630 : FOR F=1TO 64 : IF S(F)=0THEN 600 : GOTO 610 0600 IF F>=64THEN 620 : F9=F : F=64 : NEXT F : F=F9 : GOTO 620 0610 NEXT F : %DRAW 0620 PRINT HEX(0307);"I MOVE TO";FNM(F);"AND"; 0630 PRINT "THE GAME IS A DRAW." : U(L,2)=U(L,2)+1 : F1=1 : GOTO 420 0640 IF L=1THEN 1240 : IF B=0THEN 680 : A=B 0650 GOSUB 1070 : %CLOSE 0660 PRINT HEX(03);"NICE TRY ";B$;", --I MOVE TO";FNM(R(A,C)) 0670 S(R(A,C))=5 : GOTO 240 0680 IF L=2THEN 1240 : FOR Y=5TO 1STEP -4 : FOR F=1TO 76 : V=FNS(F) : IF INT(V)<>2*YTHEN 720 : IF V>2*YTHEN 690 : GOTO 700 0690 IF F>=76THEN 920 : F9=F : F=76 : F=F9 : NEXT F : GOTO 920 0700 FOR G=1TO 4 : IF S(R(F,G))>0THEN 710 : S(R(F,G))=.1 0710 NEXT G 0720 NEXT F 0730 GOSUB 1090 : %2200 MOVES 0740 FOR F=1TO 76 : IF T(F)=.4THEN 750 : IF T(F)=Y+.3THEN 750 : GOTO 760 0750 IF F>=76THEN 1030 : F9=F : F=76 : NEXT F : F=F9 : GOTO 1030 0760 NEXT F : IF Y=1THEN 790 : IF L=3THEN 770 : GOTO 780 0770 IF Y<=1THEN 1320 : Y9=Y : Y=1 : NEXT Y : Y=Y9 : GOTO 1320 0780 GOSUB 1110 0790 NEXT Y : IF L=4THEN 1320 : FOR H=1TO 69STEP 4 : P=INT(T(H))+INT(T(H+1))+INT(T(H+2))+INT(T(H+3)) : IF P<>4THEN 800 : GOTO 810 0800 IF P<>9THEN 860 0810 J=.1 0820 FOR F=HTO H+3 : IF F>=H+3THEN 830 : F9=F : F=H+3 : NEXT F : F=F9 0830 IF H>=69THEN 1040 : H9=H : H=69 : NEXT H : H=H9 : GOTO 1040 0840 NEXT F 0850 J=0 : GOTO 820 0860 NEXT H 0870 FOR F=1TO 16 : IF S(Q(F))>.5THEN 880 : S(Q(F))=5 : PRINT HEX(03);"I MOVE TO";FNM(Q(F)) : IF F>=16THEN 240 : F9=F : F=16 : NEXT F : F=F9 : GOTO 240 0880 NEXT F 0890 S=0 : FOR F=1TO INT((66-Q)*RND(1))+1 0900 S=S+1 : IF S(S)<.5THEN 910 : GOTO 900 0910 NEXT F : PRINT HEX(03);"I LIKE";FNM(S) : S(S)=5 : GOTO 240 0920 FOR G=1TO 4 0930 IF S(R(F,G))<>.1THEN 1020 : S(R(F,G))=5 0940 IF V<5THEN 990 : %RIPOSTE 0950 IF G3=0THEN 970 : PRINT HEX(03);B$;", YOU BEAT ME BEFORE, BUT NO MORE! LOOK: "; : Q0=1 0960 GOTO 1010 : %GOTCHA..? 0970 PRINT HEX(03);"LET'S SEE YOU GET OUT OF THIS ONE: "; 0980 GOTO 1010 : %CLOSE CALL! 0990 PRINT HEX(03);"YOU FOX! JUST IN THE NICK OF TIME,"; : GOTO 1010 1000 PRINT HEX(03); 1010 PRINT " I MOVE TO";FNM(R(F,G)) : IF G>=4THEN 240 : G=5 : NEXT G : GOTO 240 1020 NEXT G 1030 J=.1 1040 K=INT((F-INT(F/4)*4)/2)+1 : FOR G=KTO 5-KSTEP 5-2*K : IF S(R(F,G))<>JTHEN 1060 : PRINT HEX(03);"I TAKE";FNM(R(F,G)) : S(R(F,G))=5 1050 IF G>=5-KTHEN 240 : G9=G : G=(5-K) : NEXT G : G=G9 : GOTO 240 1060 NEXT G : GOTO 840 1070 FOR C=1TO 4 : IF S(R(A,C))<.5THEN 1100 : NEXT C 1080 A$="X.O" : PRINT : FOR F=1TO 13STEP 4 : FOR G=FTO F+48STEP 16 : FOR H=GTO G+3 : N=ABS(INT(S(H))-2) : PRINT STR(A$,N,1); : NEXT H : PRINT HEX(20202020); : NEXT G : PRINT HEX(0D0A0A); : NEXT F : RETURN 1090 FOR W=1TO 76 : T(W)=FNS(W) : NEXT W 1100 RETURN 1110 FOR W=1TO 64 1120 S(W)=INT(S(W)) : NEXT W 1130 RETURN : %LOGIC TABLE 1140 DATA 1,49,52,4,13,61,64,16,22,39,23,38,26,42,27,43,1,2,3,4,5,6,7 : DATA 8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 1150 DATA 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 1160 DATA 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,1,17,33,49,2 : DATA 18,34,50,3,19,35,51,4,20,36,52,5,21,37,53,6,22,38,54,7,23,39 1170 DATA 55,8,24,40,56,9,25,41,57,10,26,42,58,11,27,43,59,12,28,44,60 1180 DATA 13,29,45,61,14,30,46,62,15,31,47,63,16,32,48,64,1,5,9,13,17 : DATA 21,25,29,33,37,41,45,49,53,57,61,2,6,10,14,18,22,26,30,34,38 1190 DATA 42,46,50,54,58,62,3,7,11,15,19,23,27,31,35,39,43,47,51,55,59 1200 DATA 63,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,1,6,11,16,17 : DATA 22,27,32,33,38,43,48,49,54,59,64,13,10,7,4,29,26,23,20,45,42 1210 DATA 39,36,61,58,55,52,1,21,41,61,2,22,42,62,3,23,43,63,4,24,44,64 1220 DATA 49,37,25,13,50,38,26,14,51,39,27,15,52,40,28,16,1,18,35,52,5 : DATA 22,39,56,9,26,43,60,13,30,47,64,49,34,19,4,53,38,23,8,57,42 1230 DATA 27,12,61,46,31,16,1,22,43,64,16,27,38,49,4,23,42,61,13,26,39 : DATA 52 1240 IF R=0THEN 890 1250 IF FNG(R)<>0THEN 1290 1260 A=R 1270 GOSUB 1070 : %2200 MOVES 1280 PRINT HEX(03);"I GO TO";FNM(R(A,C)) : GOTO 670 1290 A,R=0 : FOR F=1TO 76 : IF FNG(F)<>0THEN 1300 : A=A+1 1300 NEXT F : IF A=0THEN 890 : FOR F=1TO INT(A*RND(1))+1 1310 R=R+1 : IF FNG(R)<>0THEN 1310 : NEXT F : GOTO 1260 1320 IF FNG(R7)=0THEN 1330 : GOTO 1340 1330 IF FNG(R8)=0THEN 1370 1340 R9=R9+1 1350 IF R9>5775THEN 890 1360 R7=INT(R9/76-.01)+1 : R8=R9-76*R7+76 : IF FNG(R8)=INT(R8/4-.2)THEN 1340 : IF INT(R7/4-.2)=INT(R8/4-.2)THEN 1340 : IF FNG(R7)=0THEN 1370 : R9=R9+77-R8 : GOTO 1350 1370 FOR F=1TO 4 : FOR G=1TO 4 : IF R(R7,F)=R(R8,G)THEN 1380 : GOTO 1400 1380 IF G>=4THEN 1390 : G9=G : G=4 : NEXT G : G=G9 1390 IF F>=4THEN 1420 : F9=F : F=4 : NEXT F : F=F9 : GOTO 1420 1400 NEXT G : NEXT F 1410 GOTO 1340 1420 IF S(R(R7,F))>.5THEN 1340 : R=R7 : IF T(R)<10THEN 1430 : R=R8 : F=G 1430 FOR H=1TO 4 : IF S(R(R,H))>.5THEN 1440 : IF H=FTHEN 1440 : PRINT HEX(03);"I CLAIM";FNM(R(R,H)) : S(R(R,H))=5 : IF H<4THEN 1450 : GOTO 240 1440 NEXT H : GOTO 240 1450 H9=H : H=4 : NEXT H : H=H9 : GOTO 240