10 REM TICTAC
20 GOSUB 1180:REM INITIALISE
30 REM -- PREGAME SETTINGS --
40 FOR J=1 TO 9
50 A(J)=32
60 NEXT J
70 FOR J=1 TO 5
80 D(J)=0
90 NEXT J
100 COUNT=0
110 R$=""
120 GOSUB 1070:REM PRINT BOARD
130 REM -- MAIN CYCLE --
140 WHILE R$="":GOSUB 540:REM AMSTRAD MOVE
150 GOSUB 1070:REM PRINT BOARD
160 GOSUB 870:REM WIN CHECK
170 IF R$<>"" THEN 240
180 GOSUB 980:REM ACCEPT HUMAN MOVE
190 GOSUB 1070:REM PRINT BOARD
200 GOSUB 870:REM WIN CHECK
210 WEND
220 REM -- REM END MAIN CYCLE --
230 REM ------------------------
240 REM -- END OF GAME --
260 PRINT:PRINT
270 IF R$="W" THEN PRINT TAB(8);"I WIN":FLAG=-1
280 IF R$="L" THEN PRINT TAB(8);"YOU WIN":FLAG=1
290 IF R$="D" THEN PRINT TAB(6);"IT'S A DRAW":GOTO 430
300 REM -- UPDATE KNOWLEDGE BASE --
310 FOR B=1 TO 5
320 FOR J=2 TO 9
330 IF (J)=D(B) THEN GOSUB 370
340 NEXT J
350 NEXT B
360 GOTO 430
370 REM -- RE-ORDER M ARRAY ELEMENTS --
380 TEMP=M(J+FLAG)
390 M(J+FLAG)=M(J)
400 M(J)=TEMP
410 J=9
420 RETURN
430 PRINT:PRINT
440 PRINT "THIS IS MY UPDATED PRIORITY"
450 PRINT:PRINT
460 FOR J=1 TO 9
470 PRINT M(J);" ";
480 NEXT J
490 PRINT:PRINT
500 PRINT "PRESS <ENTER> TO CONTINUE"
510 WHILE INKEY$="":WEND
520 SOUND 5,100:SOUND 5,150:SOUND 5,100:GOTO 30
530 REM --------------------
540 REM AMSTRAD MOVE
550 P=ASC("O")
560 X=0
570 J=1
580 IF A(W(J))=A(W(J+1)) AND A(W(J+2))=32 AND A(W(J))=P THEN X=W(J+2):GOTO 750
590 IF A(W(J))=A(W(J+2)) AND A(W(J+1))=32 AND A(W(J))=P THEN X=W(J+1):GOTO 750
600 IF A(W(J+1))=A(W(J+2)) AND A(W(J))=32 AND A(W(J+1))=P THEN X=W(J):GOTO 750
610 IF J<21 THEN J=J+3:GOTO 580
620 IF P=ASC("O") THEN P=ASC("X"):GOTO 570
630 REM - IF NO WIN/BLOCK MOVE FOUND -
640 REM - THEN THIS SECTION IS USED --
650 J=1
660 IF A(M(J))=32 THEN X=M(J):GOTO 750
670 IF J<9 THEN J=J+1:GOTO 660
680 H=0
690 H=H+1
700 X=INT(RND*9)+1:IF A(X)=32 THEN 750
710 IF H<100 THEN 690
720 R$="D":REM IT IS A DRAW
730 SOUND 5,260:RETURN
740 REM ----------
750 REM MAKE MOVE
760 A(X)=ASC("O")
770 COUNT=COUNT+1
780 D(COUNT)=X
790 FLAG=0
800 FOR J=1 TO 9
810 IF A(J)=32 THEN FLAG=1
820 NEXT J
830 IF FLAG=0 AND R$="" THEN R$="D"
840 REM IF ALL POSITIONS FULL, AND R$ IS NOT ASSIGNED, IT IS A DRAW
850 RETURN
860 REM ------------
870 REM WIN CHECK
880 J=1
890 IF A(W(J))=32 THEN J=J+3
900 IF J>23 THEN RETURN
910 IF A(W(J))=A(W(J+1)) AND A(W(J))=A(W(J+2)) THEN 940
920 IF J<22 THEN J=J+3:GOTO 890
930 RETURN
940 IF A(W(J))=ASC("O") THEN R$="W":REM AMSTRAD WINS
950 IF A(W(J))=ASC("X") THEN R$="L":REM AMSTRAD LOSES
960 RETURN
970 REM -------------
980 REM HUMAN MOVE
990 PRINT:PRINT:SOUND 5,190
1000 PRINT TAB(5);"ENTER YOUR MOVE"
1010 MVE$="":MVE=0:WHILE MVE$<"1" OR MVE$>"9":MVE$=INKEY$:WEND
1020 MVE=VAL(MVE$):PRINT TAB(10);MVE
1030 IF A(MVE)<>32 THEN 1010
1040 A(MVE)=ASC("X")
1050 RETURN
1060 REM --------------
1070 REM PRINT BOARD
1080 SOUND 5,89:LOCATE 1,4
1090 PEN 3
1100 PRINT TAB(6);"1 : 2 : 3    ";:PEN 1:PRINT CHR$(A(1));" : ";CHR$(A(2));" : ";CHR$(A(3))
1110 PEN 3:PRINT TAB(6);"---------   ";:PEN 1:PRINT " ---------"
1120 PEN 3:PRINT TAB(6);"4 : 5 : 6    ";:PEN 1:PRINT CHR$(A(4));" : ";CHR$(A(5));" : ";CHR$(A(6))
1130 PEN 3:PRINT TAB(6);"---------   ";:PEN 1:PRINT " ---------"
1140 PEN 3:PRINT TAB(6);"7 : 8 : 9    ";:PEN 1:PRINT CHR$(A(7));" : ";CHR$(A(8));" : ";CHR$(A(9))
1150 CLS #1
1160 LOCATE 1,10:PEN 2:RETURN
1170 REM ---------------
1180 REM INITIALISATION
1190 MODE 1:BORDER 6:INK 0,6:INK 1,26:INK 2,24:INK 3,0:PAPER 0:PEN 1
1195 WINDOW #1,1,40,10,22
1200 DIM A(9):REM TO HOLD BOARD
1210 DIM M(10):REM FOR KNOWLEDGE BASE
1220 DIM W(24):REM WIN/BLOCK DATA
1230 DIM D(5):REM TO HOLD MOVES IN                         CURRENT GAME
1240 REM WIN/BLOCK DATA
1250 FOR J=1 TO 24
1260 READ W(J):CHECKSUM=CHECKSUM+W(J)
1270 NEXT J:IF CHECKSUM<>120 THEN PRINT "ERROR IN WIN/BLOCK DATA":END ELSE PRINT "WIN/BLOCK DATA OK"
1280 DATA 1,2,3,4,5,6,7,8,9
1290 DATA 1,4,7,2,5,8,3,6,9
1300 DATA 1,5,9,3,5,7
1310 REM INITIAL KNOWLEDGE BASE
1320 FOR J=1 TO 10
1330 READ M(J):CHECKSUM=CHECKSUM+M(J)
1340 NEXT J:IF CHECKSUM<>167 THEN PRINT "INITIAL KNOWLEDGE BASE DATA ERROR":END ELSE PRINT "INITIAL KNOWLEDGE BASE DATA OK"
1350 DATA 2,6,8,4,7,3,1,9,5,2
1360 FOR J=1 TO 1000:NEXT J:CLS
1370 RETURNDATA ERROR":END ELSE PRINT "INITIAL KNOWLEDGE BASE DATA OK"
1350 DATA 2,6,8,4,7,3,1,9,5,2
1360 FOR J=1 TO 1000:NEXT J:CLS
1370 RETURN