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 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] 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