100  REM OTH FOR TSB - WTN 1/07
101  REM ANSI VERSION 3/07
102  REM REQUIRES MODIFIED SIMH HP2100, SEE
103  REM HTTP://WWW.INFIONLINE.NET/~WTNEWTON/OLDCOMP/TSB_E.HTML
110  PRINT "COMPUTER IS X, YOU ARE O"
120  PRINT "ENTER MOVES AS YX (11-88)"
130  PRINT "TO PASS ENTER 0 FOR MOVE"
140  DIM A[10,10],B$[3],D$[8],B[10,10],W[10,10],T[64]
150  DIM C$[7],H$[7]
152  REM C$=COMP COLOR,H$=PLAYER COLOR
153  C$="33;41;1"
154  H$="37;44;1"
158  REM B$=CHARS TO DISPLAY
160  B$=" XO"
170  D$="12345678"
190  M2=C5=0
192  PRINT "LEVEL 0 OR 1";
194  INPUT L3
195  IF L3=0 OR L3=1 THEN 200
196  GOTO 192
200  T9=1
205  PRINT "'27[2J"
210  REM INIT ARRAYS
220  GOSUB 1000
235  M2=0
236  MAT W=A
237  REM DISPLAY BOARD
240  GOSUB 2000
250  REM GET MOVE
260  GOSUB 3000
270  IF M1=0 THEN 290
280  GOSUB 2000
290  MAT W=A
307  REM GENERATE COMPUTER MOVE
310  GOSUB 4000
330  IF M2=0 THEN 345
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
505  PRINT "'27[22;21H ";
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  PRINT "'27[0J";
610  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
1125  MAT B=ZER
1130  RESTORE 1160
1140  REM TABLE TO WEIGHT MOVES BY THE
1150  REM IMPORTANCE OF THE POSITION
1160  DATA 300,20,200,200,200,200,20,300
1170  DATA 20,30,100,100,100,100,30,20
1180  DATA 200,100,100,100,100,100,100,200
1190  DATA 200,100,100,100,100,100,100,200
1200  DATA 200,100,100,100,100,100,100,200
1210  DATA 200,100,100,100,100,100,100,200
1220  DATA 20,30,100,100,100,100,30,20
1230  DATA 300,20,200,200,200,200,20,300
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 BOARDS WITH HUMAN AND COMPUTER MOVES
2001  REM CURRENT BOARD IN A[X,Y]
2004  REM RETURNS H C E FOR HUMAN COMP EMPTY COUNTS
2005  H=C=E=0
2006  PRINT "'27[H                                        "
2007  PRINT "     1   2   3   4   5   6   7   8      "
2010  PRINT "   .---.---.---.---.---.---.---.---.    "
2011  FOR Y=2 TO 9
2019  PRINT " ";D$[Y-1,Y-1];" :";
2020  FOR X=2 TO 9
2022  PRINT "'27['115"
2023  PRINT "'27['117";
2030  Z=A[X,Y]
2050  IF Z <> 2 THEN 2070
2060  C=C+1
2062  PRINT "'27[";C$;"'109";
2070  IF Z <> 3 THEN 2090
2080  H=H+1
2082  PRINT "'27[";H$;"'109";
2090  IF Z <> 1 THEN 2097
2094  E=E+1
2095  PRINT "'32'32'32:";
2096  GOTO 2098
2097  PRINT "'32";B$[Z,Z];" '27[0'109:";
2098  NEXT X
2100  PRINT " ";D$[Y-1,Y-1]
2105  IF Y=9 THEN 2110
2106  PRINT "   :---:---:---:---:---:---:---:---:    "
2110  NEXT Y
2112  PRINT "   '---'---'---'---'---'---'---'---'    "
2114  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 "'27[23;1H'27[0JMOVE ";
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
4050  PRINT "'27[22;21H THINKING...     ";
4100  X3=Y3=G4=0
4102  G3=-9999
4104  REM LOOKING FOR HUMAN PIECES...
4105  P1=3
4106  P2=2
4110  IF C5=0 THEN 4300
4120  REM REVERSE FOR LA
4130  P1=2
4140  P2=3
4150  FOR X8=2 TO 9
4155  X=X8
4160  FOR Y8=2 TO 9
4165  Y=Y8
4170  GOSUB 6000
4180  GOSUB 4800
4190  NEXT Y8
4200  NEXT X8
4210  GOTO 4390
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 G4>0
4380  REM IF G4=0 THEN COMP CAN'T MOVE
4390  M2=0
4400  IF G4>0 THEN 4420
4410  RETURN
4420  X=X3
4430  Y=Y3
4440  M2=(Y-1)*10+(X-1)
4450  IF C5>0 THEN 4480
4460  PRINT "'27[22;21H MY MOVE IS";M2
4470  GOSUB 7000
4480  RETURN
4800  REM CHECK IF BETTER AND UPDATE
4805  IF G=0 THEN 4820
4807  IF L3=0 OR C5>0 THEN 4810
4808  GOSUB 4900
4809  GOTO 4812
4810  G2=G*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
4855  G4=G
4860  RETURN
4900  REM LOOK AHEAD ONE MOVE
4902  REM W[] HOLDS COPY TO RESTORE
4903  C5=1
4905  GOSUB 7000
4910  X5=X
4912  Y5=Y
4914  G5=G
4916  X6=X3
4917  Y6=Y3
4918  G6=G3
4919  G7=G4
4925  GOSUB 4000
4930  MAT A=W
4931  G9=0
4932  IF G4=0 THEN 4935
4933  G9=G4*B[X3,Y3]
4935  X=X5
4936  Y=Y5
4937  X3=X6
4938  Y3=Y6
4939  G=G5
4940  G8=G*B[X,Y]
4943  G2=G8-G9
4950  C5=0
4955  P1=3
4956  P2=2
4957  G3=G6
4970  G4=G7
4990  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  REM IF CORNER CHOSEN THEN FIX WEIGHTS
7122  REM (BUT NOT WHEN LOOKING AHEAD)
7125  IF C5>0 THEN 7290
7130  IF X <> 2 OR Y <> 2 THEN 7170
7140  B[3,2]=100
7150  B[2,3]=100
7160  B[3,3]=100
7170  IF X <> 2 OR Y <> 9 THEN 7210
7180  B[2,8]=100
7190  B[3,9]=100
7200  B[3,8]=100
7210  IF X <> 9 OR Y <> 2 THEN 7250
7220  B[8,2]=100
7230  B[9,3]=100
7240  B[8,3]=100
7250  IF X <> 9 OR Y <> 9 THEN 7290
7260  B[9,8]=100
7270  B[8,9]=100
7280  B[8,8]=100
7290  RETURN
9999  END
