100 REM BY WTN 12/7/10 101 REM ORIGINAL FOR TSB 9/06 102 REM PT-BASIC MOD 9/10 103 REM CUSTOM OVERLAY MOD 12/10 110 DIM A[10,10],B[10,10] 120 GOSUB 9980 121 GOSUB 9910 130 PRINT 131 PRINT " === OTH-OV ===" 132 PRINT " COMPUTER IS X, YOU ARE O" 133 PRINT " ENTER MOVES AS YX (11-88)" 134 PRINT " 0 TO PASS, -1 TO REDISPLAY" 135 PRINT 140 PRINT " ENTER RANDOM SEED NUMBER "; 141 INPUT X 142 GOSUB 9910 150 FOR Y=1 TO X 151 LET Z=RND(0) 152 NEXT Y 220 GOSUB 1000 240 GOSUB 2000 250 GOSUB 3000 280 IF M1=0 THEN 300 290 GOSUB 2000 295 IF E=0 THEN 500 297 IF C=0 THEN 500 300 GOSUB 4000 330 IF M2=0 THEN 350 340 GOSUB 2000 345 IF E=0 THEN 500 347 IF H=0 THEN 500 350 IF M1=0 AND M2=0 THEN 500 380 GOTO 250 500 GOSUB 9950 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 TAB(18);"PLAY AGAIN? (Y/N) "; 610 CALL (7,K9) 620 IF K9=89 THEN 220 630 LET R9=22 631 LET C9=1 632 GOSUB 9920 633 GOSUB 9950 640 STOP 1000 REM INITIALIZE 1005 RESTORE 1010 FOR X=1 TO 10 1011 FOR Y=1 TO 10 1012 LET A[X,Y]=B[X,Y]=0 1013 NEXT Y 1014 NEXT X 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 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 1235 LET 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 DISPLAY 2003 GOSUB 9940 2004 LET F9=15 2005 LET H=C=E=0 2006 PRINT 2007 PRINT " 1 2 3 4 5 6 7 8" 2008 PRINT " .-------------------------------." 2010 FOR Y=2 TO 9 2015 GOSUB 9000 2020 FOR X=2 TO 9 2030 LET Z=A[X,Y] 2040 PRINT "|"; 2050 IF Z#2 THEN 2070 2060 LET C=C+1 2061 LET B9=1 2062 GOSUB 9960 2063 PRINT " X "; 2064 GOSUB 9980 2070 IF Z#3 THEN 2090 2080 LET H=H+1 2081 LET B9=4 2082 GOSUB 9960 2083 PRINT " O "; 2084 GOSUB 9980 2090 IF Z#1 THEN 2097 2095 LET E=E+1 2096 PRINT " "; 2097 NEXT X 2098 PRINT "|"; 2100 GOSUB 9000 2105 PRINT 2106 IF Y=9 THEN 2110 2107 PRINT " |---+---+---+---+---+---+---+---|" 2110 NEXT Y 2112 PRINT " `-------------------------------'" 2115 PRINT " 1 2 3 4 5 6 7 8" 2116 PRINT 2120 PRINT " YOU:";H;" ME:";C 2190 RETURN 3000 REM GET MOVE 3003 LET R9=23 3004 LET C9=1 3005 GOSUB 9920 3006 GOSUB 9950 3010 PRINT " MOVE "; 3020 INPUT M1 3021 IF M1<0 THEN 3026 3022 IF M1>10 THEN 3030 3023 GOSUB 9920 3024 GOSUB 9950 3025 RETURN 3026 GOSUB 9910 3027 GOSUB 2000 3028 GOTO 3000 3030 LET Y=INT(M1/10) 3040 LET X=INT(M1-Y*10) 3050 IF X<1 OR X>8 OR Y<1 OR Y>8 THEN 3000 3060 LET X=X+1 3070 LET Y=Y+1 3080 IF A[X,Y]#1 THEN 3000 3095 LET P1=2 3096 LET P2=3 3100 GOSUB 6000 3120 IF G=0 THEN 3000 3130 GOSUB 7000 3190 RETURN 4000 REM COMPUTER MOVE 4003 GOSUB 9950 4004 PRINT " THINKING..."; 4100 LET X3=Y3=G3=0 4104 REM LOOKING FOR HUMAN PIECES 4105 LET P1=3 4106 LET P2=2 4300 FOR X=2 TO 9 4310 FOR Y=2 TO 9 4320 GOSUB 6000 4340 GOSUB 4800 4350 NEXT Y 4360 NEXT X 4390 LET M2=0 4400 IF G3#0 THEN 4420 4410 RETURN 4420 LET X=X3 4430 LET Y=Y3 4440 LET M2=(Y-1)*10+(X-1) 4460 PRINT "MY MOVE IS";M2; 4470 GOSUB 7000 4480 RETURN 4800 REM CHECK IF BETTER 4805 IF G=0 THEN 4820 4810 LET 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 LET X3=X 4840 LET Y3=Y 4850 LET G3=G2 4860 RETURN 5000 REM SCAN/FLIP PIECES 5040 LET G1=0 5050 IF A[X,Y]=1 THEN 5100 5080 RETURN 5100 LET X2=X 5110 LET Y2=Y 5120 IF D1=2 THEN 5200 5132 IF D1=3 THEN 5250 5133 IF D1=4 THEN 5300 5134 IF D1=5 THEN 5350 5136 IF D1=6 THEN 5400 5137 IF D1=7 THEN 5450 5138 IF D1=8 THEN 5500 5150 LET X2=X2+1 5160 GOTO 5550 5200 LET X2=X2+1 5210 LET Y2=Y2-1 5220 GOTO 5550 5250 LET Y2=Y2-1 5260 GOTO 5550 5300 LET X2=X2-1 5310 LET Y2=Y2-1 5320 GOTO 5550 5350 LET X2=X2-1 5360 GOTO 5550 5400 LET X2=X2-1 5410 LET Y2=Y2+1 5420 GOTO 5550 5450 LET Y2=Y2+1 5460 GOTO 5550 5500 LET X2=X2+1 5510 LET Y2=Y2+1 5550 IF A[X2,Y2]>1 THEN 5600 5560 LET G1=0 5570 RETURN 5600 IF A[X2,Y2]=P1 THEN 5700 5620 RETURN 5700 LET G1=G1+1 5710 IF C1=0 THEN 5120 5720 LET A[X2,Y2]=P2 5730 GOTO 5120 6000 REM CHECK FOR GAIN 6020 LET C1=0 6050 LET G=0 6060 FOR D1=1 TO 8 6070 GOSUB 5000 6080 LET G=G+G1 6090 NEXT D1 6100 RETURN 7000 REM FLIP ALL PIECES 7030 FOR D1=1 TO 8 7040 LET C1=0 7050 GOSUB 5000 7060 IF G1=0 THEN 7100 7070 LET C1=1 7080 GOSUB 5000 7100 NEXT D1 7110 LET A[X,Y]=P2 7120 RETURN 8999 REM Y-1 NUMBER PRINT 9000 IF Y=3 THEN 9090 9010 IF Y=4 THEN 9110 9020 IF Y=5 THEN 9130 9030 IF Y=6 THEN 9150 9040 IF Y=7 THEN 9170 9050 IF Y=8 THEN 9190 9060 IF Y=9 THEN 9210 9070 PRINT " 1 "; 9080 RETURN 9090 PRINT " 2 "; 9100 RETURN 9110 PRINT " 3 "; 9120 RETURN 9130 PRINT " 4 "; 9140 RETURN 9150 PRINT " 5 "; 9160 RETURN 9170 PRINT " 6 "; 9180 RETURN 9190 PRINT " 7 "; 9200 RETURN 9210 PRINT " 8 "; 9220 RETURN 9890 REM SCREEN CONTROL SUBS FOR OVERLAY 9891 REM GOSUB 9900 - SEND ESC[ 9892 REM GOSUB 9910 - HOME AND CLEAR SCREEN 9893 REM GOSUB 9920 - POS CURSOR TO R9 C9 9894 REM GOSUB 9940 - POS CURSOR TO 1,1 9895 REM GOSUB 9950 - CLEAR FROM CURRENT POS 9896 REM GOSUB 9960 - SET COLOR TO F9 B9 9897 REM GOSUB 9980 - RESET TO DEFAULT 9900 CALL (8,27) 9901 CALL (8,91) 9902 RETURN 9910 GOSUB 9940 9911 GOSUB 9900 9912 CALL (8,50) 9913 CALL (8,74) 9914 RETURN 9920 GOSUB 9900 9921 LET Z9=INT(R9/10) 9922 IF Z9=0 THEN 9924 9923 CALL (8,Z9+48) 9924 CALL (8,R9-Z9*10+48) 9925 CALL (8,59) 9926 LET Z9=INT(C9/10) 9927 IF Z9=0 THEN 9929 9928 CALL (8,Z9+48) 9929 CALL (8,C9-Z9*10+48) 9930 CALL (8,72) 9931 RETURN 9940 GOSUB 9900 9941 CALL (8,72) 9942 RETURN 9950 GOSUB 9900 9951 CALL (8,74) 9952 RETURN 9960 GOSUB 9900 9961 LET Z9=F9 9962 IF F9<8 THEN 9966 9963 CALL (8,49) 9964 CALL (8,59) 9965 LET Z9=Z9-8 9966 CALL (8,51) 9967 CALL (8,Z9+48) 9968 CALL (8,59) 9969 CALL (8,52) 9970 CALL (8,B9+48) 9971 CALL (8,109) 9972 RETURN 9980 GOSUB 9900 9981 CALL (8,48) 9982 CALL (8,109) 9983 RETURN 9999 END