100 PRINT TAB(33);"QUBIC":PRINT
110 PRINT TAB(15);"CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY"
120 PRINT:PRINT:PRINT
210 PRINT "DO YOU WANT INSTRUCTIONS";
220 INPUT C$
230 IF LEFT$(C$,1)="N" THEN 315
240 IF LEFT$(C$,1)="Y" THEN 265
250 PRINT "INCORRECT ANSWER.  PLEASE TYPE 'YES' OR 'NO'";
260 GOTO 220
265 PRINT
270 PRINT "THE GAME IS TIC-TAC-TOE IN A 4 X 4 X 4 CUBE."
280 PRINT "EACH MOVE IS INDICATED BY A 3 DIGIT NUMBER, WITH EACH"
290 PRINT "DIGIT BETWEEN 1 AND 4 INCLUSIVE.  THE DIGITS INDICATE THE"
300 PRINT "LEVEL, ROW, AND COLUMN, RESPECTIVELY, OF THE OCCUPIED"
305 PRINT "PLACE.  "
306 PRINT
307 PRINT "TO PRINT THE PLAYING BOARD, TYPE 0 (ZERO) AS YOUR MOVE."
308 PRINT "THE PROGRAM WILL PRINT THE BOARD WITH YOUR MOVES INDI-"
309 PRINT "CATED WITH A (Y), THE MACHINE'S MOVES WITH AN (M), AND"
310 PRINT "UNUSED SQUARES WITH A ( ).  OUTPUT IS ON PAPER."
311 PRINT
312 PRINT "TO STOP THE PROGRAM RUN, TYPE 1 AS YOUR MOVE."
313 PRINT:PRINT
315 DIM X(64),L(76),M(76,4),Y(16)
320 FOR I = 1 TO 16
330 READ Y(I)
340 NEXT I
350 FOR I=1 TO 76
360 FOR J = 1 TO 4
370 READ M(I,J)
380 NEXT J
390 NEXT I
400 FOR I = 1 TO 64
410 LET X(I)=0
420 NEXT I
430 LET Z=1
440 PRINT "DO YOU WANT TO MOVE FIRST";
450 INPUT S$
460 IF LEFT$(S$,1)="N" THEN 630
470 IF LEFT$(S$,1)="Y" THEN 500
480 PRINT "INCORRECT ANSWER.  PLEASE TYPE 'YES' OR 'NO'.";
490 GOTO 450
500 PRINT " "
510 PRINT "YOUR MOVE";
520 INPUT J1
521 IF J1=1 THEN 2770
522 IF J1<>0 THEN 525
523 GOSUB 2550
524 GOTO 500
525 IF J1<111 THEN 2750
526 IF J1>444 THEN 2750
530 GOSUB 2500
540 LET K1=INT(J1/100)
550 LET J2=(J1-K1*100)
560 LET K2=INT(J2/10)
570 LET K3= J1 - K1*100 -K2*10
580 LET M=16*K1+4*K2+K3-20
590 IF X(M)=0 THEN 620
600 PRINT "THAT SQUARE IS USED, TRY AGAIN."
610 GOTO 500
620 LET X(M)=1
630 GOSUB 1640
640 J=1
650 I=1
660 IF J=1 THEN 720
670 IF J=2 THEN 790
680 IF J=3 THEN 930
690 I=I+1: IF I<=76 THEN 660
700 J=J+1: IF J<=3 THEN 650
710 GOTO 1300
720 IF L(I)<>4 THEN 690
730 PRINT "YOU WIN AS FOLLOWS";
740 FOR J=1 TO 4
750 LET M=M(I,J)
760 GOSUB 1570
770 NEXT J
780 GOTO 1490
790 IF L(I)<>15 THEN 690
800 FOR J=1 TO 4
810 LET M=M(I,J)
820 IF X(M)<>0 THEN 860
830 LET X(M)=5
840 PRINT "MACHINE MOVES TO";
850 GOSUB 1570
860 NEXT J
870 PRINT ", AND WINS AS FOLLOWS"
880 FOR J=1 TO 4
890 LET M=M(I,J)
900 GOSUB 1570
910 NEXT J
920 GOTO 1490
930 IF L(I)<>3 THEN 690
940 PRINT "NICE TRY. MACHINE MOVES TO";
950 FOR J=1 TO 4 
960 LET M=M(I,J)
970 IF X(M)<>0 THEN 1010
980 LET X(M)=5
990 GOSUB 1570
1000 GOTO 500
1010 NEXT J
1020 GOTO 1300
1030 I=1
1040 LET L(I)=X(M(I,1))+X(M(I,2))+X(M(I,3))+X(M(I,4))
1050 LET L = L(I)
1060 IF L <2 THEN 1130
1070 IF L>=3 THEN 1130
1080 IF L>2 THEN 2230
1090 FOR J = 1 TO 4
1100 IF X(M(I,J))<>0 THEN 1120
1110 LET X(M(I,J))=1/8
1120 NEXT J
1130 I=I+1: IF I<=76 THEN 1040
1140 GOSUB 1640
1150 I=1
1160 IF L(I)=1/2 THEN 2360
1170 IF L(I)=1+3/8 THEN 2360
1180 I=I+1: IF I<=76 THEN 1160
1190 GOTO 1830
1200 LET Z = 1
1210 IF X(Y(Z))=0 THEN 1250
1220 LET Z=Z+1
1230 IF Z<>17 THEN 1210
1240 GOTO 1720
1250 LET M=Y(Z)
1260 LET X(M)=5
1270 PRINT "MACHINE MOVES TO";
1280 GOSUB 1570
1290 GOTO 500
1300 LET X=X
1310 I=1
1320 LET L(I)=X(M(I,1))+X(M(I,2))+X(M(I,3))+X(M(I,4))
1330 LET L=L(I)
1340 IF L<10 THEN 1410
1350 IF L>=11 THEN 1410
1360 IF L>10 THEN 2230
1370 FOR J=1 TO 4
1380 IF X(M(I,J))<>0 THEN 1400
1390 LET X(M(I,J))=1/8
1400 NEXT J
1410 I=I+1: IF I<=76 THEN 1320
1420 GOSUB 1640
1430 I=1
1440 IF L(I)=.5 THEN 2360
1450 IF L(I)=5+3/8 THEN 2360
1460 I=I+1: IF I<=76 THEN 1440
1470 GOSUB 2500
1480 GOTO 1030
1490 PRINT " "
1500 PRINT "DO YOU WANT TO TRY ANOTHER GAME";
1510 INPUT X$
1520 IF LEFT$(X$,1)="Y" THEN 400
1530 IF LEFT$(X$,1)="N" THEN 1560
1540 PRINT "INCORRECT ANSWER. PLEASE TYPE 'YES' OR 'NO'";
1550 GOTO 1510
1560 STOP:RUN "MENU"
1570 LET K1=INT((M-1)/16)+1
1580 LET J2=M-16*(K1-1)
1590 LET K2=INT((J2-1)/4)+1
1600 LET K3=M-(K1-1)*16-(K2-1)*4
1610 LET M=K1*100+K2*10+K3
1620 PRINT M;
1630 RETURN
1640 FOR S=1 TO 76
1650 LET J1 = M(S,1)
1660 LET J2=M(S,2)
1670 LET J3=M(S,3)
1680 LET J4=M(S,4)
1690 LET L(S)=X(J1)+X(J2)+X(J3)+X(J4)
1700 NEXT S
1710 RETURN
1720 FOR I=1 TO 64
1730 IF X(I)<>0 THEN 1800
1740 LET X(I)=5
1750 LET M=I
1760 PRINT "MACHINE LIKES";
1770 GOSUB 1570
1780 PRINT " "
1790 GOTO 500
1800 NEXT I
1810 PRINT "THE GAME IS A DRAW."
1820 GOTO 1490
1830 FOR K=1 TO 18
1840 LET P=0
1850 FOR I=4*K-3 TO 4*K
1860 FOR J=1 TO 4
1870 LET P=P+X(M(I,J))
1880 NEXT J
1890 NEXT I
1900 IF P<4 THEN 1940
1910 IF P<5 THEN 1970
1920 IF P<9 THEN 1940
1930 IF P<10 THEN 1970
1940 NEXT K
1950 GOSUB 2500
1960 GOTO 1200
1970 LET S=1/8
1980 FOR I=4*K-3 TO 4*K
1990 GOTO 2370
2000 NEXT I
2010 LET S=0
2020 GOTO 1980
2030 DATA 1,49,52,4,13,61,64,16,22,39,23,38,26,42,27,43
2040 DATA 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
2050 DATA 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38
2060 DATA 39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56
2070 DATA 57,58,59,60,61,62,63,64
2080 DATA 1,17,33,49,5,21,37,53,9,25,41,57,13,29,45,61
2090 DATA 2,18,34,50,6,22,38,54,10,26,42,58,14,30,46,62
2100 DATA 3,19,35,51,7,23,39,55,11,27,43,59,15,31,47,63
2110 DATA 4,20,36,52,8,24,40,56,12,28,44,60,16,32,48,64
2120 DATA 1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61
2130 DATA 2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62
2140 DATA 3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63
2150 DATA 4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64
2160 DATA 1,6,11,16,17,22,27,32,33,38,43,48,49,54,59,64
2170 DATA 13,10,7,4,29,26,23,20,45,42,39,36,61,58,55,52
2180 DATA 1,21,41,61,2,22,42,62,3,23,43,63,4,24,44,64
2190 DATA 49,37,25,13,50,38,26,14,51,39,27,15,52,40,28,16
2200 DATA 1,18,35,52,5,22,39,56,9,26,43,60,13,30,47,64
2210 DATA 49,34,19,4,53,38,23,8,57,42,27,12,61,46,31,16
2220 DATA 1,22,43,64,16,27,38,49,4,23,42,61,13,26,39,52
2230 FOR J=1 TO 4
2240 IF X(M(I,J))<>1/8 THEN 2330
2250 LET X(M(I,J))=5
2260 IF L(I)<5 THEN 2290
2270 PRINT "LET'S SEE YOU GET OUT OF THIS:  MACHINE MOVES TO";
2280 GOTO 2300
2290 PRINT "YOU FOX.  JUST IN THE NICK OF TIME, MACHINE MOVES TO";
2300 LET M=M(I,J)
2310 GOSUB 1570
2320 GOTO 500
2330 NEXT J
2340 PRINT "MACHINE CONCEDES THIS GAME."
2350 GOTO 1490
2360 LET S=1/8
2370 IF I-INT(I/4)*4>1 THEN 2400
2380 LET A=1
2390 GOTO 2410
2400 LET A=2
2410 FOR J=A TO 5-A STEP 5-2*A
2420 IF X(M(I,J))=S THEN 2450
2430 NEXT J
2440 GOTO 2000
2450 LET X(M(I,J))=5
2460 LET M=M(I,J)
2470 PRINT "MACHINE TAKES";
2480 GOSUB 1570
2490 GOTO 500
2500 FOR I=1 TO 64
2510 IF X(I)<>1/8 THEN 2530
2520 LET X(I)=0
2530 NEXT I
2540 RETURN
2550 FOR XX=1 TO 9:PRINT:NEXT:FOR I=1 TO 4
2560 FOR J=1 TO 4
2562 FOR I1=1 TO J
2564 PRINT"   ";
2566 NEXT I1
2570 FOR K=1 TO 4
2600 LET Q=16*I+4*J+K-20
2610 IF X(Q)<>O THEN 2630
2620 PRINT"( )      ";
2630 IF X(Q)<>5 THEN 2650
2640 PRINT"(M)      ";
2650 IF X(Q)<>1 THEN 2660
2655 PRINT"(Y)      ";
2660 IF X(Q)<>1/8 THEN 2670
2665 PRINT"( )      ";
2670 NEXT K
2680 PRINT
2690 PRINT
2700 NEXT J
2710 PRINT
2720 PRINT
2730 NEXT I
2735 REM PRINT CHR$(12)
2740 RETURN
2750 PRINT"INCORRECT MOVE, RETYPE IT--";
2760 GOTO 520
2770 END