10 REM OTHEL.ECB 15 REM ...OTHELLO.....AUTHOR: Richard O. Duda...... 20 REM ...Made to work on UNIVAC by Tom Keerl & Bruce Rumrey 30 REM ...Converted to ACORN basic by Dan Kluth...UTS-700... 40 REM ...Converted to SOL-20 EC basic by R. Hopkins 7-15-80 50 REM ...Plays the Game OTHELLO with two strategies 60 REM ....... 1. Take the maximum number of pieces 70 REM ....... 2. Add a bonus for outside position 80 REM ...The board is array A, bounded by 0's (blanks) 90 REM ...A=0 for empty square 100 REM ...A=B for BLACK square -- X (internally -1) 110 REM ...A=W for WHITE square -- O (internally +1) 120 REM ...I and J always used for row/column indices 130 REM ...S and T store increments to the 8 neighbors 140 REM ...A$(300) Store characters for the board 150 REM ...b$(30) Border characters for the board 160 REM ...C$ and D$ store characters A-h,X,.,0 for output 170 DIM A(10,10),S(10),T(10),A$(200),B$(30),C$(10),D$(10),Z$(32) 180 LET M=RND(1): LET K$="&K": PRINT K$: REM ...Clear screen 190 LET C$=" ABCDEFGH ": LET D$="X.O" 200 LET B=-1: LET W=1: REM ...Internal values: Black & White 210 LET J$="&J": REM ...Line feed 220 FOR Z=1 TO 30: LET B$=B$+CHR(5): NEXT Z 230 PRINT TAB(15);B$ 240 PRINT TAB(15);CHR(5);TAB(43);CHR(5): PRINT TAB(15); 250 PRINT CHR(5);" GREETINGS from OTHELLO ";CHR(5) 260 PRINT TAB(15);CHR(5);TAB(43);CHR(5) 270 PRINT TAB(15);B$;" Rev. C" 280 DATA 2,0,-1,-1,-1,0,1,1,1,2 290 DATA 2,1,1,0,-1,-1,-1,0,1,2 300 FOR K=1 TO 10: READ S(K): NEXT K 310 FOR K=1 TO 10: READ T(K): NEXT K 320 FOR K=1 TO 10 330 LET A$=A$+" " 340 NEXT K 350 FOR Z=1 TO 5: PRINT : NEXT Z 360 INPUT (1,0)"Do you want instructions? ---=>",X$ 370 LET X$=X$+"N" 380 IF X$(1,1)="N" THEN 550 ELSE PRINT K$ 390 PRINT " OTHELLO is played on an 8x8 checker board, rows" 400 PRINT "numbered 1 to 8 and columns A to H. The initial" 410 PRINT "configuration is all blank, except for the center" 420 PRINT "four squares, which form the pattern." 430 PRINT TAB(15);"O X": PRINT TAB(15);"X O" 440 PRINT "Try to place your piece so that it outflanks" 450 PRINT "mine, creating a horizontal, vertical, or" 460 PRINT "diagonal run of my pieces bounded at each end by" 470 PRINT "at least one of yours. This will flip my pieces," 480 PRINT "turning them into yours. #NOTE# You must capture" 490 PRINT "at least one of my pieces in this way if it is at" 500 PRINT "all possible. If it is not possible, you forfeit" 510 PRINT "your turn by entering 0,0 for your move.";J$ 520 PRINT "Do you want alternate symbols? ( O=C X=";CHR(7); 530 INPUT (1,0)") ---=>",X$: LET X$=X$+"N" 540 IF X$(1,1)="Y" THEN LET D$=CHR(7)+".C" 550 PRINT J$;"Should I play my best strategy ? ---=>"; 560 INPUT (1,0)X$: LET X$=X$+"Y": LET S2=0: LET S=1 570 IF X$(1,1)="Y" THEN LET S2=INT(RND(0)*3)+2 580 IF S2>0 THEN LET S=S2-1: REM ....Set up a new game 590 FOR I=1 TO 10 600 FOR J=1 TO 10 610 LET A(I,J)=0: LET Z=2*(I*10+J)-20: LET A$(Z,Z)="." 620 NEXT J 630 NEXT I 635 IF S2=2 THEN PRINT "This could be a wild game." 636 IF S2=3 THEN PRINT "Good luck." 637 IF S2=4 THEN PRINT "You could lose this one." 640 LET A(5,5)=W: LET A(6,6)=W: REM ...White 650 LET A$(90,90)=D$(A(5,5)+2,A(5,5)+2) 660 LET A$(112,112)=D$(A(6,6)+2,A(6,6)+2) 670 LET A(5,6)=B: LET A(6,5)=B: REM ...Black 680 LET A$(92,92)=D$(A(5,6)+2,A(5,6)+2) 690 LET A$(110,110)=D$(A(6,5)+2,A(6,5)+2) 700 LET C1=2: LET H1=2: LET N1=4: LET Z=0 710 PRINT : REM -----------------Human's choices 720 PRINT " Do you want to have "; 730 IF D$(3,3)="C" THEN PRINT "X=";CHR(7);" or O=C"; 740 IF D$(3,3)<>"C" THEN PRINT "X or O"; 750 INPUT (1,0)" ---=>",X$: LET X$=X$+"X" 760 IF X$(1,1)="O" THEN LET C=B ELSE LET C=W 770 IF X$(1,1)="O" THEN LET H=W ELSE LET H=B 775 PRINT " You have ";D$(1,1);" and I have ";D$(3,3) 780 PRINT : PRINT " Do you want to go first ---=>"; 790 INPUT (1,0)X$: LET X$=X$+"Y": PRINT 800 IF X$(1,1)="N" THEN 870 810 REM ---------Print initial board 820 PRINT K$;" ### INITIAL GAME BOARD ###";J$ 830 GOSUB 2900 840 IF C=B THEN PRINT " ";D$(3,3);"'S Input Example ---=>?6,D" 850 IF C=W THEN PRINT " ";D$(1,1);"'S Input Example ---=>?5,F" 860 GOTO 1660 870 LET M=INT(RND(0)*10)+1: REM --------COMPUTOR'S move 880 RESTORE 900 890 FOR E=1 TO M: READ Z$: NEXT E 900 DATA "it's stragedy.","it's best move.","a daring move." 910 DATA "how to best wipe you out.","a bold counter-move." 930 DATA "a fantastic move.","a smashing play." 940 DATA "the smartest move.","a good move.","a great jump." 960 PRINT "The COMPUTOR is now considering ";Z$ 970 LET B1=-1: LET I3=0: LET J3=0: PRINT 980 LET T1=C: LET T2=H: LET S1=0: LET T=C1+H1 990 REM -------------- Scan for blank square 1000 FOR I=2 TO 9 1010 FOR J=2 TO 9 1020 IF A(I,J)<>0 THEN 1460 1030 REM ----------- Found a blank square 1040 REM ----------- Does it have a neighboring opponent 1050 GOSUB 2480 1060 IF F1=0 THEN 1460 1070 REM -------------- Found a neighboring opponent 1080 REM -------------- How many pieces can we flip? 1090 REM -------------- (But don't do it now) 1100 LET U=-1 1110 GOSUB 2680 1120 REM -------------- Extra points for boundary position 1130 IF S1=0 THEN 1460 1131 IF S2=0 THEN 1350 1132 LET M=(I-2)*(I-9)+(J-2)*(J-9): IF M<>0 THEN 1135 1133 LET S1=S1+S2*S2: GOTO 1350: REM ...Take the corner!! 1135 IF I=3 OR I=8 THEN LET S1=S1/S 1140 IF I=2 OR I=9 THEN LET S1=S1+S2+S ELSE 1230 1145 IF I4=0 AND S2=4 THEN 1350 1146 IF J=3 OR J=8 THEN LET S1=S1/(S2+S) 1147 IF I4=0 AND S2<4 THEN 1240 1150 LET K=A(I,J-1),L=A(I,J+1),E=K+L,S1=S1/2 1160 IF E=C THEN LET S1=S1+2 ELSE 1170: REM ...Build along edge 1165 IF S2<4 AND C1+S2*5>H1 THEN 1350 1170 IF E=H THEN LET S1=.3: REM ...Human can re-jump 1180 IF K=0 AND L=0 THEN 1200 1190 IF E=0 THEN LET S1=.25: REM ...H can rejump more C's 1200 IF K=H AND L=H THEN LET S1=S1+S2 ELSE 1210 1205 IF S2<4 AND T>25+S2*5 THEN 1350 1210 LET M=(I-2)*(I-9)+(J-3)*(J-8): IF M<>0 THEN 1230 1220 IF E=H THEN LET S1=.1: REM ...Human can get corner 1230 IF J=3 OR J=8 THEN LET S1=S1/S 1240 IF J=2 OR J=9 THEN LET S1=S1+S2+S ELSE 1320 1245 IF J4=0 AND S2=4 THEN 1350 1246 IF I=3 OR I=8 THEN LET S1=S1/(S2+S) 1247 IF J4=0 AND S2<4 THEN 1320 1250 LET K=A(I-1,J),L=A(I+1,J),E=K+L,S1=S1/2 1260 IF E=C THEN LET S1=S1+2 ELSE 1270: REM ...Build along edge 1265 IF S2<4 AND C1+S2*5>H1 THEN 1350 1270 IF E=H THEN LET S1=.3: REM ...Human can re-jump 1280 IF K=0 AND L=0 THEN 1300 1290 IF E=0 THEN LET S1=.25: REM ...H can rejump more C's 1300 IF K=H AND L=H THEN LET S1=S1+S2 ELSE 1310 1305 IF S2<4 AND T>25+S2*5 THEN 1350 1310 LET M=(I-3)*(I-8)+(J-2)*(J-9): IF M<>0 THEN 1320 1315 IF E=H THEN LET S1=.1: REM ...Human can get corner 1320 IF I>2 AND I<9 THEN 1327 1325 IF I4=0 THEN 1346 1327 IF J>2 AND J<9 THEN 1329 1328 IF J4=0 THEN 1346 1329 LET M=(I-3)*(I-8)+(J-3)*(J-8): REM ...2B 2G 7B 7G 1330 IF M=0 THEN LET S1=.2 ELSE 1346 1335 IF A(2,2)<>0 THEN 1338 1337 IF I=3 OR J=3 THEN LET S1=.15 1338 IF A(2,9)<>0 THEN 1341 1339 IF I=3 OR J=8 THEN LET S1=.15 1341 IF A(9,2)<>0 THEN 1343 1342 IF I=8 OR J=3 THEN LET S1=.15 1343 IF A(9,9)<>0 THEN 1345 1344 IF I=8 OR J=8 THEN LET S1=.15 1345 IF S2<4 OR T>20 THEN 1350 1346 IF I=4 AND J=7 THEN LET S1=S1+S 1347 IF I=4 AND J=4 THEN LET S1=S1+S 1348 IF I=7 AND J=4 THEN LET S1=S1+S 1349 IF I=7 AND J=7 THEN LET S1=S1+S 1350 REM --Best move so far? 1360 IF S1B1 THEN 1440 1380 REM --------- A tie. Make a random decision 1385 IF S2<3 THEN 1390 1387 IF S4>S5 THEN 1440: REM ...Take max men 1390 IF RND(0)>.5 THEN 1450 1400 REM --------- Yes 1440 LET B1=S1: LET I3=I: LET J3=J: LET S5=S4 1450 REM --------- End of scan loop 1460 NEXT J 1470 NEXT I 1480 REM --------- Could we do anything? 1490 IF B1>0 THEN 1550 1500 REM --------- No 1510 PRINT "I HAVE TO FORFEIT MY MOVE." 1520 IF Z=1 THEN 2200 1530 LET Z=1: GOTO 1660 1540 REM --------- MAKE THE MOVE 1550 LET Z=0 1560 PRINT K$;"I will move to ";I3-1;",";C$(J3,J3); 1570 LET I=I3: LET J=J3: LET U=1 1580 GOSUB 2680 1590 LET C1=C1+S1+1: LET H1=H1-S1: LET N1=N1+1 1600 PRINT " giving me";S1;" of your pieces": PRINT 1601 LET M=INT(RND(0)*9): IF S1<5 THEN 1610 ELSE RESTORE 1603 1602 FOR E=1 TO M: READ Z$: NEXT E 1603 DATA "Take THAT !!!","How'd that grab ya?"," GOTCHA! " 1604 DATA "The EMPIRE strikes back","HA-HA HA-HA" 1605 DATA "The PHANTOM retaliates"," R E V E N G E " 1606 DATA "Great move, Einstien","Gotcha back, JACK" 1609 CURSOR 1,25: PRINT "### ";Z$;" ###";: CURSOR 2,0 1610 GOSUB 2900: REM --------- Print out board 1620 REM --------- Test for end of game 1630 IF H1=0 THEN 2200 1640 IF N1=64 THEN 2200 1650 REM --------- Human's move 1660 LET T1=H: LET T2=C 1670 PRINT "Input your move. (Row, Col.) ---=>"; 1680 INPUT I,X$: LET X$=X$+"X": LET I=I+1 1690 IF I<1 OR I>9 THEN 1670 1700 IF I<>1 THEN 1760 1710 PRINT " Are you forfeiting your turn ---=>"; 1720 INPUT (1,0)X$: LET X$=X$+"Y" 1730 IF X$(1,1)<>"Y" THEN 1670 1740 IF Z=1 THEN 2180 1750 LET Z=1: GOTO 870 1760 REM --------Human inputs are O.K. 1770 FOR J=2 TO 9 1780 IF C$(J,J)=X$(1,1) THEN EXIT 1820 1790 NEXT J 1800 GOTO 1670 1810 REM --------- Check if blank 1820 IF A(I,J)=0 THEN 1860 1830 PRINT "SORRY, that square is occupied. Try again." 1840 GOTO 1670 1850 REM ----------- Check for legal neighbor 1860 GOSUB 2480 1870 IF F1=1 THEN 1920 1880 PRINT "SORRY, you are not next to one of my pieces." 1890 PRINT "....Try again." 1900 GOTO 1670 1910 REM ----------- Check if legal run 1920 LET U=-1 1930 GOSUB 2680 1940 IF S1>0 THEN 1980 1950 PRINT "SORRY, that doesn't flank a row. Try again." 1960 GOTO 1670 1970 REM ----------- Everything legal. Make human's move. 1980 LET Z=0 1990 PRINT K$;"Your move to ";I-1;",";C$(J,J); 2000 PRINT " gives you ";S1;" of my pieces.": PRINT 2010 IF S1<5 THEN 2090 ELSE RESTORE 2040 2020 LET M=INT(RND(0)*10)+1 2030 FOR E=1 TO M: READ Z$: NEXT E 2040 DATA "Please, gimme a break","O.K., buzzaRD__rd breath!" 2050 DATA "I'll get you for this!","Thanks a heap" 2060 DATA "REVENGE maybe forthcomming!","Explative deleted" 2070 DATA " O U C H ! ","You TURKEY","Oh RATS !!","DAMM !!" 2080 CURSOR 1,25: PRINT "*** ";Z$;" ***";: CURSOR 2,0 2090 LET U=1 2100 GOSUB 2680 2110 LET H1=H1+S1+1: LET C1=C1-S1: LET N1=N1+1 2120 REM ----------- Print out board 2130 GOSUB 2900 2140 REM ----------- Test for end of game 2150 IF C1=0 THEN 2200 2160 IF N1=64 THEN 2200 2170 GOTO 970 2180 GOSUB 2900: REM ----------- End of game. Wrap up 2200 PRINT "You have";H1;" pieces and I have ";C1;" pieces." 2210 IF H1=C1 THEN 2240 2220 IF H1>C1 THEN 2250 2230 PRINT "SORRY, I won that one.": GOTO 2260 2240 PRINT "*** T I E ***": GOTO 2360 2250 PRINT "You won! LUCKY!" 2260 LET C1=C1-H1 2270 IF C1>0 THEN 2290 2280 LET C1=-C1 2290 LET C1=(64*C1)/N1 2300 PRINT "+*+ That was a "; 2310 IF C1<11 THEN PRINT "Squeaker." 2320 IF C1>10 AND C1<25 THEN PRINT "HOT GAME." 2330 IF C1>24 AND C1<39 THEN PRINT "FIGHT." 2340 IF C1>38 AND C1<53 THEN PRINT "WALKAWAY." 2350 IF C1>52 THEN PRINT "PERFECT GAME!" 2360 PRINT 2370 PRINT "Do you want to play another game (Y or N) ---=>"; 2380 INPUT (1,0)X$: LET X$=X$+"X": LET S=1 2390 IF X$(1,1)="N" THEN 2420 2400 IF S2>0 THEN LET S2=INT(RND(0)*3)+2 2410 IF X$(1,1)="Y" THEN 580 2420 PRINT "<+> T H A N K S for playing <+>" 2430 GOTO 2990 2440 REM ----------- Subroutine: Test for proper neighbor 2450 REM ----------- Assumes: 2460 REM ----------- I, J lost a blank square 2470 REM ----------- You hope to see an adjacent t2 (= -t1) 2480 FOR I1=-1 TO 1 2490 FOR J1=-1 TO 1 2500 IF A(I+I1,J+J1)=T2 THEN EXIT 2570 2510 NEXT J1 2520 NEXT I1 2530 REM ----------- No T2 found: FAILURE 2540 LET F1=0 2550 RETURN 2560 REM ----------- SUCCESS 2570 LET F1=1 2580 RETURN 2590 REM ----------- Subroutine: SCORE AND UPDATE 2600 REM ----------- Assumes: 2610 REM ----------- (I,J) Is a tentative place for piece T1 2620 REM ----------- Want runs of T2=-T1, terminated by a T1 2630 REM ----------- If U is true (1), mark those runs as T1s 2640 REM ----------- Return sum of all runs (T2s only) in S1. 2650 REM ----------- MAIN program containing following arrays 2660 REM ----------- S: 0 -1 -1 -1 0 1 1 1 2670 REM ----------- T: 1 1 0 -1 -1 -1 0 1 2680 LET S1=0 2690 FOR K=2 TO 9 2700 LET I5=S(K): LET J5=T(K) 2710 LET I6=I+I5: LET J6=J+J5: LET S3=0 2720 IF A(I6,J6)<>T2 THEN 2870 2730 REM ----------- Loop through the run 2740 LET S3=S3+1: LET I6=I6+I5: LET J6=J6+J5 2750 IF A(I6,J6)=T1 THEN 2780 2760 IF A(I6,J6)=0 THEN 2870 2770 GOTO 2740 2780 LET S1=S1+S3: LET I4=I5: LET J4=J5: LET S4=S1 2790 IF U<>1 THEN 2870 2800 REM ----------- Update board 2810 LET I6=I: LET J6=J 2820 FOR K1=0 TO S3 2830 LET A(I6,J6)=T1: LET Z=(I6*20+J6*2)-20 2840 LET N=A(I6,J6)+2: LET A$(Z,Z)=D$(N,N) 2850 LET I6=I6+I5: LET J6=J6+J5 2860 NEXT K1 2870 NEXT K 2880 RETURN 2890 REM -------------Subroutine to print board 2900 PRINT " A B C D E F G H" 2910 PRINT " ";B$(1,19) 2920 FOR I=2 TO 9 2930 LET Z=(I*20)-17 2940 PRINT I-1;" ";CHR(5);A$(Z,Z+16);CHR(5) 2950 NEXT I 2960 PRINT " ";B$(1,19) 2970 PRINT 2980 RETURN 2990 END