   REM OTHELO/REVERSI
   REM BASED ON TIM HARTNELL'S OTHELO/REVERSI IN
   REM GIANT BOOK OF COMPUTER GAMES, BALLANTINE BOOKS,
   REM NEW YORK, 1984
   REM ADAPTED TO AMIGA BY LOREN LINSTROM
   DEFINT A-Z
   RANDOMIZE TIMER
   PALETTE 1,.9,.5,.2: 
   PALETTE 2,.4,.3,.3: 
   PALETTE 3,.6,.6,.6:    
   REM Calculate size of arrays for pieces
   X1=  9: X2= 33: X3= (X1 + X2) / 2: R= (X2 - X1) / 2
   Y1= 14: Y2= 26: Y3= (Y1 + Y2) / 2
   D= 6+(Y2-Y1+1)*2*INT((X2-X1+16)/16)*2 /2
   DIM P(90),OLD(90),v(90),alp$(8),OH(D),EX(D),MARK(D)
   CIRCLE (X3,Y3),R,2: PAINT (X3,Y3),3,2
   GET (X1,Y1)-(X2,Y2),OH: PUT (X1,Y1),OH
   CIRCLE (X3,Y3),R,1: PAINT (X3,Y3),2,1
   GET (X1,Y1)-(X2,Y2),EX: PUT (X1,Y1),EX
   LINE (X3-1,Y3-.5)-(X3+1,Y3+.5),1,b
   GET (X1,Y1)-(X2,Y2),MARK: PUT (X1,Y1),MARK
   REM set coordinates for board
   X0= 112: DX= 34: Y0= 5: DY= 16: ' First Y is line 1
   FOR I= 1 TO 8: alp$(I)= CHR$(I+64): NEXT I
   REM set up weights for each corner
   FOR I= 10 TO 73 STEP 63: FOR J= 0 TO 7 STEP 7: v(I+J)= 16: NEXT J,I
   REM next to corner on outside
   FOR I= 11 TO 74 STEP 63: FOR J= 0 TO 5 STEP 5: v(I+J)= 4: NEXT J,I
   FOR I= 19 TO 64 STEP 45: FOR J= 0 TO 7 STEP 7: v(I+J)= 4: NEXT J,I
   REM rest of outside edge
   FOR I= 12 TO 75 STEP 63: FOR J= 0 TO 3: v(I+J)= 8: NEXT J,I
   FOR I= 28 TO 55 STEP 9: FOR J= 0 TO 7 STEP 7: v(I+J)= 8: NEXT J,I
   REM first square inside edge squares
   v(20)= 1: v(25)= 1: v(65)= 1: v(70)= 1
   FOR I= 21 TO 66 STEP 45: FOR J= 0 TO 3: v(I+J)= 2: NEXT J,I
   FOR I= 29 TO 56 STEP 9: FOR J= 0 TO 5 STEP 5: v(I+J)= 2: NEXT J,I
   REM rest of board
   FOR I= 30 TO 57 STEP 9: FOR J= 0 TO 3: v(I+J)= 4: NEXT J,I
   uwin= 0: mewin= 0: GOTO 800
   REM Code to print values for each square
   FOR I= 0 TO 81 STEP 9: PRINT: PRINT SPACE$(14);
    FOR J= 0 TO 8
     I2= v(I+J): IF I2 < 10 THEN PRINT "  " I2; ELSE PRINT " " I2;
    NEXT J: IF I+J = 90 THEN PRINT " " v(90) ELSE PRINT
   NEXT I: LINE (154,20)-(474,146),1,b
   END 
40 GAIN = 0: M= 0
   '
   'Look for all possible moves for the computer
   '
    FOR I= 10 TO 80
    IF P(I) <> 3 THEN 210: 'Check for unused square
    Q = 0: wt= v(I)
    FOR C = -1 TO 1: FOR R = -9 TO 9 STEP 9
    K = 0: F = I: DEL= C + R
100 IF P(F + DEL) <> 1 THEN GOTO 130: 'Check for one of yours
    K = K + 2: F = F + DEL
    GOTO 100
130 IF P(F + DEL) <> 2 THEN GOTO 140: 'Check for one of mine
    Q = Q + K
    GOTO 150
