10 REM * * * GAME OF OTHELLO * * * (OTHELO.BA) 20 REM PLAYS THE GAME OF "OTHELLO WITH TWO STRATEGIES: 30 REM 1. TAKE THE MAXIMUM NUMBER OF PIECES 40 REM 2. ADD A BONUS FOR OUTSIDE POSITION 50 REM BOARD IS THE ARRAY 'A', BOUNDED BY 0'S (BLANKS) 60 REM A=0 FOR EMPTY SQUARES 70 REM A=B FOR BALCK SQUARE (INTERNALLY -1) 80 REM A=W FOR WHITE SQUARE (INTERNALLY +1) 90 REM I AND J ALWAYS USED FOR ROW/COLUMN INDICES 100 REM I4 AND J4 STORE INCREMENTS TO THE 8 NEIGHBORS 110 REM C$ AND D$ STORE THE CAHRACTERS A-H,X,.,O FOR OUTPUT 120 DIM A(9,9),I4(8),J4(8),C$(8),D$(2) 130 REM INITIAL GREETING 140 PRINT\PRINT "GREETINGS FROM OTHELLO" 150 PRINT\PRINT "DO YOU WANT INSTRUCTIONS [Y OR N]"; 160 INPUT Z$ 170 IF Z$="N" GOTO 390 180 IF Z$<>"Y" GOTO 160 190 PRINT 200 PRINT "OTHELLO IS PLAYED ON AN 8 X 8 CHECKER BOARD," 210 PRINT "ROWS NUMBERED 1 TO 8 AND COLUMNS A TO H." 220 PRINT "THE INITIAL CONFIGURATION IS ALL BLANK EXCEPT" 230 PRINT "FOR THE CENTER FOUR SQUARES WHICH FORM THE" 240 PRINT "PATTERN:" 250 PRINT TAB(20);"O X" 260 PRINT TAB(20);"X O" 270 PRINT 280 PRINT "TRY TO PLACE YOUR PIECE SO THAT IT 'OUTFLANKS'" 290 PRINT "MINE, CREATING A HORIZONTAL, VERTICAL OR" 300 PRINT "DIAGONAL RUN OF MY PIECES BOUNDED AT EACH END" 310 PRINT "BY AT LEAST ONE OF YOURS. THIS WILL 'FLIP' MY" 320 PRINT "PIECES, TURNING THEM INTO YOURS." 330 PRINT "*NOTE*: YOU MUST CAPTURE AT LEAST ONE OF MY" 340 PRINT "PIECES IN THIS WAY IF IT IS AT ALL POSSIBLE." 350 PRINT "IF IT IS NOT POSSIBLE, YOU FORFEIT YOUR TURN BY" 360 PRINT "TYPING '0,0' FOR YOUR (ROW,COL) MOVE." 370 PRINT 380 REM INITIALIZE 390 PRINT "SHOULD I WAIT BEFORE MAKING MY MOVES [Y OR N]"; 400 F2=0 410 INPUT X$ 420 IF X$="N" GOTO 460 430 IF X$<>"Y" GOTO 410 440 F2=1 450 PRINT "OK, TYPING ANY CHARACTER WILL LET ME GO." 460 PRINT "SHOULD I PLAY MY BEST STRATEGY [Y OR N]"; 470 S2=0 480 INPUT X$ 490 IF X$="N" GOTO 520 500 IF X$<>"Y" GOTO 460 510 S2=2 520 B=-1 530 W=1 540 D$(B+1)="X" 550 D$(0+1)="." 560 D$(W+1)="O" 570 FOR K=1 TO 8 580 READ I4(K) 590 NEXT K 600 DATA 0,-1,-1,-1,0,1,1,1 610 FOR K=1 TO 8 620 READ J4(K) 630 NEXT K 640 DATA 1,1,0,-1,-1,-1,0,1 650 FOR K=1 TO 8 660 READ C$(K) 670 NEXT K 680 DATA "A","B","C","D","E","F","G","H" 690 REM SET UP A NEW GAME 700 FOR I=0 TO 9 710 FOR J=0 TO 9 720 A(I,J)=0 730 NEXT J 740 NEXT I 750 A(4,4)=W 760 A(5,5)=W 770 A(4,5)=B 780 A(5,4)=B 790 C1=2 800 H1=2 810 N1=4 820 Z=0 830 REM HUMAN'S CHOICES 840 PRINT "DO YOU WANT TO HAVE 'X' OR 'O' [X OR O]"; 850 C=W 860 H=B 870 INPUT X$ 880 IF X$="X" GOTO 920 890 IF X$<>"O" GOTO 840 900 C=B 910 H=W 920 PRINT "DO YOU WANT TO GO FIRST [Y OR N]"; 930 INPUT X$ 940 IF X$="N" GOTO 1020 950 IF X$<>"Y" GOTO 920 960 REM PRINT INITIAL BOARD 970 GOSUB 3080 980 GOTO 1670 990 REM COMPUTER'S MOVE 1000 IF F2=0 GOTO 1020 1010 INPUT X$ 1020 B1=-1 1030 I3=0\J3=0 1040 T1=C 1050 T2=H 1060 REM SCAN FOR BLANK SQUARE 1070 FOR I=1 TO 8 1080 FOR J=1 TO 8 1090 IF A(I,J)<>0 GOTO 1360 1100 REM FOUND A BLANK SQUARE 1110 REM DOES IT HAVE AN OPPONENT AS A NEIGHBOR ? 1120 GOSUB 2600 1130 IF F1=0 GOTO 1360 1140 REM FOUND AN OPPONENT AS A NEIGHBOR 1150 REM HOW MANY OF HIS PIECES CAN WE FLIP ? 1160 REM (DON'T DO IT NOW) 1170 U=-1 1180 GOSUB 2800 1190 REM EXTRA POINTS FOR BOUNDRY POSITION 1200 IF S1=0 GOTO 1360 1210 IF (I-1)*(I-8)<>0 GOTO 1230 1220 S1=S1+S2 1230 IF (J-1)*(J-8)<>0 GOTO 1260 1240 S1=S1+S2 1250 REM IS THIS BETTER THAN THE BEST FOUND SO FAR ? 1260 IF S1B1 GOTO 1320 1280 REM A TIE; RANDOM DECISION 1290 R=RND(1) 1300 IF R>.5 GOTO 1360 1310 REM YES 1320 B1=S1 1330 I3=I 1340 J3=J 1350 REM END OF SCAN LOOP 1360 NEXT J 1370 NEXT I 1380 REM COULD WE DO ANYTHING ? 1390 IF B1>0 GOTO 1460 1400 REM NO 1410 PRINT "I HAVE TO FORFET MY MOVE" 1420 IF Z=1 GOTO 2170 1430 Z=1 1440 GOTO 1670 1450 REM MAKE THE MOVE 1460 Z=0 1470 PRINT "I WILL MOVE TO "; 1480 PRINT I3; 1490 PRINT ","; 1500 PRINT C$(J3) 1510 I=I3 1520 J=J3 1530 U=1 1540 GOSUB 2800 1550 C1=C1+S1+1 1560 H1=H1-S1 1570 N1=N1+1 1580 PRINT "THAT GIVES ME "; 1590 PRINT S1; 1600 PRINT "OF YOUR PIECES" 1610 REM PRINT OUT BOARD 1620 GOSUB 3080 1630 REM TEST FOR END OF GAME 1640 IF H1=0 GOTO 2170 1650 IF N1=64 GOTO 2170 1660 REM HUMAN'S MOVE 1670 T1=H 1680 T2=C 1690 PRINT "YOUR MOVE -- (ROW,COL)"; 1700 INPUT I,X$ 1710 IF I<0 GOTO 1700 1720 IF I>8 GOTO 1700 1730 IF I<>0 GOTO 1800 1740 PRINT "ARE YOU FORTITING YOUR TURN [Y OR N]"; 1750 INPUT X$ 1760 IF X$="N" GOTO 1690\IF X$<>"Y" GOTO 1740 1770 IF Z=1 GOTO 2170 1780 Z=1 1790 GOTO 1000 1800 FOR J=1 TO 8 1810 IF C$(J)=X$ GOTO 1850 1820 NEXT J 1830 GOTO 1700 1840 REM CHECK IF BLANK 1850 IF A(I,J)=0 GOTO 1890 1860 PRINT "SORRY, THAT SQUARE IS OCCUPIED, TRY AGAIN"; 1870 GOTO 1700 1880 REM CHECK FOR LEGAL NEIGHBOR 1890 GOSUB 2600 1900 IF F1=1 GOTO 1950 1910 PRINT "SORRY, YOU ARE NOT NEXT TO ONE OF MY PIECES."; 1920 PRINT " TRY AGAIN" 1930 GOTO 1700 1940 REM CHECK IF LEGAL RUN 1950 U=-1 1960 GOSUB 2800 1970 IF S1>0 GOTO 2010 1980 PRINT "SORRY, THAT DOES NOT FLANK A ROW. TRY AGAIN"; 1990 GOTO 1700 2000 REM EVERYTHING LEGAL 2010 Z=0 2020 PRINT "THAT GIVES YOU "; 2030 PRINT S1; 2040 PRINT " OF MY PIECES" 2050 U=1 2060 GOSUB 2800 2070 H1=H1+S1+1 2080 C1=C1-S1 2090 N1=N1+1 2100 REM PRINT OUT BOARD 2110 GOSUB 3080 2120 REM TEST FOR END OF GAME 2130 IF C1=0 GOTO 2170 2140 IF N1=64 GOTO 2170 2150 GOTO 1000 2160 REM END OF GAME WRAP UP 2170 PRINT 2180 PRINT "YOU HAVE "; 2190 PRINT H1; 2200 PRINT " PIECES AND I HAVE "; 2210 PRINT C1; 2220 PRINT " PIECES -- "; 2230 IF H1=C1 GOTO 2270 2240 IF H1>C1 GOTO 2290 2250 PRINT "SORRY, I WON THAT ONE." 2260 GOTO 2300 2270 PRINT " A TIE !!" 2280 GOTO 2480 2290 PRINT "YOU WON !" 2300 C1=C1-H1 2310 IF C1>0 GOTO 2330 2320 C1=-C1 2330 C1=(64*C1)/N1 2340 PRINT "THAT WAS A "; 2350 IF C1<11 GOTO 2470 2360 IF C1<25 GOTO 2450 2370 IF C1<39 GOTO 2430 2380 IF C1<53 GOTO 2410 2390 PRINT "PERFECT GAME." 2400 GOTO 2480 2410 PRINT "WALKAWAY." 2420 GOTO 2480 2430 PRINT "FIGHT." 2440 GOTO 2480 2450 PRINT "HOT GAME." 2460 GOTO 2480 2470 PRINT "SQUEAKER !!" 2480 PRINT 2490 PRINT "ANOTHER GAME? [Y OR N]"; 2500 INPUT X$ 2510 IF X$="Y" GOTO 700 2520 IF X$<>"N" GOTO 2490 2530 PRINT "THANKS FOR PLAYING." 2540 STOP 2550 REM 2560 REM SUBROUTINE TEST-FOR-PROPER NEIGHBOR 2570 REM ASSUMES: 2580 REM I,J LOCATES A BLANK SQUARE 2590 REM YOU HAPE TO SEE AN ADJACENT T2 (=-T1) 2600 FOR I1=-1 TO 1 2610 FOR J1=-1 TO 1 2620 IF A(I+I1,J+J1)=T2 GOTO 2690 2630 NEXT J1 2640 NEXT I1 2650 REM NO T2 FOUND; FAILURE 2660 F1=0 2670 RETURN 2680 REM SUCCESS 2690 F1=1 2700 RETURN 2710 REM SUBROUTINE SCORE-AND-UPDATE 2720 REM ASSUMES: 2730 REM (I,J) IS A TENTATIVE PLACE FOR A PIECE T1. 2740 REM WANT RUNS OF T2=-T1, TERMINATED BY A T1. 2750 REM IF U IS TRUE (1), MARK THOSE RUNS AS T1'S. 2760 REM RETURN SUM OF AL RUNS (T2'S ONLY) IN S1. 2770 REM MAIN PROGRAM CONTAINS THE FOLOWING ARRAYS: 2780 REM I4: 0 -1 -1 -1 0 1 1 1 2790 REM J4: 1 1 0 -1 -1 -1 0 1 2800 S1=0 2810 FOR K=1 TO 8 2820 I5=I4(K) 2830 J5=J4(K) 2840 I6=I+I5 2850 J6=J+J5 2860 S3=0 2870 IF A(I6,J6)<>T2 GOTO 3050 2880 REM LOOP THROUGH THE RUN 2890 S3=S3+1 2900 I6=I6+I5 2910 J6=J6+J5 2920 IF A(I6,J6)=T1 GOTO 2950 2930 IF A(I6,J6)=0 GOTO 3050 2940 GOTO 2890 2950 S1=S1+S3 2960 IF U<>1 GOTO 3050 2970 REM UPDATE BOARD 2980 I6=I 2990 J6=J 3000 FOR K1=0 TO S3 3010 A(I6,J6)=T1 3020 I6=I6+I5 3030 J6=J6+J5 3040 NEXT K1 3050 NEXT K 3060 RETURN 3070 REM SUBROUTINE PRINT-BOARD 3080 PRINT 3090 PRINT " A B C D E F G H" 3100 FOR I=1 TO 8 3110 PRINT I; 3120 FOR J=1 TO 8 3130 PRINT " "; 3140 PRINT D$(A(I,J)+1); 3150 NEXT J 3160 PRINT 3170 NEXT I 3180 PRINT 3190 RETURN 3200 END