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 RETURN |