140 IF wt <> 8 THEN 150: ' Not major edge position
    IF K > 0 AND v(I + DEL) = 8 THEN wt= 4
150 NEXT R: NEXT C
    '
    'Evaluate each possible move
    '
    Q= Q * wt
    IF Q < GAIN OR (RND < .3 AND Q = GAIN) THEN GOTO 210
    GAIN = Q: M = I
210 NEXT I
    IF GAIN = 0 AND RG = 0 THEN GOTO 690
    IF GAIN = 0 THEN GOTO 250
    S= 1: T= 2: GOSUB 580
    GOSUB 370 'TO DISPLAY BOARD
250 LOCATE 22,19: PRINT SPACE$(60);
    LOCATE 22,31 
    IF GAIN <> 0 THEN
      N= M MOD 9: MV= INT(M / 9)
      PRINT "My move was "; alp$(N); 9-MV;
    ELSE
      PRINT "I could not move";
    END IF
254 LOCATE 23,19
    PRINT "Your turn (letter-number, or mouse) ...";
    MOU0= MOUSE(0)
260 H$= INKEY$: MOU0= MOUSE(0)
    IF MOU0 > 0 THEN
      RG= INT((MOUSE(5) - X0 - DX) / DX)
      IF RG < 1 OR RG > 8 THEN 262
      v= INT((MOUSE(6) - Y0) / DY)
      IF v < 1 OR v > 8 THEN 262
      H$= alp$(RG): V2= 9 - v
      GOTO 270
    END IF
262 IF H$ = "" THEN 260
    H$= UCASE$(H$): RG= 0
    IF H$ = "0" THEN 360
    FOR I= 1 TO 8
      IF H$ = alp$(I) THEN RG= I 
    NEXT I 
    IF RG = 0 THEN 254     
264 S$= INKEY$: IF S$ = "" THEN 264
    V2= VAL(S$): IF V2 > 8 THEN 264
    IF V2 < 1 THEN 264
    v= 9 - V2   
270 REM ENTER 0 TO PASS

290 IF RG = 0 THEN GOTO 350
    M= 9 * v + RG
    LOCATE 23,19: PRINT SPACE$(60);
    LOCATE 23,30: PRINT "Your move was " H$ V2;
    S = 2: T = 1: GOSUB 580 'Flip pieces on board
350 GOSUB 370 'PRINT BOARD
360 LOCATE 22,19: PRINT SPACE$(60);
    IF RG = 0 THEN
      LOCATE 22,23: PRINT "You did not move this turn"
    ELSE
      LOCATE 22,30: PRINT "Your move was " H$ V2;
    END IF
365 LOCATE 23,19: PRINT SPACE$(60);
    LOCATE 23,31: PRINT "My move is ...";
    GOTO 40
370 REM COMPUTE SCORE AND DISPLAY CURRENT BOARD
    C = 0: H = 0: Y= Y0 
    REM for each row
    FOR I= 10 TO 73 STEP 9
     Y= Y + DY: X= X0 + DX
     REM for each column 
     FOR J= 0 TO 7
      X= X + DX: IJ= I + J
      Z= P(IJ)
      ON Z GOTO Proh, Prex, Dot, Dot
Proh: H= H + 1
      IF OLD(IJ) <> 1 THEN 
       OLD(IJ)= 1
       PUT (X,Y), OH, PSET
      END IF: GOTO Dot
Prex: C= C + 1
      IF OLD(IJ) <> 2 THEN 
       OLD(IJ)= 2
       PUT (X,Y), EX, PSET
      END IF
Dot: NEXT J
    NEXT I
    REM print scores
    Lz= 13: IF C >= 10 THEN Lz= 12
    LOCATE 12,Lz: PRINT C
    LOCATE 12,65: PRINT H
    IF C + H >= 64 OR C = 0 OR H = 0 THEN 700
570 RETURN

    '
    'Flip pieces as necessary
    'Start with the piece at P(M)
    '
