home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG021.ARK
/
CHESS.ASC
< prev
next >
Wrap
Text File
|
1985-02-10
|
12KB
|
495 lines
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 X2<X1 THEN 8445
8410 IF Y1<Y2 THEN 8430
8412 SP=9
8415 P=INT(ABS(A-B)/9)
8420 IF ABS(A-B)/9=P THEN 8455
8425 LG=0 :RETURN
8430 SP=11
8432 P=INT(ABS(A-B)/11)
8435 IF ABS(A-B)/11<>P THEN 8425
8440 GOTO 8455
8445 IF Y1<Y2 THEN 8415
8450 SP=-11:GOTO 8432
8455 GOSUB 8900
8460 RETURN
8500 REM -- RAW ROOK MOVES --
8505 IF Y2=Y1 THEN 8540
8510 IF X1=X2 THEN 8520
8515 LG=0:RETURN
8520 P=ABS(B-A)
8525 SP=SGN(B-A)
8530 GOSUB 8900
8535 RETURN
8540 P=ABS(INT((B-A)/10))
8545 SP=SGN(B-A)*10
8550 GOSUB 8900
8555 RETURN
8575 REM -- RAW QUEEN MOVE --
8580 GOSUB 8400
8581 IF LG=1 THEN RETURN
8585 GOSUB 8500
8590 RETURN
8600 REM -- KING MOVE --
8601 IF ABS(A-B)<>20 THE!ƒçüëëαßçüÅëƒ$1ƒ<Ç9ÇëŃ'0!ƒçüÅÇαßçüÅêƒ$1ƒ89âüîƒ<!3ƒ89âüêƒ'0!ƒçüëîαßçüÅâƒ0 ƒçüÅÇαßçüÅǃ$1ƒ89ÇŃ ƒ89Çîƒ'0!ƒçüëîαßçüÅǃÇ0!ç<Ç9äü1 ÇëçÇÇÅüççÇÇîäüÇîä <ÇîÅÇëÅüççÇÇîäÇîä0îÅüαßçüÅçƒ$1ƒ ç1!#çëäâ1! çëääâüŃ'0!ƒçüëîαßçüÅäƒ!0ƒëüîÇîüëÇîüêÇëüâÇëαßçüîŃ1 ƒëÇ<ƒ ƒîçÇÇÅççÇÇîäüÇîäƒ0ƒîÅüÇαßçüîîƒëÇ1!#çëäüëÇ1! çëäαßçüîëƒ1 ƒîÇîƒ ƒçαßçüîê 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