100  REM OTHELL FOR TSB - WTN 9/06
110  PRINT "COMPUTER IS X, YOU ARE O"
120  PRINT "ENTER MOVES AS YX (11-88)"
130  PRINT "ENTER 0 TO PASS"
150  DIM A[10,10],B$[3],D$[8],B[10,10]
160  B$=" XO"
170  D$="12345678"
210  REM INITIALIZE
220  GOSUB 1000
230  REM DISPLAY BOARD
240  GOSUB 2000
250  REM GET MOVE
260  GOSUB 3000
270  REM IF USER PASSES DON'T DISPLAY
280  IF M1=0 THEN 300
290  GOSUB 2000
295  IF E=0 THEN 500
297  IF C=0 THEN 500
300  REM GENERATE COMPUTER MOVE
310  GOSUB 4000
320  REM IF COMPUTER PASSES DON'T DISPLAY
330  IF M2=0 THEN 350
340  GOSUB 2000
345  IF E=0 THEN 500
347  IF H=0 THEN 500
350  REM IF BOTH PASS THEN THE GAME IS OVER
360  IF M1=0 AND M2=0 THEN 500
370  REM GET ANOTHER MOVE
380  GOTO 250
500  REM ENDGAME
510  IF H>C THEN 550
520  IF C>H THEN 570
530  PRINT "IT'S A TIE"
540  GOTO 600
550  PRINT "YOU WON BY";H-C
560  GOTO 600
570  PRINT "I WON BY";C-H
600  STOP
1000  REM INITIALIZE, A[X,Y] CONTAINS BOARD
1002  REM 0 = OFF THE EDGE
1003  REM 1 = UNOCCUPIED POSITION
1004  REM 2 = COMPUTER PIECES
1005  REM 3 = HUMAN PIECES
1010  MAT A=ZER
1020  FOR Y=2 TO 9
1030  FOR X=2 TO 9
1040  A[X,Y]=1
1050  NEXT X
1060  NEXT Y
1080  A[5,5]=A[6,6]=2
1100  A[5,6]=A[6,5]=3
1110  REM PREFERENCE ARRAY B[X,Y]
1120  MAT B=ZER
1130  RESTORE 1160
1140  REM TABLE TO WEIGHT MOVES BY THE
1150  REM IMPORTANCE OF THE POSITION
1160  DATA 300,0,100,90,90,100,0,300
1170  DATA 0,10,70,50,50,70,10,0
1180  DATA 100,60,20,30,30,20,60,100
1190  DATA 90,50,30,30,30,30,50,90
1200  DATA 90,50,30,30,30,30,50,90
1210  DATA 100,60,20,30,30,20,60,100
1220  DATA 0,10,70,50,50,70,10,0
1230  DATA 300,0,100,90,90,100,0,300
1233  REM B1 IS TABLE BIAS, DETERMINES
1234  REM HOW MUCH WEIGHTING IS APPLIED
1235  B1=10
1240  FOR Y=2 TO 9
1250  FOR X=2 TO 9
1260  READ B[X,Y]
1270  NEXT X
1280  NEXT Y
1290  RETURN
2000  REM DRAW BOARD
2002  REM RETURNS H C E FOR HUMAN COMP EMPTY COUNTS
2005  H=C=E=0
2006  PRINT
2007  PRINT "   1 2 3 4 5 6 7 8"
2010  FOR Y=2 TO 9
2015  PRINT " ";D$[Y-1,Y-1];
2020  FOR X=2 TO 9
2030  Z=A[X,Y]
2040  PRINT " ";B$[Z,Z];
2050  IF Z <> 2 THEN 2070
2060  C=C+1
2070  IF Z <> 3 THEN 2090
2080  H=H+1
2090  IF Z <> 1 THEN 2097
2095  E=E+1
2097  NEXT X
2100  PRINT Y-1
2110  NEXT Y
2115  PRINT "   1 2 3 4 5 6 7 8"
2116  PRINT
2120  PRINT "YOU:";H;" ME:";C
2190  RETURN
3000  REM GET MOVE
3010  PRINT "MOVE ";
3020  INPUT M1
3022  IF M1>10 THEN 3030
3024  RETURN
3030  Y=INT(M1/10)
3040  X=INT(M1-Y*10)
3050  IF X<1 OR X>8 OR Y<1 OR Y>8 THEN 3010
3060  X=X+1
3070  Y=Y+1
3080  IF A[X,Y] <> 1 THEN 3010
3090  REM CHECK FOR GAIN
3094  REM LOOK FOR COMP PIECES TO FLIP
3095  P1=2
3096  P2=3
3100  GOSUB 6000
3110  REM BAD MOVE IF NO GAIN
3120  IF G=0 THEN 3010
3130  REM ACTUALLY FLIP PIECES
3140  GOSUB 7000
3190  RETURN
4000  REM COMPUTER MOVE
4030  REM BEST MOVE IN X3,Y3
4040  REM BEST GAIN IN G3
4100  X3=Y3=G3=0
4104  REM LOOKING FOR HUMAN PIECES...
4105  P1=3
4106  P2=2
4290  REM SCAN THE BOARD AND FIND BEST MOVE
4300  FOR X=2 TO 9
4310  FOR Y=2 TO 9
4320  GOSUB 6000
4340  GOSUB 4800
4350  NEXT Y
4360  NEXT X
4370  REM BEST MOVE IN X3 Y3 IF G3>0
4380  REM IF G3=0 THEN COMP CAN'T MOVE
4390  M2=0
4400  IF G3 <> 0 THEN 4420
4410  RETURN
4420  X=X3
4430  Y=Y3
4440  M2=(Y-1)*10+(X-1)
4460  PRINT "MY MOVE IS";M2
4470  GOSUB 7000
4480  RETURN
4800  REM CHECK IF BETTER AND UPDATE
4805  IF G=0 THEN 4820
4810  G2=G*B1+B[X,Y]
4812  IF G2>G3 THEN 4830
4814  IF G2=G3 AND RND(1)<.5 THEN 4830
4820  RETURN
4830  X3=X
4840  Y3=Y
4850  G3=G2
4860  RETURN
5000  REM SCAN/FLIP PIECES IN A DIRECTION
5010  REM ENTRY X,Y ARRAY POS, D1 DIR 1-8
5020  REM FOR HUMAN MOVES P1=2 P2=3
5022  REM FOR COMP MOVES P1=3 P2=2
5025  REM C1=0 TO CHECK, >0 FLIP PIECES
5030  REM RETURNS GAIN COUNT IN G1, X Y UNCHANGED
5040  G1=0
5050  IF A[X,Y]=1 THEN 5100
5080  RETURN
5100  X2=X
5110  Y2=Y
5114  IF C1=0 THEN 5120
5120  REM TRAVEL DOWN ROW
5130  GOTO D1 OF 5150,5200,5250,5300,5350,5400,5450,5500
5150  X2=X2+1
5160  GOTO 5550
5200  X2=X2+1
5210  Y2=Y2-1
5220  GOTO 5550
5250  Y2=Y2-1
5260  GOTO 5550
5300  X2=X2-1
5310  Y2=Y2-1
5320  GOTO 5550
5350  X2=X2-1
5360  GOTO 5550
5400  X2=X2-1
5410  Y2=Y2+1
5420  GOTO 5550
5450  Y2=Y2+1
5460  GOTO 5550
5500  X2=X2+1
5510  Y2=Y2+1
5550  IF A[X2,Y2]>1 THEN 5600
5560  G1=0
5570  RETURN
5600  IF A[X2,Y2]=P1 THEN 5700
5610  REM END PIECE DETECTED
5620  RETURN
5700  G1=G1+1
5710  IF C1=0 THEN 5120
5720  A[X2,Y2]=P2
5730  GOTO 5120
6000  REM CHECK FOR GAIN
6010  REM ENTRY X,Y RETURNS HOW MANY WILL FLIP IN G
6020  C1=0
6050  G=0
6060  FOR D1=1 TO 8
6070  GOSUB 5000
6080  G=G+G1
6090  NEXT D1
6100  RETURN
7000  REM FLIP ALL PIECES
7030  FOR D1=1 TO 8
7040  C1=0
7050  GOSUB 5000
7060  IF G1=0 THEN 7100
7070  C1=1
7080  GOSUB 5000
7100  NEXT D1
7110  A[X,Y]=P2
7120  RETURN
9999  END
