7 PRINT TAB(-1,0);"*** QUBIC - 3D TIC-TAC-TOE - VER 1.0 ***"
8 PRINT : INPUT "DO YOU WANT INSTRUCTIONS (Y/N)? ";C$
9 IF C$="N" THEN 20
10 IF C$<>"Y" THEN PRINT "ENTER ONLY 'Y' FOR YES AND 'N' FOR NO" : GOTO 8
11 PRINT : PRINT "THE GAME IS TIC-TAC-TOE ON A 4 X 4 X 4 CUBE."
12 PRINT "EACH MOVE IS INDICATED BY A NUMBER IN THE RANGE 0 TO 64."
13 PRINT "ENTER 0 TO GET THE BOARD DISPLAYED,"
14 PRINT "ENTER 99 TO END THE GAME EARLY, YOU QUITTER, OTHERWISE,"
16 PRINT " 1-16 INDICATES THE LOWEST PLANE OF THE BOARD."
17 PRINT "17-32 INDICATES THE SECOND LOWEST PLANE OF THE BOARD,"
18 PRINT "33-48 INDICATES THE SECOND HIGHEST AND,"
19 PRINT "49-64 INDICATES THE HIGHEST LEVEL.  GOOD LUCK, YOU'LL NEED IT."
20 DIM X(64),L(76),M(76,4),Y(16)
21 RESTORE
22 FOR I=1 TO 16
23    READ Y(I)
24 NEXT I
25 FOR I=1 TO 76
26    FOR J=1 TO 4
27       READ M(I,J)
28    NEXT J
29 NEXT I
35 FOR I=1 TO 64
40    X(I)=0
50 NEXT I
51 Z=1
54 STRSIZ 80
55 PRINT CHR$(7) : INPUT "DO YOU WANT TO MOVE FIRST (Y/N)? ";S$
66 IF S$="N" THEN 110
67 IF S$<>"Y" THEN PRINT "ENTER ONLY 'Y' FOR YES AND 'N' FOR NO" : GOTO 55
70 PRINT : PRINT CHR(7);"YOUR MOVE"; : INPUT MM
71 IF MM=99 THEN 505
72 IF (MM<0) OR (MM>64) THEN PRINT"INVALID#, TRY AGAIN";CHR(7); : GOTO 70
73 IF MM<>0 THEN 98
74 FOR I=1 TO 64 STEP 16
75    FOR J=I TO I+15 STEP 4
76       XLINE$=" "
77       FOR K=J TO J+3
78          C$=".  "
79          IF X(K)=1 THEN C$="X  "
80          IF X(K)=5 THEN C$="O  "
81          XLINE$=XLINE$+C$
82       NEXT K
83       XLINE$=XLINE$+" "
84       IF J<9 THEN PRINT TAB(I-2);" ";J;XLINE$;" ";J+3
85       IF J=9 THEN PRINT TAB(I-2);" ";J;XLINE$;J+3
86       IF J>9 THEN PRINT TAB(I-2);J;XLINE$;J+3
87    NEXT J
88 NEXT I
89 GOTO 70
98 GOSUB 1800
99 IF X(MM)<>0 THEN PRINT "THAT SQUARE IS OCCUPIED, TRY AGAIN";CHR(7); : GOTO 70
109 X(MM)=1
110 GOSUB 1050
180 FOR J=1 TO 3
190    FOR I=1 TO 76
191       IF J=1 GOTO 210
192       IF J=2 GOTO 220
193       IF J=3 GOTO 235
205    NEXT I
206 NEXT J
207 GOTO 400
210 IF L(I)<>4 THEN 205
211 PRINT "YOU WIN AS FOLLOWS ";
212 FOR J=1 TO 4
213    MM=M(I,J)
214    PRINT MM;
216 NEXT J
217 GOTO 505
220 IF L(I)<>15 THEN 205
221 FOR J=1 TO 4
222    MM=M(I,J)
223    IF X(MM)<>0 THEN 227
224    X(MM)=5
225    PRINT "MACHINE MOVES TO ";
226    PRINT MM;
227 NEXT J
228 PRINT ", AND WINS AS FOLLOWS"
229 FOR J=1 TO 4
230    PRINT M(I,J)
233 NEXT J
234 GOTO 505
235 IF L(I)<>3 THEN 205
236 PRINT "NICE TRY, MACHINE MOVES TO ";
237 FOR J=1 TO 4
238    MM=M(I,J)
239    IF X(MM)<>0 THEN 245
240    X(MM)=5
241    PRINT MM;
243    GOTO 70
245 NEXT J
248 GOTO 400
250 FOR I=1 TO 76
251    L(I)=X(M(I,1))+X(M(I,2))+X(M(I,3))+X(M(I,4))
252    LL=L(I)
255    IF LL<2 THEN 290
260    IF LL>=3 THEN 290
265    IF LL>2 THEN 1600
270    FOR J=1 TO 4
275       IF X(M(I,J))<>0 THEN 285
280       X(M(I,J))=.125
285    NEXT J
290 NEXT I
295 GOSUB 1050
300 FOR I=1 TO 76
305    IF L(I)=.5 THEN 1700
310    IF L(I)=1.375 THEN 1700
315 NEXT I
320 GOTO 1300
360 Z=1
362 IF X(Y(Z))=0 THEN 380
365 Z=Z+1
368 IF Z<>17 THEN 362
375 GOTO 1200
380 MM=Y(Z)
381 X(MM)=5
385 PRINT "MACHINE MOVES TO ";
389 PRINT MM;
390 GOTO 70
400 XX=XX
410 FOR I=1 TO 76
412    L(I)=X(M(I,1))+X(M(I,2))+X(M(I,3))+X(M(I,4))
415    LL=L(I)
420    IF LL<10 THEN 455
425    IF LL>=11 THEN 455
430    IF LL>10 THEN 1600
435    FOR J=1 TO 4
440       IF X(M(I,J))<>0 THEN 450
445       X(M(I,J))=.125
450    NEXT J
455 NEXT I
470 GOSUB 1050
475 FOR I=1 TO 76
480    IF L(I)=.5 THEN 1700
485    IF L(I)=5.375 THEN 1700
490 NEXT I
492 GOSUB 1800
493 GOTO 250
505 PRINT CHR$(7) : INPUT "DO YOU WANT TO TRY ANOTHER GAME (Y/N)? ";X$
515 IF X$="Y" THEN 35
516 IF X$<>"N" THEN PRINT "ENTER 'Y' FOR YES AND 'N' FOR NO" : GOTO 505
520 CHAIN "DSK1:DEMO[20,20]"
1050 FOR S=1 TO 76
1060    J1=M(S,1)
1070    J2=M(S,2)
1080    J3=M(S,3)
1090    J4=M(S,4)
1100    L(S)=X(J1)+X(J2)+X(J3)+X(J4)
1110 NEXT S
1120 RETURN
1200 FOR I=1 TO 64
1210    IF X(I)<>0 THEN 1250
1220    X(I)=5
1225    MM=I
1226    PRINT "MACHINE LIKES ";
1227    PRINT MM;
1228    PRINT " "
1230    GOTO 70
1250 NEXT I
1252 PRINT "THE GAME IS A DRAW!";CHR$(7)
1255 GOTO 505
1300 FOR K=1 TO 18
1305    P=0
1310    FOR I=4*K-3 TO 4*K
1315       FOR J=1 TO 4
1320          P=P+X(M(I,J))
1325       NEXT J
1330    NEXT I
1345    IF P<4 THEN 1390
1350    IF P<5 THEN 1400
1355    IF P<9 THEN 1390
1360    IF P<10 THEN 1400
1390 NEXT K
1395 GOSUB 1800
1396 GOTO 360
1400 S=.125
1405 FOR I=4*K-3 TO 4*K
1410    GOTO 1703
1415 NEXT I
1420 S=0
1425 GOTO 1405
1500 DATA 1,49,52 4 13,61,64,16,22,39,23,38,26,42,27,43
1510 DATA 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
1520 DATA 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38
1521 DATA 39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56
1522 DATA 57,58,59,60,61,62,63,64
1523 DATA 1,17,33,49,5,21,37,53,9,25,41,57,13,29,45,61
1524 DATA 2,18,34,50,6,22,38,54,10,26,42,58,14,30,46,62
1525 DATA 3,19,35,51,7,23,39,55,11,27,43,59,15,31,47,63
1527 DATA 4,20,36,52,8,24,40,56,12,28,44,60,16,32,48,64
1529 DATA 1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61
1532 DATA 2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62
1534 DATA 3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63
1536 DATA 4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64
1538 DATA 1,6,11,16,17,22,27,32,33,38,43,48,49,54,59,64
1540 DATA 13,10,7,4,29,26,23,20,45,42,39,36,61,58,55,52
1542 DATA 1,21,41,61,2,22,42,62,3,23,43,63,4,24,44,64
1544 DATA 49,37,25,13,50,38,26,14,51,39,27,15,52,40,28,16
1546 DATA 1,18,35,52,5,22,39,56,9,26,43,60,13,30,47,64
1548 DATA 49,34,19,4,53,38,23,8,57,42,27,12,61,46,31,16
1550 DATA 1,22,43,64,16,27,38,49,4,23,42,61,13,26,39,52
1600 FOR J=1 TO 4
1605    IF X(M(I,J))<>.125 THEN 1650
1610    X(M(I,J))=5
1615    IF L(I)<5 THEN 1625
1620    PRINT "LET'S SEE YOU GET OUT OF THIS: MACHINE MOVES TO ";
1622    GOTO 1626
1625    PRINT "YOU FOX.  JUST IN THE NICK OF TIME, MACHINE MOVES TO ";
1626    MM=M(I,J)
1630    PRINT MM;
1640    GOTO 70
1650 NEXT J
1660 PRINT "MACHINE CONCEDES THIS GAME.";CHR$(7)
1665 GOTO 505
1700 S=.125
1703 IF I-INT(I/4)*4>1 THEN 1715
1705 A=1
1710 GOTO 1720
1715 A=2
1720 FOR J=A TO 5-A STEP 5-2*A
1725    IF X(M(I,J))=S THEN 1750
1730 NEXT J
1735 GOTO 1415
1750 X(M(I,J))=5
1755 MM=M(I,J)
1760 PRINT "MACHINE TAKES ";
1770 PRINT MM;
1780 GOTO 70
1800 FOR I=1 TO 64
1810    IF X(I)<>.125 THEN 1850
1815    X(I)=0
1850 NEXT I
1860 RETURN
9999 END