!***************************************************************************!
!                                                                           !
!                                TIC-TAC-TOE                                !
!                                                                           !
!***************************************************************************!
!1.0 24-Oct-84 DFP written by D. Pallmann.

       MAP1 X(9), F, 6         !rows
       MAP1 Y(9), F, 6         !columns
       MAP1 A(3,3), F, 6       !game board
       MAP1 I, F, 6            !loop index
       MAP1 J, F, 6            !loop index
       MAP1 R, F, 6            !temporary row
       MAP1 C, F, 6            !temporary column
       MAP1 MOVE, F, 6         !move input by human
       MAP1 FLAG, F, 6         !processing flag
       MAP1 GAME, F, 6         !game number
       MAP1 MOVES, F, 6        !number of moves
       MAP1 HUMAN, F, 6        !human score
       MAP1 ALPHA, F, 6        !computer score

INITIALIZE:
       FOR I = 1 TO 9
           READ X(I), Y(I)
           NEXT I
       GAME = 0
       HUMAN = 0
       ALPHA = 0

NEW'GAME:
       GAME = GAME+1
       MOVES = 0
       FOR I = 1 TO 3
           FOR J = 1 TO 3
               A(I,J) = 0
               NEXT J
           NEXT I

SCREEN: PRINT TAB(-1,0); TAB(-1,12);
       PRINT TAB(1,34); "TIC-TAC-TOE";
       PRINT TAB(-1,11);
       PRINT TAB(1,1); "GAME"; GAME;
       PRINT TAB(1,70); "HUMAN"; HUMAN;
       PRINT TAB(2,70); "ALPHA"; ALPHA;
       PRINT TAB(4,28);  "       |       |"
       PRINT TAB(5,28);  "       |       |"
       PRINT TAB(6,28);  "       |       |"
       PRINT TAB(7,28);  "-------+-------+-------"
       PRINT TAB(8,28);  "       |       |"
       PRINT TAB(9,28);  "       |       |"
       PRINT TAB(10,28); "       |       |"
       PRINT TAB(11,28); "-------+-------+-------"
       PRINT TAB(12,28); "       |       |"
       PRINT TAB(13,28); "       |       |"
       PRINT TAB(14,28); "       |       |"
       IF GAME/2=INT(GAME/2) THEN GOTO COMPUTER'MOVE

HUMAN'MOVE:
       IF MOVES=9 THEN GOTO TIE
       PRINT TAB(17,5); TAB(-1,11);
       INPUT LINE "YOUR MOVE: "; MOVE
       PRINT TAB(17,5); TAB(-1,9);
       IF MOVE<1 OR MOVE>9 THEN GOTO HUMAN'MOVE
       R = X(MOVE)
       C = Y(MOVE)
       IF A(R,C)<>0 THEN GOTO HUMAN'MOVE
       A(R,C) = 1
       MOVES = MOVES+1

PLOT'HUMAN'MOVE:
       PRINT TAB(-1,12);
       PRINT TAB(R*4,C*8+21); " X X";
       PRINT TAB(R*4+1,C*8+21); "  X";
       PRINT TAB(R*4+2,C*8+21); " X X";

CHECK'FOR'HUMAN'WIN:
       FLAG = 0
       FOR I = 1 TO 3
           IF A(I,1)=1 AND A(I,2)=1 AND A(I,3)=1 THEN FLAG = 1
           IF A(1,I)=1 AND A(2,I)=1 AND A(3,I)=1 THEN FLAG =1
           NEXT I
       IF A(1,1)=1 AND A(2,2)=1 AND A(3,3)=1 THEN FLAG = 1
       IF A(3,1)=1 AND A(2,2)=1 AND A(1,3)=1 THEN FLAG = 1
       IF FLAG=1 THEN GOTO HUMAN'WIN

COMPUTER'MOVE:
       IF MOVES=0 THEN R = INT(RND(0)*3)+1 : C = INT(RND(0)*3)+1 :&
          GOTO PLOT'COMPUTER'MOVE
       IF MOVES=9 THEN GOTO TIE
       FLAG = 0

CHECK'TO'SEE'IF'WE'CAN'WIN:
       FOR I = 1 TO 3
               IF A(I,1)=0 AND A(I,2)=2 AND A(I,3)=2 THEN R = I : C = 1 : FLAG = 1
               IF A(1,I)=0 AND A(2,I)=2 AND A(3,I)=2 THEN R = 1 : C = I : FLAG = 1
               IF A(I,2)=0 AND A(I,1)=2 AND A(I,3)=2 THEN R = I : C = 2 : FLAG = 1
               IF A(2,I)=0 AND A(1,I)=2 AND A(3,I)=2 THEN R = 2 : C = I : FLAG = 1
               IF A(I,3)=0 AND A(I,1)=2 AND A(I,2)=2 THEN R = I : C = 3 : FLAG = 1
               IF A(3,I)=0 AND A(1,I)=2 AND A(2,I)=2 THEN R = 3 : C = I : FLAG = 1
           NEXT I
       IF A(1,1)=0 AND A(2,2)=2 AND A(3,3)=2 THEN R = 1 : C = 1 : FLAG = 1
       IF A(2,2)=0 AND A(1,1)=2 AND A(3,3)=2 THEN R = 2 : C = 2 : FLAG = 1
       IF A(3,3)=0 AND A(1,1)=2 AND A(2,2)=2 THEN R = 3 : C = 3 : FLAG = 1
       IF A(3,1)=0 AND A(2,2)=2 AND A(1,3)=2 THEN R = 3 : C = 1 : FLAG = 1
       IF A(2,2)=0 AND A(1,3)=2 AND A(3,1)=2 THEN R = 2 : C = 2 : FLAG = 1
       IF A(1,3)=0 AND A(3,1)=2 AND A(2,2)=2 THEN R = 1 : C = 3 : FLAG = 1
       IF FLAG=1 THEN GOTO PLOT'COMPUTER'MOVE

