10REM     othello
20LOMEM :27520
25 moves=-1
30DIM b(99), e(88), bb(66), c(8), d(60), g(25), h(25), w(88), b1(25), b2(25), ev(25), b3(25), cc(25)
40FOR l=0 TO 99:READ b(l):NEXT
50DATA        3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,3,3,0,0,0,2,1,0,0,0,3,3,0,0,0  
60DATA        1,2,0,0,0,3,3,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3
70FOR l=1 TO 8:READ c(l):NEXT
80DATA       -11,-10,-9,-1,1,9,10,11
90FOR l=1 TO 60:READ d(l):NEXT
100DATA        81,88,11,18,83,86,61,68,31,38,13,16,63,66,33,36,84,85
105DATA        51,58,41,48,14,15,64,65,53,56,43,46,34,35,74,75,52,57,42,47,24
110DATA        25,73,76,62,67,32,37,23,26,82,87,71,78,21,28,12,17,72,77,22,27
120FOR l=11 TO 88:READ e(l):NEXT
130DATA        64,-32,32,16,16,32,-32,64,0,0,-32,-64,2,2,2,2,-64,-32,0,0,32,2,8,4,4,8,2,32,0,0,16,2,4,0,0  
140DATA        4,2,16,0,0,16,2,4,0,0,4,2,16,0,0,32,2,8,4,4,8,2,32,0,0,-32,-64,2,2,2,2,-64,-32   
150DATA        0,0,64,-32,32,16,16,32,-32,64
160 x=0: x1=0:GOSUB 5900:GOSUB 5600
170INPUT "Play the computer (y or n)?"; z$
172IF z$="n" THEN  u=-4: b(54)=-4: b(45)=-4: b(55)=4: b(44)=4: moves=moves-1:GOSUB 920:GOTO 220
180IF z$="y" THEN  u=3:GOSUB 2400: moves=moves-1:GOTO 190
182GOTO 170
190 uu=0: vv=0: ff=0:INPUT "Will you go first?"; x$:IF x$<>"n" AND x$<>"y" GOTO 190
197IF x$="n" THEN HOME:? "I always play red.":GOTO 210
200GOSUB 920:GOTO 220
210 b(54)=2: b(55)=1: b(44)=1: b(45)=2:GOSUB 920:FOR de=1 TO 3000:NEXT de:GOTO 580
220 ff=ff+1:IF z$="n" THEN  u=-u
240IF z$="n" AND u=4 THEN ? "Player #1:":GOTO 270
250IF z$="n" AND u=-4 THEN ? "Player #2:":GOTO 270
260? "Your "
270INPUT "move (I,J)? 9,9=pass. "; o, jp
274IF o<1 OR o>9 OR jp<1 OR jp>9 GOTO 270
276 a=INT(a): jp=INT(jp)
310 a=10*o+jp
320IF a=99 AND z$="y" THEN  bb(ff)=a: x1=1:GOTO 580
330IF a=99 AND z$="n" AND u=4 THEN  bb(ff)=a: x=1:GOTO 220
340IF a=99 AND z$="n" AND u=-4 THEN  bb(ff)=a: x1=1:GOTO 220
350IF b(a)<>0 THEN ? "square occupied ": ff=ff-1:GOTO 240
360 bb(ff)=a: x1=0
370IF z$="n" GOTO 2490
380 r5=1:GOSUB 440: r5=0:GOTO 540
390 r5=0: b1=0:FOR r1=1 TO 60: a=d(r1)
400IF b(a)<>0 GOTO 420
410GOSUB 440
420NEXT r1
430 b1(z)=b1:GOTO 730
440 n=0:FOR j=1 TO 8: k=a+c(j)
450IF b(k)<>1 GOTO 500
460 k=k+c(j):IF b(k)=1 THEN 460
470IF b(k)<>2 GOTO 500
480 k=k-c(j):IF k=a GOTO 500
490 n=n+1:IF r5=1 THEN  b(k)=2:GOTO 480
495GOTO 480
500NEXT j
510IF n>0 OR n<b1 GOTO 530
520 b1=n
530RETURN
540IF n>0 GOTO 550
545? "Illegal move":GOTO 240
550IF z$="y" THEN  b(a)=2:GOSUB 920
560IF z$="n" THEN  b(a)=u:GOSUB 920
570IF z$="n" GOTO 220
575REM     computer move
580 ff=ff+1:IF ff=1 GOTO 1240
590IF ll=1 OR ff<=14 GOTO 610
600GOTO 1280
610 n1=0: g(1)=0: r4=0:FOR r=1 TO 60: a=d(r):IF b(a)<>0 GOTO 640
620GOSUB 780
630IF g(1)<>0 AND (ff<=14 OR ll=1) THEN  r4=1:GOSUB 780:GOTO 900
640NEXT r
650IF g(1)=0 GOTO 770
660IF ll=4 AND ff>=53 GOTO 720
665REM     evaluator
670FOR z=1 TO n1
680 ev(z)=e(g(z))+60-cc(z):NEXT z: rr=ev(1): gg=cc(1)
685REM     sort
690FOR z=1 TO n1:IF ev(z)<=rr GOTO 710
700 gg=cc(z)
710NEXT z: a=d(gg): r4=1:GOSUB 780:GOTO 900
720FOR z=1 TO n1: r4=2: a=g(z): b(a)=1: s1=a:GOSUB 780:GOTO 390
730GOSUB 1150: v=0:NEXT z
735REM     flip
740FOR z=1 TO n1:IF b1(z)=0 THEN  b1(z)=.1
750 b3(z)=b2(z)/b1(z):NEXT z
760GOSUB 1160: r4=1:GOSUB 780:GOTO 900
770? "Computer cannot move."; : x=1: bb(ff)=a:IF x=1 AND x1=1 GOTO 1060
772GOTO 220
780 n=0:FOR j=1 TO 8: k=a+c(j)
785REM     legal move?
790IF b(k)<>2 GOTO 860
800 k=k+c(j):IF b(k)=2 THEN 800
810IF b(k)<>1 GOTO 860
820 k=k-c(j):IF k=a GOTO 860
830 n=n+1:IF r4=1 THEN  b(k)=1
840IF r4=2 THEN  b(k)=1: v=v+1: b(v)=k
850GOTO 820
860NEXT j
870IF r4=2 GOTO 890
880IF n>0 THEN  n1=n1+1: g(n1)=a: b2(n1)=n: cc(n1)=r
890RETURN
895REM        computer play
900 s=INT(a/10): t=a-10*s+64: w$=CHR$(t): jp=VAL(w$): v=0: b(a)=1
905 jp=a-(s*10)
910 x=0: bb(ff)=a:? "I play at "; s; ","; jp:FOR j=1 TO n1: h(j)=0: g(j)=0: b2(j)=0: b3(j)=0: b1(j)=0: ev(j)=0: cc(j)=0:NEXT j
912 gg=0:GOSUB 920:GOTO 220
920GOSUB 5100
930IF x=1 AND x1=1 GOTO 1060
940RETURN
1055REM     end
1060 m=0: n=0:FOR k=11 TO 88:IF b(k)=1 OR b(k)=-4 THEN  m=m+1
1070IF b(k)=2 OR b(k)=4 THEN  n=n+1
1080NEXT k
1085? "White="; n; "  Red="; m
1087IF z$="n" GOTO 1130
1090IF m=n THEN ? "We both played well and tied."
1100IF m<n THEN ? "Congratulations. You have won."
1120? "Thank you for a fine game."
1130INPUT "Would you like to play again?"; rsp$:IF LEFT$(rsp$, 1)="Y" OR LEFT$(rsp$, 1)="y" THEN RUN
1140END
1150FOR r=1 TO v: b(h(r))=2:NEXT r: b(s1)=0:RETURN
1160 n=n1: d=1
1170 d=d*2:IF d<n GOTO 1170
1180 d=INT((d-1)/2)
1190IF d=0 THEN  a=g(1):RETURN
1200 it=n-d:FOR i=1 TO it: j=i
1210 l=j+d
1220IF b3(l)>b3(j) THEN  t=b3(l): t1=g(j): b3(j)=b3(l): g(j)=g(l): b3(l)=t: g(l)=t1: j=j-d:GOTO 1226
1224GOTO 1230
1226IF j>0 GOTO 1210
1230NEXT i:GOTO 1180
1235REM     opener
1240 ss=INT(1+RND(1)*4)
1245IF ss=1 THEN  a=35: b(45)=1:GOTO 900
1250IF ss=2 THEN  a=46: b(45)=1:GOTO 900
1260IF ss=3 THEN  a=53: b(54)=1:GOTO 900
1270IF ss=4 THEN  a=64: b(54)=1:GOTO 900
1275REM     map array
1280 a$="": b$="": c$="": d$="":FOR k=11 TO 18:IF b(k)=0 THEN  a$=a$+"0"
1290IF b(k)=1 THEN  a$=a$+"1"
1300IF b(k)=2 THEN  a$=a$+"2"
1310IF b(k+70)=0 THEN  b$=b$+"0"
1320IF b(k+70)=1 THEN  b$=b$+"1"
1330IF b(k+70)=2 THEN  b$=b$+"2"
1340NEXT
1350FOR k=11 TO 81 STEP 10:IF b(k)=0 THEN  c$=c$+"0"
1360IF b(k)=1 THEN  c$=c$+"1"
1370IF b(k)=2 THEN  c$=c$+"2"
1380IF b(k+7)=0 THEN  d$=d$+"0"
1390IF b(k+7)=1 THEN  d$=d$+"1"
1400IF b(k+7)=2 THEN  d$=d$+"2"
1405REM     updater
1410NEXT
1420IF b(11)=1 THEN  e(12)=20: e(21)=20: e(22)=20
1430IF b(18)=1 THEN  e(17)=20: e(27)=20: e(28)=20
1440IF b(81)=1 THEN  e(71)=20: e(72)=20: e(82)=20
1450IF b(88)=1 THEN  e(77)=20: e(78)=20: e(87)=20
1460IF a$="00111100" OR a$="01111100" OR a$="00112200" OR a$="00111200" THEN  e(17)=24
1470IF a$="00111100" OR a$="00111110" OR a$="00221100" OR a$="00222100" OR a$="00211100" THEN  e(12)=24
1480IF b$="00111100" OR b$="01111100" OR b$="00112200" OR b$="00122200" OR b$="00111200" THEN  e(87)=24
1490IF b$="00111100" OR b$="00111110" OR b$="00221100" OR b$="0022210" OR b$="00211100" THEN  e(82)=24
1500IF c$="00111100" OR c$="01111100" OR c$="00112200" OR c$="00122200" OR c$="00111200" THEN  e(71)=24
1510IF c$="00111100" OR c$="00111110" OR c$="00221100" OR c$="00222100" OR c$="00211100" THEN  e(21)=24
1520IF d$="00111100" OR d$="01111100" OR d$="00112200" OR d$="00122200" OR d$="00111200" THEN  e(78)=24
1530IF d$="00111100" OR d$="00111110" OR d$="00221100" OR d$="00222100" OR d$="00211100" THEN  e(28)=24
1540IF a$="20111110" THEN  e(12)=-64
1550IF a$="01111102" THEN  e(17)=-64
1560IF b$="20222220" THEN  e(82)=-64
1570IF b$="01111102" THEN  e(87)=-64
1580IF c$="20111110" THEN  e(21)=-64
1590IF c$="01111102" THEN  e(71)=-64
1600IF d$="20111110" THEN  e(28)=-64
1610IF d$="01111102" THEN  e(78)=-64
1620IF a$="02220100" THEN  e(15)=-32
1630IF a$="00102220" THEN  e(14)=-32
1640IF b$="02220100" THEN  e(85)=-32
1650IF b$="00102220" THEN  e(84)=-32
1660IF c$="02220100" THEN  e(51)=-32
1670IF c$="00102220" THEN  e(41)=-32
1680IF d$="02220100" THEN  e(58)=-32
1690IF d$="00102220" THEN  e(48)=-32
1700IF LEFT$(a$, 4)="0102" THEN  e(13)=-32
1705IF RIGHT$(a$, 4)="2010" THEN  e(16)=-32
1710IF LEFT$(b$, 4)="0102" THEN  e(83)=-32
1715IF RIGHT$(b$, 4)="2010" THEN  e(86)=-32
1720IF LEFT$(c$, 4)="0102" THEN  e(31)=-32
1725IF RIGHT$(c$, 4)="2010" THEN  e(61)=-32
1730IF LEFT$(d$, 4)="0102" THEN  e(38)=-32
1735IF RIGHT$(d$, 4)="2010" THEN  e(68)=-32
1740IF a$="00002100" THEN  e(14)=24
1745IF a$="00120000" THEN  e(15)=24
1750IF b$="00002100" THEN  e(84)=24
1755IF b$="00120000" THEN  e(85)=24
1760IF c$="00002100" THEN  e(41)=24
1765IF c$="00120000" THEN  e(51)=24
1770IF d$="00002100" THEN  e(48)=24
1775IF d$="00120000" THEN  e(58)=24
1780IF a$="00001110" THEN  e(14)=24
1785IF a$="01110000" THEN  e(15)=24
1790IF b$="00001110" THEN  e(84)=24
1795IF b$="01110000" THEN  e(85)=24
1800IF c$="00001110" THEN  e(41)=24
1805IF c$="01110000" THEN  e(51)=24
1810IF d$="00001110" THEN  e(48)=24
1815IF d$="01110000" THEN  e(58)=24
1820IF a$="00210000" OR a$="00221000" OR a$="00211000" OR a$="00211110" THEN  e(12)=24
1830IF a$="00001200" OR a$="00012200" OR a$="0011200" OR a$="01111200" THEN  e(17)=24
1840IF b$="00210000" OR b$="00221000" OR b$="00211000" OR b$="00211110" THEN  e(82)=24
1850IF b$="00001200" OR b$="00012200" OR b$="00011200" OR b$="01111200" THEN  e(87)=24
1860IF c$="00210000" OR c$="00221000" OR c$="0021100" OR c$="00211110" THEN  e(21)=24
1870IF c$="00001200" OR c$="00012200" OR c$="00011200" OR c$="01111200" THEN  e(71)=24
1880IF d$="00210000" OR d$="00221000" OR d$="00211000" OR d$="02111100" THEN  e(28)=24
1890IF d$="00001200" OR d$="00012200" OR d$="00011200" OR d$="01111200" THEN  e(78)=24
1900IF a$="00022200" OR a$="00222200" THEN  e(17)=-32
1905IF a$="00222000" OR a$="00222200" THEN  e(12)=-32
1910IF b$="00022200" OR b$="00222200" THEN  e(87)=-32
1915IF b$="00222000" OR b$="00222200" THEN  e(82)=-32
1920IF c$="00022200" OR c$="00222200" THEN  e(71)=-32
1925IF c$="00222000" OR c$="00222200" THEN  e(21)=-32
1930IF d$="00022200" OR d$="00222200" THEN  e(78)=-32
1935IF d$="00222000" OR d$="00222200" THEN  e(28)=-32
1940IF a$="00200200" THEN  e(14)=-2: e(15)=-2
1950IF b$="00200200" THEN  e(84)=-2: e(85)=-2
1960IF c$="00200200" THEN  e(41)=-2: e(51)=-2
1970IF d$="00200200" THEN  e(48)=-2: e(58)=-2
1980IF a$="01110000" THEN  e(16)=-32
1985IF a$="00001110" THEN  e(13)=-32
1990IF b$="0111000" THEN  e(86)=-32
1995IF b$="00001110" THEN  e(83)=-32
2000IF c$="01110000" THEN  e(83)=-32
2005IF c$="00001110" THEN  e(32)=-32
2010IF d$="01110000" THEN  e(68)=-21
2015IF d$="00001110" THEN  e(38)=-32
2020IF a$="01110200" THEN  e(15)=-32
2023IF a$="01111020" OR a$="00111020" THEN  e(16)=-32
2025IF a$="00201110" THEN  e(14)=-32
2027IF a$="02011110" OR a$="02011100" THEN  e(13)=-32
2030IF b$="01110200" THEN  e(85)=-32
2033IF b$="01111020" OR b$="00111020" THEN  e(86)=-32
2035IF b$="00201110" THEN  e(84)=-32
2037IF b$="02011110" OR b$="02011100" THEN  e(83)=-32
2040IF c$="01110200" THEN  e(51)=-32
2043IF c$="01111020" OR c$="00111020" THEN  e(61)=-32
2045IF c$="00201110" THEN  e(41)=-32
2047IF c$="02011110" OR c$="02011100" THEN  e(31)=-32
2050IF d$="01110200" THEN  e(58)=-32
2053IF d$="01111020" OR d$="00111020" THEN  e(68)=-32
2055IF d$="00201110" THEN  e(48)=-32
2057IF d$="02011110" OR d$="02011100" THEN  e(38)=-32
2060IF a$="02222200" THEN  e(17)=-96
2070IF a$="00222220" THEN  e(12)=-96
2080IF b$="02222200" THEN  e(87)=-96
2090IF b$="00222220" THEN  e(82)=-96
2100IF c$="02222200" THEN  e(71)=-96
2110IF c$="00222220" THEN  e(21)=-96
2120IF d$="02222200" THEN  e(78)=-96
2130IF d$="00222220" THEN  e(28)=-96
2140IF ll<3 THEN 2390
2145REM     computer play trick
2150IF a$="00222220" AND b(31)<>0 THEN  e(22)=24
2160IF a$="20222220" THEN  e(12)=34
2170IF a$="02222200" AND b(38)=0 THEN  e(27)=24
2180IF a$="02222202" THEN  e(17)=34
2190IF b$="00222220" AND b(61)<>0 THEN  e(77)=24
2200IF b$="20222220" THEN  e(82)=34
2210IF b$="02222200" AND b(68)=0 THEN  e(77)=24
2220IF b$="02222202" THEN  e(87)=34
2230IF c$="00222220" AND b(13)<>0 THEN  e(22)=24
2240IF c$="20222220" THEN  e(21)=34
2250IF c$="02222200" AND b(83)<>0 THEN  e(72)=24
2260IF c$="02222202" THEN  e(71)=34
2270IF d$="00222220" AND b(16)<>0 THEN  e(27)=24
2280IF d$="20222220" THEN  e(28)=34
2290IF d$="02222200" AND b(86)<>0 THEN  e(77)=24
2300IF d$="02222202" THEN  e(78)=34
2305REM     computer protects
2310IF a$="00111110" OR c$="00111110" THEN  e(11)=-96
2320IF a$="01111100" OR d$="00111110" THEN  e(18)=-96
2330IF b$="00111110" OR c$="01111100" THEN  e(81)=-96
2340IF b$="01111100" OR d$="01111100" THEN  e(88)=-96
2350IF a$="01111110" THEN  e(11)=64: e(18)=64
2360IF b$="01111110" THEN  e(81)=64
2370IF c$="01111110" THEN  e(11)=64
2380IF d$="01111110" THEN  e(18)=64
2390GOTO 610
2395REM     level?
2400INPUT "How hard should I think (1-4)"; l:IF l<>1 AND l<>2 AND l<>3 AND l<>4 GOTO 2400
2402RETURN
2485REM     2 players
2490 n=0:FOR j=1 TO 8: k=a+c(j)
2500IF b(k)<>-u GOTO 2550
2510 k=k+c(j):IF b(k)=-u THEN 2510
2520IF b(k)<>u GOTO 2550
2530 k=k-c(j):IF k=a GOTO 2550
2540 n=n+1: b(k)=u:GOTO 2530
2550NEXT j: x=0:GOTO 540
5100REM     update board
5110 cj=73: ci=25: q=0
5120FOR i=2 TO 9
5130FOR j=2 TO 9
5140 q=q+1
5150IF b(q)=3 GOTO 5140
5160IF b(q)=1 OR b(q)=-4 THEN HCOLOR =5:DRAW 11 AT cj, ci
5170IF b(q)=2 OR b(q)=4 THEN HCOLOR =3:DRAW 11 AT cj, ci
5180 cj=cj+si
5200NEXT j
5210 ci=ci+si: cj=cj-(si*8)
5220NEXT i
5225 moves=moves+1
5227IF moves>59 GOTO 1060
5230? "Board positions after "; moves; " moves."
5240RETURN
5600REM        draw board 
5605HGR:SCALE =4: si=14:REM                           increment between squares  
5606HCOLOR =9
5610 cj=70: ci=20
5620FOR j=1 TO 8
5630FOR i=1 TO 8
5640DRAW 12 AT cj, ci
5650 ci=ci+si
5660NEXT i
5670 ci=ci-(8*si): cj=cj+si
5680NEXT j
5690SCALE =2: cj=60: ci=22
5700FOR i=1 TO 8
5710DRAW i AT cj, ci
5715 ci=ci+si
5720NEXT i
5730 cj=72: ci=10
5740FOR j=1 TO 8
5750DRAW j AT cj, ci
5760 cj=cj+si
5770NEXT j
5780DRAW 9 AT 50, 80:DRAW 10 AT 125, 1
5790GOSUB 5100
5800RETURN
5900REM        set up shape table 
5920FOR l=0 TO 109:READ a:POKE 27407+l, a:NEXT
5930DATA        12,0,26,0,30,0,37,0,44,0,51,0,59,0,65,0,70,0,79,0,85,0,90,0,102,0
5940DATA        54,54,6,0,45,54,63,54,45,5,0,45,54,47,54,63,7,0,54,45,36,54,54, 6,0,45,63,54,45,54,63,7,0 
5950DATA        54,54,45,36,63,0,45,54,54,6,0,45,54,54,63,36,36,54,45,0,45,55,54,61,39,0,54,30,63,32,0 
5960DATA        41,21,63,55,45,53,59,00,00,00,00,0,45,53,54,62,63,36,36,0
5970POKE 16766, 15:POKE 16767, 107
5980RETURN