580 REM Is this an empty square
    IF P(M) <>  3 THEN RG=0: GOTO 360
    Check=0: T1= 523: T2= 660: T3= 701
    IF T = 1 THEN T1= 1046: T2= 1318: T3= 1397
    FOR C= -1 TO 1: FOR R = -9 TO 9 STEP 9
    IF C = 0 AND R = 0 THEN 670
    F = M: DEL= C + R
    '
    'Check along this line
    'S is the opponents color
    'T is the color of the piece just placed
    '
600 IF P(F + DEL) <> S THEN GOTO 630: 'Follow down this line
    F = F + DEL
    GOTO 600
630 IF P(F + DEL) <> T THEN GOTO 670: 'One of ours at the end
640 P(F) = T
    T4= T1: T1= T2: T2= T3: T3= T4
    SOUND T4,2,100,0
    IF M = F THEN GOTO 670
    Check= Check + 1
    F = F - DEL: GOTO 640
670 NEXT R: NEXT C
    IF Check = 0 THEN RG=0: P(M)= 3: GOTO 360
    IF P(M - 10) = 4 THEN P(M - 10) = 3
    IF P(M - 9) = 4 THEN P(M - 9) = 3
    IF P(M - 8) = 4 THEN P(M - 8) = 3
    IF P(M - 1) = 4 THEN P(M - 1) = 3
    IF P(M + 1) = 4 THEN P(M + 1) = 3
    IF P(M + 8) = 4 THEN P(M + 8) = 3
    IF P(M + 9) = 4 THEN P(M + 9) = 3
    IF P(M + 10) = 4 THEN P(M + 10) = 3
680 RETURN

690 GOSUB 370 'PRINT BOARD
700 LOCATE 22,1: PRINT SPACE$(70);: LOCATE 22,30: 
    IF C > H THEN PRINT "I'M THE CHAMP!";: mewin= mewin + 1
710 IF H > C THEN PRINT "YOU'RE THE CHAMP!";: uwin= uwin + 1
720 IF H = C THEN PRINT "IT'S A DRAW!";
    GOSUB 880
    LOCATE 23,1: PRINT SPACE$(70);
    LOCATE 23,27: PRINT "Play again, (Y) or N?";
    LOCATE 2,1
722 R$= INKEY$: IF R$ = "" THEN 722
    CLS
    IF R$ = "N" OR R$ = "n" THEN SYSTEM
    REM begin play
800 P = 0: LOCATE 8,20
    PRINT "DO YOU WANT THE FIRST MOVE, Y OR (N)?"
840 w$= INKEY$: IF w$ = "" THEN 840
    CLS: 'Set up playing board
    GOSUB 880
    LOCATE 2,25
    PRINT "A   B   C   D    E   F   G   H": PRINT
    Y= Y0 
    REM for each row
    FOR I= 10 TO 73 STEP 9
     Y= Y + DY: X= X0 + DX
     b= I / 9 + 1
     PRINT TAB(19) 10-b SPACE$(36) 10-b: PRINT
     FOR J= 0 TO 7
      X= X + DX
      PUT (X,Y), MARK, PSET
      P(I+J)= 4: OLD(I+J)= 4
     NEXT J
    NEXT I
    LOCATE 20,25
    PRINT "A   B   C   D    E   F   G   H"
    FOR I= 30 TO 57 STEP 9: FOR J= 0 TO 3: P(I+J)= 3: NEXT J,I
    P(41) = 1: PUT (X0+5*DX,Y0+4*DY), EX, PSET
    P(40) = 2: PUT (X0+6*DX,Y0+4*DY), OH, PSET
    P(49) = 1: PUT (X0+5*DX,Y0+5*DY), OH, PSET
    P(50) = 2: PUT (X0+6*DX,Y0+5*DY), EX, PSET
    PUT (X0-2*DX,Y0+5*DY), EX, PSET
    LOCATE 10,13: PRINT "ME"
    PUT (X0+13*DX,Y0+5*DY), OH, PSET
    LOCATE 10,65: PRINT "YOU" 
    IF w$ = "Y" OR w$ = "y" THEN GOTO 254
    GOTO 365
880 LOCATE 2,70: PRINT "You  Me"
    LOCATE 3,69: PRINT USING "### ####"; uwin,mewin
    RETURN
