100  REM PREVIOUSLY OTH FOR TSB - WTN 1/07
101  REM ADAPTED FOR HP PAPER-TAPE BASIC 8/07
102  REM RE-ADAPTED TO MAKE A BIT FASTER 3/08
103  REM ADDED SEED PROMPT, DISPLAY DOTS 3/21
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[10,10],W[10,10],T[64]
150  PRINT "ENTER RANDOM SEED NUMBER ";
152  INPUT N
154  FOR X=1 TO N
156  LET Y=RND(1)
158  NEXT X
190  LET P=M=0
192  PRINT "LEVEL 0 OR 1 ";
194  INPUT L
195  IF L=0 OR L=1 THEN 210
196  GOTO 192
210  REM INIT ARRAYS
220  GOSUB 1000
230  REM DISPLAY BOARD
235  LET P=0
236  MAT W=A
240  GOSUB 2000
250  REM GET MOVE
260  GOSUB 3000
290  MAT W=A
307  REM GENERATE COMPUTER MOVE
310  GOSUB 4000
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 N=0 AND P=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  LET A[X,Y]=1
1050  NEXT X
1060  NEXT Y
1080  LET A[5,5]=A[6,6]=2
1100  LET A[5,6]=A[6,5]=3
1125  MAT B=ZER
1140  REM TABLE TO WEIGHT MOVES BY THE
1150  REM IMPORTANCE OF THE POSITION
1160  DATA 300,50,200,200,200,200,50,300
1170  DATA 50,50,100,100,100,100,50,50
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 50,50,100,100,100,100,50,50
1230  DATA 300,50,200,200,200,200,50,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 LAST BOARD IN W[X,Y], CURRENT IN A[X,Y]
2002  REM COMPUTER MOVE BOARD NOT SHOWN IF P=0
2004  REM RETURNS H C E FOR HUMAN COMP EMPTY COUNTS
2005  LET H=C=E=0
2006  PRINT 
2007  PRINT "   1 2 3 4 5 6 7 8  ";
2008  IF P=0 THEN 2010
2009  PRINT "          1 2 3 4 5 6 7 8";
2010  PRINT 
2011  FOR Y=2 TO 9
2012  FOR K=1 TO 2
2013  IF K=1 THEN 2017
2014  PRINT "       ";
2015  IF P=0 THEN 2020
2017  PRINT " ";
2018  GOSUB 7500
2020  FOR X=2 TO 9
2030  LET Z=A[X,Y]
2031  IF K=2 AND P=0 THEN 2050
2032  IF K=2 THEN 2040
2033  LET Z=W[X,Y]
2040  PRINT " ";
2041  IF Z=2 THEN 2045
2042  IF Z=3 THEN 2047
2043  PRINT ".";
2044  GOTO 2049
2045  PRINT "X";
2046  GOTO 2049
2047  PRINT "O";
2049  IF K=1 THEN 2097
2050  IF Z#2 THEN 2070
2060  LET C=C+1
2070  IF Z#3 THEN 2090
2080  LET H=H+1
2090  IF Z#1 THEN 2097
2095  LET E=E+1
2097  NEXT X
2098  IF K=2 AND P=0 THEN 2105
2100  PRINT " ";
2102  GOSUB 7500
2105  NEXT K
2107  PRINT 
2110  NEXT Y
2112  PRINT "   1 2 3 4 5 6 7 8  ";
2113  IF P=0 THEN 2115
2114  PRINT "          1 2 3 4 5 6 7 8";
2115  PRINT 
2116  PRINT 
2120  PRINT "YOU:";H;" ME:";C
2190  RETURN 
3000  REM GET MOVE
3010  PRINT "MOVE ";
3020  INPUT N
3022  IF N>10 THEN 3030
3024  RETURN 
3030  LET Y=INT(N/10)
3040  LET X=INT(N-Y*10)
3050  IF X<1 OR X>8 OR Y<1 OR Y>8 THEN 3010
3060  LET X=X+1
3070  LET 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  LET Q=2
3096  LET R=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 X1,Y1
4040  REM BEST GAIN IN G3
4100  LET X1=Y1=G4=0
4102  LET G3=-9999
4104  REM LOOKING FOR HUMAN PIECES...
4105  LET Q=3
4106  LET R=2
4110  IF M=0 THEN 4300
4120  REM REVERSE FOR LA
4130  LET Q=2
4140  LET R=3
4150  FOR I=2 TO 9
4155  LET X=I
4160  FOR J=2 TO 9
4165  LET Y=J
4170  GOSUB 6000
4180  GOSUB 4800
4190  NEXT J
4200  NEXT I
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 X1 Y1 IF G4>0
4380  REM IF G4=0 THEN COMP CAN'T MOVE
4390  LET P=0
4400  IF G4>0 THEN 4420
4410  RETURN 
4420  LET X=X1
4430  LET Y=Y1
4440  LET P=(Y-1)*10+(X-1)
4450  IF M>0 THEN 4480
4460  PRINT "                              MY MOVE IS";P
4470  GOSUB 7000
4480  RETURN 
4800  REM CHECK IF BETTER AND UPDATE
4805  IF G=0 THEN 4820
4807  IF L=0 OR M>0 THEN 4810
4808  GOSUB 4900
4809  GOTO 4812
4810  LET G2=G*B[X,Y]
4812  IF G2>G3 THEN 4830
4814  IF G2=G3 AND RND(1)<.5 THEN 4830
4820  RETURN 
4830  LET X1=X
4840  LET Y1=Y
4850  LET G3=G2
4855  LET G4=G
4860  RETURN 
4900  REM LOOK AHEAD ONE MOVE
4902  REM W[] HOLDS COPY TO RESTORE
4903  LET M=1
4905  GOSUB 7000
4910  LET X2=X
4912  LET Y2=Y
4914  LET G5=G
4916  LET X3=X1
4917  LET Y3=Y1
4918  LET G6=G3
4919  LET G7=G4
4925  GOSUB 4000
4930  MAT A=W
4931  LET G1=0
4932  IF G4=0 THEN 4935
4933  LET G1=G4*B[X1,Y1]
4935  LET X=X2
4936  LET Y=Y2
4937  LET X1=X3
4938  LET Y1=Y3
4939  LET G=G5
4940  LET G8=G*B[X,Y]
4943  LET G2=G8-G1
4950  LET M=0
4955  LET Q=3
4956  LET R=2
4957  LET G3=G6
4970  LET G4=G7
4990  RETURN 
5000  REM SCAN/FLIP PIECES IN A DIRECTION
5010  REM ENTRY X,Y ARRAY POS, D DIR 1-8
5020  REM FOR HUMAN MOVES Q=2 R=3
5022  REM FOR COMP MOVES Q=3 R=2
5025  REM F=0 TO CHECK, >0 FLIP PIECES
5030  REM RETURNS GAIN COUNT IN S, X Y UNCHANGED
5040  LET S=0
5050  IF A[X,Y]=1 THEN 5100
5080  RETURN 
5100  LET A=X
5110  LET B=Y
5114  IF F=0 THEN 5120
5120  REM TRAVEL DOWN ROW
5130  IF D=1 THEN 5150
5131  IF D=2 THEN 5200
5133  IF D=3 THEN 5250
5134  IF D=4 THEN 5300
5135  IF D=5 THEN 5350
5136  IF D=6 THEN 5400
5137  IF D=7 THEN 5450
5138  IF D=8 THEN 5500
5150  LET A=A+1
5160  GOTO 5550
5200  LET A=A+1
5210  LET B=B-1
5220  GOTO 5550
5250  LET B=B-1
5260  GOTO 5550
5300  LET A=A-1
5310  LET B=B-1
5320  GOTO 5550
5350  LET A=A-1
5360  GOTO 5550
5400  LET A=A-1
5410  LET B=B+1
5420  GOTO 5550
5450  LET B=B+1
5460  GOTO 5550
5500  LET A=A+1
5510  LET B=B+1
5550  IF A[A,B]>1 THEN 5600
5560  LET S=0
5570  RETURN 
5600  IF A[A,B]=Q THEN 5700
5610  REM END PIECE DETECTED
5620  RETURN 
5700  LET S=S+1
5710  IF F=0 THEN 5120
5720  LET A[A,B]=R
5730  GOTO 5120
6000  REM CHECK FOR GAIN
6010  REM ENTRY X,Y RETURNS HOW MANY WILL FLIP IN G
6020  LET F=0
6050  LET G=0
6060  FOR D=1 TO 8
6070  GOSUB 5000
6080  LET G=G+S
6090  NEXT D
6100  RETURN 
7000  REM FLIP ALL PIECES
7030  FOR D=1 TO 8
7040  LET F=0
7050  GOSUB 5000
7060  IF S=0 THEN 7100
7070  LET F=1
7080  GOSUB 5000
7100  NEXT D
7110  LET A[X,Y]=R
7120  REM IF CORNER CHOSEN THEN FIX WEIGHTS
7122  REM (BUT NOT WHEN LOOKING AHEAD)
7125  IF M>0 THEN 7290
7130  IF X#2 OR Y#2 THEN 7170
7140  LET B[3,2]=100
7150  LET B[2,3]=100
7160  LET B[3,3]=100
7170  IF X#2 OR Y#9 THEN 7210
7180  LET B[2,8]=100
7190  LET B[3,9]=100
7200  LET B[3,8]=100
7210  IF X#9 OR Y#2 THEN 7250
7220  LET B[8,2]=100
7230  LET B[9,3]=100
7240  LET B[8,3]=100
7250  IF X#9 OR Y#9 THEN 7290
7260  LET B[9,8]=100
7270  LET B[8,9]=100
7280  LET B[8,8]=100
7290  RETURN 
7499  REM Y-1 NUMBER PRINTS
7500  IF Y=2 THEN 7510
7501  IF Y=3 THEN 7520
7502  IF Y=4 THEN 7530
7503  IF Y=5 THEN 7540
7504  IF Y=6 THEN 7550
7505  IF Y=7 THEN 7560
7506  IF Y=8 THEN 7570
7507  PRINT "8";
7508  RETURN 
7510  PRINT "1";
7515  RETURN 
7520  PRINT "2";
7525  RETURN 
7530  PRINT "3";
7535  RETURN 
7540  PRINT "4";
7545  RETURN 
7550  PRINT "5";
7555  RETURN 
7560  PRINT "6";
7565  RETURN 
7570  PRINT "7";
7575  RETURN 
9999  END 

