1000  REM  *****  QUBIC  *****  DEMONSTRATION PROGRAM  *****
1010  REM  *****  VERSION 3  *****  3/4/71  *****
1020  REM  PLAYS 3-DIMENSIONAL TIC-TAC-TOE, FIVE DIFFERENT STRATEGIES
1030  DIM A$[72],B$[72],Q[16],R[76,4],S[64],T[76],U[5,3]
1040  DEF FNS()=S[R[,1]]+S[R[,2]]+S[R[,3]]+S[R[,4]]
1050  DEF FNM()=+110+6*INT(/4-.2)+60*INT(/16-.05)
1060  DEF FNG()=INT(T[]-5*INT(T[]/5))
1070  MAT  READ Q,R
1080  MAT U=ZER
1090  E=G3=0
1100  PRINT "YOUR FIRST NAME";
1110  INPUT B$
1120  PRINT "THIS IS THE GAME OF QUBIC, ";B$;"."'13'10"DO YOU WANT INSTRUCTIONS";
1130  INPUT A$
1140  IF A$[1,1]#"Y" THEN 1190
1145  PRINT 
1150  PRINT "THE GAME IS TIC-TAC-TOE IN A 4 X 4 X 4 CUBE."
1155  PRINT "YOU WIN IF YOU GET 4 IN A STRAIGHT LINE."
1160  PRINT 
1165  PRINT "A MOVE IS A THREE-DIGIT NUMBER WITH EACH DIGIT BEING"
1170  PRINT "EITHER  1 , 2 , 3 , OR 4 ."
1175  PRINT "THE DIGITS INDICATE THE LEVEL, ROW, AND COLUMN"
1180  PRINT "(IN THAT ORDER) OF YOUR MOVE."
1185  PRINT 
1190  PRINT "WHEN IT IS YOUR MOVE, SHOULD I PRINT OUT THE BOARD";
1195  INPUT C$[1,1]
1200  IF C$#"Y" THEN 1210
1205  PRINT "YOUR POSITIONS ARE INDICATED BY X'S AND MINE BY O'S."
1210  PRINT 
1215  PRINT "YOU GET TO PICK A STRATEGY LEVEL BETWEEN 1 AND 5."
1220  PRINT "(1 IS THE EASIEST, 5 IS THE HARDEST.)"
1240  IF A$[1,1]#"Y" THEN 1260
1260  PRINT "WHAT STRATEGY LEVEL, ";B$;
1270  INPUT L
1280  IF ABS(L-1)=INT(L-1) AND L<6 THEN 1310
1290  PRINT "BETWEEN 1 AND 5."
1300  GOTO 1260
1310  Q=Q0=2
1320  R9=16
1330  R=INT(76*RND(E))+1
1340  MAT S=ZER
1350  MAT T=ZER
1360  PRINT '10'10"LEVEL";L;'13'10"DO YOU WANT TO GO FIRST";
1370  INPUT A$
1380  IF A$[1,1]="Y" THEN 1400
1390  GOTO INT(L/2+.5) OF 3260,3430,2460
1400  Q=1
1410  GOTO 1440
1420  IF C$#"Y" THEN 1440
1430  GOSUB 2870
1440  PRINT "YOUR MOVE, ";B$;
1450  E=E*RND(LEN(A$)+E)+LEN(B$)
1460  INPUT F
1470  E1=INT(F/100)
1480  E2=INT(F/10)-10*E1
1490  E3=F-100*E1-10*E2
1500  IF E1<5 AND E2<5 AND E3<5 AND ABS(F-111)=INT(F-111) THEN 1530
1510  PRINT "ILLEGAL MOVE, TRY AGAIN."
1520  GOTO 1440
1530  M=16*E1+4*E2+E3-20
1540  IF S[M]<1 THEN 1570
1550  PRINT "THAT SQUARE IS USED, TRY AGAIN."
1560  GOTO 1440
1570  S[M]=1
1580  Q=Q+2
1590  GOSUB 3050
1600  GOSUB 3010
1610  IF Q=3 AND (L=3 OR L=4) THEN 3430
1620  A=B=0
1630  FOR F=1 TO 76
1640  IF T[F]#4 THEN 1850
1650  PRINT "CONGRATULATIONS, ";B$;"!"'13'10'7"YOU";
1660  G3=G3+1
1670  U[L,3]=U[L,3]+1
1680  PRINT " WIN AS FOLLOWS:";FNM(R[F,1]);FNM(R[F,2]);FNM(R[F,3]);
1690  PRINT FNM(R[F,4]);'13'10"FINAL POSITION:"
1700  GOSUB 2870
1710  FOR A=1 TO 5
1720  FOR B=1 TO 3
1730  IF U[A,B]#0 THEN 1760
1740  NEXT B
1750  GOTO 1800
1760  PRINT "SO FAR AT LEVEL";A;"YOU'VE WON";U[A,3];"I'VE WON";U[A,1];
1770  IF U[A,2]=0 THEN 1790
1780  PRINT "AND WE'VE DRAWN";U[A,2];
1790  PRINT 
1800  NEXT A
1810  PRINT B$;", DO YOU WANT ANOTHER GAME";
1820  INPUT A$
1830  IF A$[1,1]="Y" THEN 1260
1840  STOP 
1850  IF T[F]#15 THEN 1870
1860  A=F
1870  IF T[F]#3 THEN 1890
1880  B=F
1890  NEXT F
1900  IF A=0 THEN 2000
1910  GOSUB 2840
1920  IF Q0=2 THEN 1950
1930  PRINT "TOO BAD, ";B$;"."
1940  PRINT "JUST AS I SAID, ";
1950  PRINT "I MOVE TO";FNM(R[A,C]);"AND";
1960  F=A
1970  U[L,1]=U[L,1]+1
1980  S[R[A,C]]=5
1990  GOTO 1680
2000  IF Q<65 THEN 2090
2010  IF Q=66 THEN 2060
2020  FOR F=1 TO 64
2030  IF S[F]=0 THEN 2050
2040  NEXT F
2050  PRINT "I MOVE TO";FNM(F)
2060  PRINT "THE GAME IS A DRAW."
2070  U[L,2]=U[L,2]+1
2080  GOTO 1710
2090  IF L=1 THEN 3250
2100  IF B=0 THEN 2160
2110  A=B
2120  GOSUB 2840
2130  PRINT "NICE TRY, ";B$;" --I MOVE TO";FNM(R[A,C])
2140  S[R[A,C]]=5
2150  GOTO 1420
2160  IF L=2 THEN 3250
2170  FOR Y=5 TO 1 STEP -4
2180  FOR F=1 TO 76
2190  V=FNS(F)
2200  IF INT(V)#2*Y THEN 2260
2210  IF V>2*Y THEN 2610
2220  FOR G=1 TO 4
2230  IF S[R[F,G]]>0 THEN 2250
2240  S[R[F,G]]=.1
2250  NEXT G
2260  NEXT F
2270  GOSUB 3010
2280  FOR F=1 TO 76
2290  IF T[F]=.4 OR T[F]=Y+.3 THEN 2750
2300  NEXT F
2310  IF Y=1 THEN 2340
2320  IF L=3 THEN 3420
2330  GOSUB 3050
2340  NEXT Y
2350  IF L=4 THEN 3420
2360  FOR H=1 TO 69 STEP 4
2370  P=INT(T[H])+INT(T[H+1])+INT(T[H+2])+INT(T[H+3])
2380  IF P#4 AND P#9 THEN 2450
2390  J=.1
2400  FOR F=H TO H+3
2410  GOTO 2760
2420  NEXT F
2430  J=0
2440  GOTO 2400
2450  NEXT H
2460  FOR F=1 TO 16
2470  IF S[Q[F]]>.5 THEN 2510
2480  S[Q[F]]=5
2490  PRINT "I MOVE TO";FNM(Q[F])
2500  GOTO 1420
2510  NEXT F
2520  S=0
2530  FOR F=1 TO INT((66-Q)*RND(E))+1
2540  S=S+1
2550  IF S[S]<.5 THEN 2570
2560  GOTO 2540
2570  NEXT F
2580  PRINT "I LIKE";FNM(S)
2590  S[S]=5
2600  GOTO 1420
2610  FOR G=1 TO 4
2620  IF S[R[F,G]]#.1 THEN 2740
2630  S[R[F,G]]=5
2640  IF V<5 THEN 2710
2650  IF G3=0 THEN 2690
2660  PRINT B$;", YOU BEAT ME BEFORE, BUT NO MORE!  LOOK: ";
2670  Q0=1
2680  GOTO 2720
2690  PRINT "LET'S SEE YOU GET OUT OF THIS ONE: ";
2700  GOTO 2720
2710  PRINT "YOU FOX!  JUST IN THE NICK OF TIME,";
2720  PRINT " I MOVE TO";FNM(R[F,G])
2730  GOTO 1420
2740  NEXT G
2750  J=.1
2760  K=INT((F-INT(F/4)*4)/2)+1
2770  FOR G=K TO 5-K STEP 5-2*K
2780  IF S[R[F,G]]#J THEN 2820
2790  PRINT "I TAKE";FNM(R[F,G])
2800  S[R[F,G]]=5
2810  GOTO 1420
2820  NEXT G
2830  GOTO 2420
2840  FOR C=1 TO 4
2850  IF S[R[A,C]]<.5 THEN 3040
2860  NEXT C
2870  A$="X.O"
2880  PRINT 
2890  FOR F=1 TO 13 STEP 4
2900  FOR G=F TO F+48 STEP 16
2910  FOR H=G TO G+3
2920  N=ABS(INT(S[H])-2)
2930  PRINT A$[N,N];
2940  NEXT H
2950  PRINT "  ";
2960  NEXT G
2970  PRINT 
2980  NEXT F
2990  PRINT 
3000  RETURN 
3010  FOR W=1 TO 76
3020  T[W]=FNS(W)
3030  NEXT W
3040  RETURN 
3050  FOR W=1 TO 64
3060  S[W]=INT(S[W])
3070  NEXT W
3080  RETURN 
3090  DATA 1,49,52,4,13,61,64,16,22,39,23,38,26,42,27,43,1,2,3,4,5,6,7
3100  DATA 8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
3110  DATA 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
3120  DATA 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,1,17,33,49,2
3130  DATA 18,34,50,3,19,35,51,4,20,36,52,5,21,37,53,6,22,38,54,7,23,39
3140  DATA 55,8,24,40,56,9,25,41,57,10,26,42,58,11,27,43,59,12,28,44,60
3150  DATA 13,29,45,61,14,30,46,62,15,31,47,63,16,32,48,64,1,5,9,13,17
3160  DATA 21,25,29,33,37,41,45,49,53,57,61,2,6,10,14,18,22,26,30,34,38
3170  DATA 42,46,50,54,58,62,3,7,11,15,19,23,27,31,35,39,43,47,51,55,59
3180  DATA 63,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,1,6,11,16,17
3190  DATA 22,27,32,33,38,43,48,49,54,59,64,13,10,7,4,29,26,23,20,45,42
3200  DATA 39,36,61,58,55,52,1,21,41,61,2,22,42,62,3,23,43,63,4,24,44,64
3210  DATA 49,37,25,13,50,38,26,14,51,39,27,15,52,40,28,16,1,18,35,52,5
3220  DATA 22,39,56,9,26,43,60,13,30,47,64,49,34,19,4,53,38,23,8,57,42
3230  DATA 27,12,61,46,31,16,1,22,43,64,16,27,38,49,4,23,42,61,13,26,39
3240  DATA 52
3250  IF R=0 THEN 2520
3260  IF FNG(R) THEN 3310
3270  A=R
3280  GOSUB 2840
3290  PRINT "I GO TO";FNM(R[A,C])
3300  GOTO 2140
3310  A=R=0
3320  FOR F=1 TO 76
3330  IF FNG(F) THEN 3350
3340  A=A+1
3350  NEXT F
3360  IF A=0 THEN 2520
3370  FOR F=1 TO INT(A*RND(E))+1
3380  R=R+1
3390  IF FNG(R) THEN 3380
3400  NEXT F
3410  GOTO 3270
3420  IF FNG(R7)=0 AND FNG(R8)=0 THEN 3510
3430  R9=R9+1
3440  IF R9>5775 THEN 2520
3450  R7=INT(R9/76-.01)+1
3460  R8=R9-76*R7+76
3470  IF FNG(R8) OR (INT(R7/4-.2)=INT(R8/4-.2)) THEN 3430
3480  IF  NOT FNG(R7) THEN 3510
3490  R9=R9+77-R8
3500  GOTO 3440
3510  FOR F=1 TO 4
3520  FOR G=1 TO 4
3530  IF R[R7,F]=R[R8,G] THEN 3570
3540  NEXT G
3550  NEXT F
3560  GOTO 3430
3570  IF S[R[R7,F]]>.5 THEN 3430
3580  R=R7
3590  IF T[R]<10 THEN 3620
3600  R=R8
3610  F=G
3620  FOR H=1 TO 4
3630  IF S[R[R,H]]>.5 OR H=F THEN 3670
3640  PRINT "I CLAIM";FNM(R[R,H])
3650  S[R[R,H]]=5
3660  GOTO 1420
3670  NEXT H
3680  END 
