120 DIM PS(70,3),MV(35,2),V(32) 130 DEF FNL(X)=INT(X/10) 140 DEF FNM(X)=X-INT(X/10)*10 145 CB=3:CW=3 150 FOR X=1 TO 32 160 READ V(X) 170 NEXT 180 FOR Y=1 TO 8 190 FOR X=1 TO 8 200 READ B(X,Y) 210 NEXT X,Y 220 DATA -2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1 230 DATA 8,12,19,21,-8,-12,-19,-21 240 DATA 1,9,10,11,-1,-9,-10,-11 250 DATA 4,2,3,6,5,3,2,4,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 260 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1 270 DATA -1,-1,-1,-1,-4,-2,-3,-6,-5,-3,-2,-4 280 PRINT:PRINT:PRINT:PRINT TAB(10);"**** CHESS ****" 290 PRINT TAB(10);"BY RANDY MILLER":PRINT:PRINT 300 INPUT "DO YOU WANT TO BE WHITE OR BLACK";C$ 310 IF LEFT$(C$,1)="B" THEN 350 320 B(4,1)=5:B(4,8)=-5 330 B(5,1)=6:B(5,8)=-6 340 GOTO 360 350 PRINT "THANK YOU, THAT MEANS I GET TO GO FIRST":PRINT 360 FOR Y=1 TO 8 370 FOR X=1 TO 8 380 TM(X,Y)=B(X,Y) 390 NEXT X,Y 400 IF LEFT$(C$,1)<>"B" THEN 765 615 NB=1 616 REM -- COMPILE LIST OF POSSIBLE MOVES -- 620 FOR X=1 TO 8 625 FOR Y=1 TO 8 630 IF SGN(B(X,Y))<>1 THEN 670 635 GOSUB 6100 640 FOR D=1 TO N 645 IF MV(D,1)=0 THEN 665 650 PS(NB,1)=MV(D,1) 655 PS(NB,2)=MV(D,2) 660 NB=NB+1 665 NEXT D 670 NEXT Y 675 NEXT X 676 IF NB>1 THEN 680 677 PRINT "I DON'T BELIEVE IT! - YOU WON!!!" 678 STOP 679 REM -- EVALUATE EACH POSSIBLE MOVE -- 680 FOR D=1 TO NB-1 685 D1=FNL(PS(D,1)) 690 D2=FNM(PS(D,1)) 695 D3=FNL(PS(D,2)) 700 D4=FNM(PS(D,2)) 705 D5=B(D3,D4) 710 TM(D3,D4)=TM(D1,D2) 715 TM(D1,D2)=0 720 GOSUB 3000 721 PS(D,3)=EV 725 TM(D1,D2)=TM(D3,D4) 730 TM(D3,D4)=D5 734 NEXT D 735 REM 736 MZ=PS(1,3):MX=1 737 IF NB=2 THEN 760 740 FOR D=2 TO NB-1 745 IF PS(D,3)<=MZ THEN 755 750 MX=D:MZ=PS(D,3) 755 NEXT D 760 GOSUB 2000 765 GOSUB 1000 766 PRINT 770 GOTO 615 1000 REM -- INPUT ROUTINE -- 1001 INPUT "YOUR MOVE";M,N 1002 IF M<>0 THEN 1011 1003 FOR P=1TO8:FORP1=1TO8:PRINTB(P1,P);:NEXTP1:PRINT:NEXTP 1010 GOTO 1001 1011 X1=FNL(M):Y1=FNM(M):X2=FNL(N):Y2=FNM(N) 1012 IF X1>8 OR X1<1 OR Y1>8 OR Y1<1 THEN 1020 1013 IF X2>8 OR X2<1 OR Y2>8 OR Y2<1 THEN 1020 1015 IF SGN(B(X1,Y1))=-1 THEN 1030 1020 PRINT "YOU CAN'T DO THAT." 1025 GOTO 1001 1030 REM 1035 FOR P=1 TO 8 1040 FOR P1=1 TO 8 1045 TM(P,P1)=B(P,P1) 1050 NEXT P1 1055 NEXT P 1060 GOSUB 8100 1065 IF LG=0 THEN 1020 1070 TM(X2,Y2)=TM(X1,Y1) 1075 TM(X1,Y1)=0 1080 B(X2,Y2)=B(X1,Y1) 1085 B(X1,Y1)=0 1086 PRINT "ACCEPTED." 1090 IF Y2 <> 1 OR B(X2,Y2) <> -1 THEN 1140 1100 PRINT "TO PROMOTE YOUR PAWN TO A KNIGHT, TYPE 2; FOR A BISHOP," 1105 PRINT "TYPE 3; FOR A ROOK, TYPE 4; FOR A QUEEN, TYPE 5"; 1110 INPUT P 1120 IF P>5 OR P<2 THEN 1100 1130 B(X2,Y2)=-P:TM(X2,Y2)=-P 1140 IF B(X2,Y2) <> -6 OR ABS(X1-X2) <> 2 THEN 1147 1142 IF X1-X2=2 THEN 1148 1143 B(8,8)=0:TM(8,8)=0 1144 B(X2-1,8)=-4:TM(X2-1,8)=-4 1145 CB=(CB AND -2) 1146 PRINT "IT'S ABOUT TIME YOU CASTLED!":PRINT 1147 RETURN 1148 B(1,8)=0:TM(1,8)=0 1149 B(X2+1,8)=-4:TM(X2+1,8)=-4 1150 CB=(CB AND -3) 1151 GOTO 1146 2000 REM -- OUTPUT ROUTINE -- 2001 IF PS(MX,3)<200 THEN 2010 2002 PRINT "HA - LET'S SEE YOU GET OUT OF THIS -" 2003 PRINT "I MOVE";PS(MX,1);"TO";PS(MX,2) 2004 PRINT "THANKS FOR THE GOOD GAME..." 2005 STOP 2010 ON INT(RND(1)*4)+1 GOTO 2011,2012,2013,2014 2011 PRINT "I RECKON I'LL MOVE";:GOTO 2015 2012 PRINT "I GUESS I'LL TAKE";:GOTO 2015 2013 PRINT "MY MOVE IS";:GOTO 2015 2014 PRINT "I LIKE"; 2015 PRINT PS(MX,1);"TO";PS(MX,2):PRINT 2020 D1=FNL(PS(MX,1)) 2030 D2=FNM(PS(MX,1)) 2040 D3=FNL(PS(MX,2)) 2050 D4=FNM(PS(MX,2)) 2060 B(D3,D4)=B(D1,D2) 2070 B(D1,D2)=0 2071 IF D4 <> 8 OR B(D3,D4) <> 1 THEN 2080 2072 PRINT "I PROMOTE MY PAWN TO A QUEEN!" 2073 B(D3,D4)=5 2080 RETURN 3000 REM 3001 EV=RND(1):RETURN 3005 EV=RND(1)/2:US=0 3006 EV=EV+D4/7 3007 FOR PJ=1 TO 8 3008 IF TM(PJ,8)<>1 THEN 3011 3009 TM(PJ,8)=5 3010 GOTO 3012 3011 NEXT PJ 3012 FOR X=1 TO 8 3020 FOR Y=1 TO 8 3030 CX=TM(X,Y):CS=SGN(CX) 3031 IF CS<>-1 THEN 3700 3035 EV=EV+CX 3040 GOSUB 6000 3042 IF N=0 THEN 3700 3045 US=US+N:EV=EV+N*CS/6 3050 IF N=0 THEN 3700 3060 FOR UX=1 TO N 3100 U1=MV(UX,1):U2=MV(UX,2) 3105 IF SGN(TM(FNL(U2),FNM(U2)))<>1 THEN 3500 3106 IF SGN(TM(FNL(U1),FNM(U1)))<>-1 THEN 3500 3120 EV=EV-TM(FNL(U2),FNM(U2)) 3500 NEXT UX 3700 NEXT Y 3710 NEXT X 3711 IF US>0 THEN 3720 3712 EV=EV+1000 3713 GOTO 3725 3720 FOR X=3 TO 6:FOR Y=3 TO 6:EV=EV+TM(X,Y)/3:NEXT Y:NEXT X 3725 IF PJ>8 THEN 3740 3735 TM(PJ,8)=1 3740 RETURN 6000 REM 6010 R=0 6020 GOTO 6110 6100 R=1 6110 MV(1,1)=0 6112 S1=SGN(TM(X,Y)) 6113 AA=X*10+Y 6114 N=1 6118 PRINT 6118,X,Y,TM(X,Y) 6120 ON ABS(TM(X,Y)) GOSUB 6300,6525,6600,6725,6850,6875 6121 PRINT 6121 6122 IF N=1 THEN 6130 6125 IF R=1 THEN 6140 6130 N=N-1 6135 RETURN 6140 REM -- IF RESTRICTED -- 6141 N1=N-1 6142 N=N1 6143 FOR K=1 TO N1 6144 PRINT 6144,"K= ";K 6145 C1=FNL(MV(K,1)) 6150 C2=FNM(MV(K,1)) 6155 C3=FNL(MV(K,2)) 6160 C4=FNM(MV(K,2)) 6162 IF ABS(TM(C3,C4))=6 THEN 6164 6163 IF SGN(TM(C3,C4))<>S1 THEN 6165 6164 MV(K,1)=0:MV(K,2)=0:GOTO 6250 6165 C5=TM(C3,C4) 6170 TM(C3,C4)=TM(C1,C2) 6175 TM(C1,C2)=0 6180 REM -- FIND KING -- 6182 FOR Y2=1 TO 8 6185 FOR X2=1 TO 8 6190 IF TM(X2,Y2)=6*S1 THEN 6202 6195 NEXT X2 6200 NEXT Y2 6202 REM 6205 FOR Y1=1 TO 8 6210 FOR X1=1 TO 8 6215 IF SGN(TM(X1,Y1))<>-S1 THEN 6230 6216 IF TM(X1,Y1)<>-S1 THEN 6220 6217 IF X1=X2 AND ABS(Y2-Y1)>2 THEN 6230 6220 GOSUB 8000 6225 IF LG=1 THEN 6260 6230 NEXT X1 6231 PRINT 6231,"Y1= ";Y1 6235 NEXT Y1 6240 TM(C1,C2)=TM(C3,C4) 6245 TM(C3,C4)=C5 6247 PRINT 6247,"K= ";K 6250 NEXT K 6255 RETURN 6260 MV(K,1)=0:MV(K,2)=0 6265 GOTO 6230 6300 REM -- RAW PAWN MOVE -- 6305 IF S1=-1 THEN 6400 6310 IF Y+1>8 THEN 6390 6315 IF TM(X,Y+1)<>0 THEN 6340 6320 MV(N,1)=AA 6325 MV(N,2)=X*10+Y+1 6327 N=N+1 6330 IF Y>2 THEN 6340 6335 IF TM(X,Y+2)<>0 THEN 6340 6336 MV(N,1)=AA 6337 MV(N,2)=X*10+Y+2 6338 N=N+1 6340 IF X=1 THEN 6365 6345 IF SGN(TM(X-1,Y+1))<>-S1 THEN 6365 6350 MV(N,1)=AA 6355 MV(N,2)=(X-1)*10+Y+1 6360 N=N+1 6365 IF X=8 THEN 6390 6370 IF SGN(TM(X+1,Y+1))<>-S1 THEN 6390 6375 MV(N,1)=AA 6380 MV(N,2)=(X+1)*10+Y+1 6385 N=N+1 6390 RETURN 6400 IF Y-1<1 THEN 6500 6405 IF TM(X,Y-1)<>0 THEN 6450 6410 MV(N,1)=AA 6415 MV(N,2)=X*10+Y-1 6420 N=N+1 6425 IF Y<7 THEN 6450 6430 IF TM(X,Y-2)<>0 THEN 6450 6435 MV(N,1)=AA 6440 MV(N,2)=X*10+Y-2 6445 N=N+1 6450 IF X=1 THEN 6475 6455 IF SGN(TM(X-1,Y-1))<>-S1 THEN 6475 6460 MV(N,1)=AA 6465 MV(N,2)=(X-1)*10+Y-1 6470 N=N+1 6475 IF X=8 THEN 6500 6480 IF SGN(TM(X+1,Y-1))<>-S1 THEN 6500 6485 MV(N,1)=AA 6490 MV(N,2)=(X+1)*10+Y-1 6495 N=N+1 6500 RETURN 6525 REM -- RAW KNIGHT MOVE -- 6535 FOR C6=1 TO 15 STEP 2 6540 KL=V(C6):KM=V(C6+1) 6545 XT=X+KL 6550 YT=Y+KM 6555 IF XT>8 OR XT<1 OR YT>8 OR YT<1 THEN 6570 6560 MV(N,1)=AA 6565 MV(N,2)=XT*10+YT 6567 N=N+1 6570 NEXT C6 6575 RETURN 6600 REM -- RAW BISHOP MOVE -- 6605 EL=(8-Y)*-(8-Y <= 8-X)+(8-X)*-(8-X < 8-Y) 6610 IF EL=0 THEN 6630 6620 C6=11 6625 GOSUB 6695 6630 EL=(8-Y)*-(8-Y <= X-1)+(X-1)*-(X-1 < 8-Y) 6635 IF EL=0 THEN 6650 6640 C6=-9 6645 GOSUB 6695 6650 EL=(8-X)*-(8-X <= Y-1)+(Y-1)*-(Y-1 < 8-X) 6655 IF EL=0 THEN 6670 6660 C6=9 6665 GOSUB 6695 6670 EL=(Y-1)*-(Y-1 <= X-1)+(X-1)*-(X-1 < Y-1) 6675 IF EL=0 THEN 6690 6680 C6=-11 6685 GOSUB 6695 6690 RETURN 6695 FOR E=1 TO EL 6698 F=C6*E 6700 MV(N,1)=AA 6702 MV(N,2)=AA+F 6704 N=N+1 6706 IF TM(FNL(AA+F),FNM(AA+F)) <> 0 THEN 6715 6710 NEXT E 6715 RETURN 6725 REM -- RAW ROOK MOVE -- 6730 EL=8-Y 6735 IF EL=0 THEN 6750 6740 C6=1 6745 GOSUB 6820 6750 EL=Y-1 6755 IF EL=0 THEN 6770 6760 C6=-1 6765 GOSUB 6820 6770 EL=8-X 6775 IF EL=0 THEN 6790 6780 C6=10 6785 GOSUB 6820 6790 EL=X-1 6795 IF EL=0 THEN 6815 6800 C6=-10 6810 GOSUB 6820 6815 RETURN 6820 FOR E=1 TO EL 6822 F=C6*E 6824 MV(N,1)=AA 6826 MV(N,2)=AA+F 6828 N=N+1 6830 IF TM(FNL(AA+F),FNM(AA+F)) <>0 THEN 6845 6840 NEXT E 6845 RETURN 6850 REM -- RAW QUEEN MOVE -- 6855 GOSUB 6600 6860 GOSUB 6725 6865 RETURN 6875 REM -- RAW KING MOVE -- 6880 IF X=8 THEN 6910 6885 C6=10:GOSUB 6965 6890 IF Y=1 THEN 6905 6895 C6=9:GOSUB 6965 6900 IF Y=8 THEN 6915 6905 C6=11:GOSUB 6965 6910 IF X=1 THEN 6940 6915 C6=-10:GOSUB 6965 6920 IF Y=8 THEN 6940 6925 C6=-9:GOSUB 6965 6930 IF Y=1 THEN 6940 6935 C6=-11:GOSUB 6965 6940 IF Y=1 THEN 6950 6945 C6=-1:GOSUB 6965 6950 IF Y=8 THEN 6960 6955 C6=1:GOSUB 6965 6960 RETURN 6965 MV(N,1)=AA 6970 MV(N,2)=AA+C6 6975 N=N+1 6980 RETURN 8000 REM 8010 RR=0 8020 GOTO 8110 8100 RR=1 8110 IF TM(X1,Y1)<>0 THEN 8120 8115 LG=0:RETURN 8120 S=SGN(TM(X1,Y1)) 8126 A=X1*10+Y1 8127 B=X2*10+Y2 8129 PRINT 8129,X1,XY,TM(X1,Y1) 8130 ON ABS(TM(X1,Y1)) GOSUB 8250,8350,8400,8500,8575,8600 8131 PRINT 8131,LG,RR 8140 IF LG=0 THEN RETURN 8145 IF RR=1 THEN 8155 8150 LG=1:RETURN 8155 REM -- IF RESTRICTED -- 8156 IF S=SGN(TM(X2,Y2)) THEN 8115 8157 T1=X1:T2=Y1:T3=X2:T4=Y2:T=TM(X2,Y2) 8158 TM(X2,Y2)=TM(X1,Y1):TM(X1,Y1)=0 8159 PRINT8159 ,"T2= ";T2 : SV=S 8160 REM -- FIND KING -- 8161 FOR Y2=1 TO 8 8165 FOR X2=1 TO 8 8170 IF TM(X2,Y2)=6*S THEN 8185 8175 NEXT X2 8180 NEXT Y2 8181 STOP 8185 REM 8186 FOR Y1=1 TO 8 8190 FOR X1=1 TO 8 8195 P=TM(X1,Y1):IF SGN(P)=S OR P=0 OR ABS(P)=6 THEN 8210 8200 GOSUB 8000 8201 S=SV 8205 IF LG=1 THEN 8235 8210 NEXT X1 8215 NEXT Y1 8216 LG=1 8220 TM(T1,T2)=TM(T3,T4) 8225 TM(T3,T4)=T 8226 X1=T1:Y1=T2:X2=T3:Y2=T4 8227 PRINT8227 ,"Y1= ";Y1 8230 RETURN 8235 LG=0 8240 GOTO 8220 8250 REM ---- RAW PAWN MOVE -- 8255 IF SGN(Y2-Y1)=S THEN 8270 8260 LG=0 : RETURN 8265 LG=1 : RETURN 8270 IF S=-1 THEN 8315 8275 IF B-A=1 OR B-A=2 THEN 8295 8280 IF TM(X2,Y2)=0 THEN 8260 8285 IF B-A=-9 OR B-A=11 THEN 8265 8290 GOTO 8260 8295 IF Y2=2 THEN 8265 8300 IF B-A=1 THEN 8265 8310 GOTO 8260 8315 IF A-B=1 OR A-B=2 THEN 8335 8320 IF TM(X2,Y2)=0 THEN 8260 8325 IF A-B=-9 OR A-B=11 THEN 8265 8330 GOTO 8260 8335 IF Y2=7 THEN 8265 8340 IF A-B=1 THEN 8265 8341 IF Y1=7 AND A-B=2 THEN 8265 8345 GOTO 8260 8350 REM -- RAW KNIGHT MOVE -- 8355 FOR P=17 TO 24 8360 P1=V(P) 8365 IF A+P1<>B THEN 8375 8370 LG=1 : RETURN 8375 NEXT P 8380 LG=0:RETURN 8400 REM -- RAW BISHOP MOVE -- 8401 IF Y2=Y1 OR X2=X1 THEN 8425 8402 SP=-9 8405 IF X2P THEN 8425 8440 GOTO 8455 8445 IF Y120 THEN 8622 8602 IF A-B=20 THEN 8605 8603 IF CB<>1 AND CB<>3 THEN 8621 8604 GOTO 8607 8605 IF CB=0 OR CB=1 THEN 8621 8607 PS=SGN(A-B):FORPS=28+50*((PS=-1)*-1)TOA+10-20*((PS=-1)+1)STEP10*PS 8608 IF TM(FNL(P2),FNM(P2))<>0 THEN 8621 8609 NEXT P2:T1=X1:T2=Y1:T3=X2:T4=Y2 8610 FOR P2=A TO 18+70((PS=-1)*-1) STEP 10*-PS 8611 X2=FNL(P2):Y2=FNM(P2) 8612 FOR X1=1 TO 8 8613 FOR Y1=1 TO 8 8614 IF SGN(TM(X1,Y1))<>1 THEN 8617 8615 GOSUB 8100 8616 PRINT8616,"T2= ";T2 : IF LG=1 THEN 8621 8617 NEXT Y1,X1,P2 8618 PRINT 8618,"Y1= ";Y1 : LG=1 8619 PRINT 8619,"Y1= ";Y1:X1=T1:Y1=T2:X2=T3:Y2=T4 8620 PRINT 8620,"Y1= ";Y1 : RETURN 8621 PRINT8621,"Y1= ";Y1 : LG=0 : GOTO 8619 8622 FOR P=25 TO 32 8623 LG=0 :GOTO 8619 8625 P1=V(P) 8630 IF B=A+P1 THEN 8645 8635 NEXT P 8640 LG=0 :RETURN 8645 LG=1 :RETURN 8900 REM 8905 LG=0 8910 IF P=0 THEN STOP 8915 IF P>1 THEN 8925 8920 LG=1:RETURN 8925 FOR P1=1 TO P-1 8930 P2=A+SP*P1 8935 IF TM(FNL(P2),FNM(P2))<>0 THEN RETURN 8940 NEXT P1 8945 LG=1 :RETURN 9999 END  8925 FOR P1=1 TO P-1 8930 P2=A+SP*P1 8935 IF TM(FNL(P2),FNM(P2))<>0 THEN RETURN 8940 NEXT P1 8945 LG=1 :RETURN 999