CHECK'TO'SEE'IF'WE'CAN'PREVENT'HUMAN'FROM'WINNING:
       FOR I = 1 TO 3
               IF A(I,1)=0 AND A(I,2)=1 AND A(I,3)=1 THEN R = I : C = 1 : FLAG = 1
               IF A(1,I)=0 AND A(2,I)=1 AND A(3,I)=1 THEN R = 1 : C = I : FLAG = 1
               IF A(I,2)=0 AND A(I,1)=1 AND A(I,3)=1 THEN R = I : C = 2 : FLAG = 1
               IF A(2,I)=0 AND A(1,I)=1 AND A(3,I)=1 THEN R = 2 : C = I : FLAG = 1
               IF A(I,3)=0 AND A(I,1)=1 AND A(I,2)=1 THEN R = I : C = 3 : FLAG = 1
               IF A(3,I)=0 AND A(1,I)=1 AND A(2,I)=1 THEN R = 3 : C = I : FLAG = 1
           NEXT I
       IF A(1,1)=0 AND A(2,2)=1 AND A(3,3)=1 THEN R = 1 : C = 1 : FLAG = 1
       IF A(2,2)=0 AND A(1,1)=1 AND A(3,3)=1 THEN R = 2 : C = 2 : FLAG = 1
       IF A(3,3)=0 AND A(1,1)=1 AND A(2,2)=1 THEN R = 3 : C = 3 : FLAG = 1
       IF A(3,1)=0 AND A(2,2)=1 AND A(1,3)=1 THEN R = 3 : C = 1 : FLAG = 1
       IF A(2,2)=0 AND A(1,3)=1 AND A(3,1)=1 THEN R = 2 : C = 2 : FLAG = 1
       IF A(1,3)=0 AND A(3,1)=1 AND A(2,2)=1 THEN R = 1 : C = 3 : FLAG = 1
       IF FLAG=1 THEN GOTO PLOT'COMPUTER'MOVE

CHECK'TO'SEE'IF'WE'CAN'GET'A'GOOD'LOCATION:
       IF A(2,2)=0 THEN R = 2 : C = 2 : GOTO PLOT'COMPUTER'MOVE
       IF A(1,1)=0 THEN R = 1 : C = 1 : GOTO PLOT'COMPUTER'MOVE
       IF A(3,3)=0 THEN R = 3 : C = 3 : GOTO PLOT'COMPUTER'MOVE
       IF A(1,3)=0 THEN R = 1 : C = 3 : GOTO PLOT'COMPUTER'MOVE
       IF A(3,1)=0 THEN R = 3 : C = 1 : GOTO PLOT'COMPUTER'MOVE

CHECK'TO'SEE'IF'WE'CAN'GO'ANYWHERE'AT'ALL:
       FOR I = 1 TO 3
           FOR J = 1 TO 3
               IF A(I,J)=0 THEN R = I : C = J : FLAG = 1
               NEXT J
           NEXT I
       IF FLAG=0 THEN GOTO TIE

PLOT'COMPUTER'MOVE:
       MOVES = MOVES+1
       A(R,C) = 2
       PRINT TAB(-1,12);
       PRINT TAB(R*4,C*8+21); " OOO";
       PRINT TAB(R*4+1,C*8+21); " O O";
       PRINT TAB(R*4+2,C*8+21); " OOO";

CHECK'FOR'COMPUTER'WIN:
       FLAG = 0
       FOR I = 1 TO 3
           IF A(I,1)=2 AND A(I,2)=2 AND A(I,3)=2 THEN FLAG = 1
           IF A(1,I)=2 AND A(2,I)=2 AND A(3,I)=2 THEN FLAG =1
           NEXT I
       IF A(1,1)=2 AND A(2,2)=2 AND A(3,3)=2 THEN FLAG = 1
       IF A(3,1)=2 AND A(2,2)=2 AND A(1,3)=2 THEN FLAG = 1
       IF FLAG=0 THEN GOTO HUMAN'MOVE

COMPUTER'WIN:
       PRINT TAB(17,32); "***  I WIN  ***"
       ALPHA = ALPHA+1
       GOTO CONTINUE

HUMAN'WIN:
       PRINT TAB(17,28); "***  CONGRATULATIONS ***"
       HUMAN = HUMAN+1
       GOTO CONTINUE

TIE:    PRINT TAB(17,32); "***  A  TIE  ***"

CONTINUE:
       PRINT TAB(19,25); "PRESS [RETURN] FOR ANOTHER GAME  ";
       INPUT LINE I
       GOTO NEW'GAME

DATA:   DATA 3,1, 3,2, 3,3, 2,1, 2,2, 2,3, 1,1, 1,2, 1,3

       END