REM tic tac toe GOSUB 1180:REM init 30 REM pre game settings FOR J=1 TO 9 A(J)=32 NEXT J FOR J=1 TO 5 D(J)=0 NEXT J 100 COUNT=0 110 R$="" 120 GOSUB 1070:REM print board 130 REM main cycle 140 GOSUB 540:REM machine move GOSUB 1070:REM PRINT BOARD GOSUB 870:REM win check IF R$<>""THEN 240 GOSUB 980:REM human move GOSUB 1070:REM print board GOSUB 870:REM win check 210 IF R$="" THEN 140 REM end main cycle REM 240 REM end of game 250 GOSUB 1070:REM print board REM IF R$="W" THEN PRINT "I WIN";:FLAG=-1 IF R$="L" THEN PRINT "YOU WIN";:FLAG=1 IF R$="D" THEN PRINT "DRAW";:FLAG=1 300 REM update knowledge base 310 FOR B=1 TO 5 320 FOR J=2 TO 9 IF M(J)=D(B) THEN GOSUB 370 NEXT J 350 NEXT B 360 GOTO 430 370 REM reorder elements in array 380 TEMP=M(J+FLAG) 390 M(J+FLAG)=M(J) 400 M(J)=TEMP 410 J=9 420 RETURN 430 REM 440 PRINT " - Updating priority " 460 FOR J=1TO 9 PRINT M(J);" "; NEXT J 490 PRINT 495 GOTO 30 500 INPUT "Press return to continue";A$ 520 cls: GOTO 30 530 REM 540 REM machine 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 next section used 650 J=1 660 IF A(M(J))=32 THEN X=M(J):GOTO 750 670 IF J<10 THEN J=J+1:GOTO 660 680 H=0 690 H=H+1 700 X=INT(RND(1)*9):IF A(X)=32 THEN 750 710 IF H<100 THEN 690 720 R$="D":REM draw 730 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 filled, and r$ not assigned, draw 850 RETURN 860 REM 870 REM win check 880 J=1 890 IF A(W(J))=32 THEN J=J+3:IF J<22 THEN GOTO 890 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" 950 IF A(W(J))=ASC("X") THEN R$="L" 960 RETURN 970 REM 980 REM human move 990 REM 1000 PRINT 1010 ' INPUT "Enter move ";MOVE 1015 MOVE = RAND(9) 1020 IF MOVE<1 OR MOVE >9 THEN 1010 1030 IF A(MOVE)<>32 THEN 1010 1040 A(MOVE)=ASC("X") 1050 RETURN 1060 REM 1070 REM print board 1080 locate 1,1 : 'PRINT@0,""; PRINT " 7 ! 8 ! 9 ";CHR$(A(7));" ! ";CHR$(A(8));" ! ";CHR$(A(9)) PRINT "---+---+--- ---+---+---" PRINT " 4 ! 5 ! 6 ";CHR$(A(4));" ! ";CHR$(A(5));" ! ";CHR$(A(6)) PRINT "---+---+--- ---+---+---" PRINT " 1 ! 2 ! 3 ";CHR$(A(1));" ! ";CHR$(A(2));" ! ";CHR$(A(3)) REM REM RETURN 1180 REM init CLS DIM A(9):REM board DIM M(10):REM hold knowledge DIM W(24):REM win/block data DIM D(5):REM moves REM win/block data FOR J=1 TO 24 READ W(J) NEXT J 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 init knowledge base 1320 FOR J=1 TO 10 READ M(J) NEXT J 1350 DATA 2,6,8,4,7,3,1,9,5,2 RETURN