100 DIM b(100),bl(100),st_ss(100),st_sp(100),s(100),ab(15)
110 RESTORE 1230
120 FOR i=11 TO 81 STEP 10
130 FOR j=i TO i+7:READ s(j)
140 END FOR i
150 PAPER 2:INK 7:WINDOW 448,200,32,16:CLS:CSIZE 1,0
160 sc=0:nsa=0:nsd=0
170 INPUT "LEVEL?"!lv
180 CLS
190 AT 1,17:PRINT "   A B C D E F G H"
200 FOR i=1 TO 8:PRINT TO 17;i!FILL$(" .",16)
210 bs=0:st=1:mv=0
220 plot_piece 44,-1:plot_piece 45,1:plot_piece 54,1:place_piece 55,-1,1,0
230 REPeat mv
240 AT 14,10:INPUT "Your move"!mv$
250 AT 16,10:CLS 3
260 IF mv$="!" THEN GO TO 380
270 IF LEN(mv$)<>2 THEN GO TO 360
280 m1=mv$(1) INSTR "12345678"
290 m2=mv$(2) INSTR "ABCDEFGH"
300 IF m1<1 OR m2<1 THEN GO TO 360
310 cp=m1*10+m2
320 IF b(cp)<>0 THEN GO TO 360
330 st=0:bs=0
340 sc=-sc:place_piece cp,-1,1:sc=-sc
350 IF st<>bs THEN GO TO 380
360 PRINT "ERROR!"
370 GO TO 240
380 AT 14,10:CLS 3
390 BEEP 5000,10,20,1000,1
400 st=0:bp=0
410 rs=check_board(1,-1,INT(lv*mv/32)+1,mv)
420 BEEP 9000,0,10,1000,1
430 AT 16,10
440 IF bp=0 THEN PRINT "I can't move":GO TO 240
450 bs=0
460 PRINT "I move"!CHR$(mp DIV 10+48);CHR$(mp MOD 10+64)
480 place_piece bp,1,-1
490 END REPeat mv
500 DEFine FuNction check_board(sa,sd,lv,mv)
510 LOCal cp,bs,ns,hs,ss
520 bs=st:ss=sc:ns=0:hs=-99999
530 FOR cp=11 TO 18,21 TO 28,31 TO 38,41 TO 48,51 TO 58,61 TO 68,71 TO 78,81 TO 88
540 IF b(cp)<>0 OR bl(cp)=0 THEN NEXT cp:RETurn hs
550 FOR i=-10,-9,1,11,10,9,-1,-11
555 IF b(cp+i)<>sd THEN NEXT i:GO TO 600
560 p=cp+i
570 REPeat j:p=p+i:IF b(p)<>sd THEN EXIT j
580 IF b(p)<>sa THEN NEXT i:GO TO 600
590 FOR j=cp+i TO p-i STEP i:st_ss(st)=sd:st_sp(st)=j:st=st+1:b(j)=sa:ns=ns+2*s(j)+mv
600 END FOR i
610 IF bs=st THEN NEXT cp:RETurn hs
620 ns=ns+s(cp)+mv:sc=sa*sc+ns
650 IF lv=0 THEN rs=sc:GO TO 720
660 b(cp)=sa
670 FOR i=cp-10,cp-9,cp+1,cp+11,cp+10,cp+9,cp-1,cp-11:bl(i)=bl(i)+1
680 rs=check_board(-sa,-sd,lv-1,mv+1)
690 FOR i=cp-10,cp-9,cp+1,cp+11,cp+10,cp+9,cp-1,cp-11:bl(i)=bl(i)-1
700 b(cp)=0
720 FOR i=bs TO st-1:b(st_sp(i))=st_ss(i)
730 st=bs:sc=ss:ns=0
740 IF rs>ab(lv) THEN ab(lv)=rs
745 IF rs<hs THEN NEXT cp:RETurn hs
747 hs=rs
748 IF bs>0 THEN 
749 IF hs<ab(lv+2) THEN RETurn hs:ELSE NEXT cp:RETurn hs
750 END IF 
770 IF bp>0 THEN AT bp DIV 10+1,bp MOD 10*2+18:PRINT ".";
780 BEEP 500,cp:bp=cp
810 STRIP 0
830 AT bp DIV 10+1,bp MOD 10*2+18:PRINT ".";
840 STRIP 2
860 END FOR cp:RETurn hs
870 END DEFine 
880 DEFine PROCedure place_piece(cp,sa,sd)
890 FOR i=-10,-9,1,11,10,9,-1,-11
900 p=cp
910 REPeat j:p=p+i:IF b(p)<>sd THEN EXIT j
920 IF cp=p-i OR b(p)<>sa THEN NEXT i:GO TO 940
930 FOR j=cp+i TO p-i STEP i:plot_piece j,sa:sc=sc+2*s(j)+mv
940 END FOR i
950 IF bs=st THEN RETurn 
960 plot_piece cp,sa:sc=sc+s(j)+mv
970 FOR i=cp-10,cp-9,cp+1,cp+11,cp+10,cp+9,cp-1,cp-11:bl(i)=bl(i)+1
980 AT 11,7:PRINT "Number of 'X' ="!nsa;" ","Number of 'O' ="!nsd;" ";
990 mv=mv+1
1000 IF nsa>0 AND nsd>0 AND nsa+nsd<64 THEN RETurn 
1010 PRINT:PRINT:PRINT:PRINT:PRINT:PRINT
1020 IF nsa>nsd THEN PRINT "You won"
1030 IF nsa<nsd THEN PRINT "I won"
1040 IF nsa=nsd THEN PRINT "We drew"
1050 STOP
1060 END DEFine 
1070 DEFine PROCedure plot_piece(cp,sa)
1080 IF b(cp)<0 THEN nsa=nsa-1
1090 IF b(cp)>0 THEN nsd=nsd-1
1100 st=st+1:b(cp)=sa
1110 AT cp DIV 10+1,cp MOD 10*2+18:PRINT "X.O"(sa+2)
1120 IF sa<0 THEN nsa=nsa+1
1130 IF sa>0 THEN nsd=nsd+1
1140 END DEFine 
1150 DATA 64,32,16, 8, 8,16,32,64
1160 DATA 32,16, 8, 4, 4, 8,16,32
1170 DATA 16, 8, 4, 2, 2, 4, 8,16
1180 DATA  8, 4, 2, 1, 1, 2, 4, 8
1190 DATA  8, 4, 2, 1, 1, 2, 4, 8
1200 DATA 16, 8, 4, 2, 2, 4, 8,16
1210 DATA 32,16, 8, 4, 4, 8,16,32
1220 DATA 64,32,16, 8, 8,16,32,64
1230 DATA 160,40,112,56,56,112,40,160
1240 DATA  40,10, 28,14,14, 28,10, 40
1250 DATA 112,28, 80,40,40, 80,28,112
1260 DATA  56,14, 40,20,20, 40,14, 56
1270 DATA  56,14, 40,20,20, 40,14, 56
1280 DATA 112,28, 80,40,40, 80,28,112
1290 DATA  40,10, 28,14,14, 28,10, 40
1300 DATA 160,40,112,56,56,112,40,160
