Listing of file='CHESS' on disk='vmedia/games-droz01.wvd.zip'
# Sector 225, program filename = 'CHESS' 0010 REM % CHESS : REM CHESS GAME : REM 07/10/80 CDH : REM 12/11/80 RLD : REM 0100 DIM A$64,B$5 0105 PRINT HEX(020400020F);HEX(0202020F) : PRINT HEX(030A0A);TAB(32);"***************" : PRINT TAB(32);"* C H E S S *" : PRINT TAB(32);"***************" : PRINT HEX(0A0A0A0A);"WHAT KIND OF TERMINAL DO YOU HAVE?"; : A$="2236D" : LINPUT HEX(0208090F) A$ : IF STR(A$,2,6)="2236DE" OR STR(A$,2,6)="2236DW" THEN B$=ALL(HEX(C0)) : ELSE B$=HEX(098B8B8B09) 0110 PRINT AT(9,0,160);TAB(23); : INPUT "DO YOU WANT INSTRUCTIONS (Y OR N)",Q$ : IF Q$="Y" THEN GOSUB 6070 : H5=8 : I5=4 0180 DATA -5,-3,-4,-9,-7,-4,-3,-5,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0, 0,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,1,1,1,1,5,3,4,9,7,4,3 ,5 0200 DIM B(8,8),M(8) : F1,F2,F4,F9,R,S1,S6,S8,V6=0 : MAT READ B : PRINT TAB(31); : INPUT "WHAT IS YOUR NAME",Z$ : PRINT 0210 PRINT HEX(03);"THE COMPUTER IS PLAYING WHITE AND IS NOW MAKING THE FIRST MOVE..." 0470 GOSUB 2770 : GOSUB 750 : GOTO 470 0520 ON ABS(B(C,D))+1 GOTO 540,570,540,600,630,660,540,690,540,720 : GOTO 540 0530 ON ABS(B(X,Y))+1 GOTO 540,570,540,600,630,660,540,690,540,720 0540 C$=" " : D$="CHARACTER ERROR" : RETURN 0570 C$="P" : D$="PAWN" : RETURN 0600 C$="N" : D$="KNIGHT" : RETURN 0630 C$="B" : D$="BISHOP" : RETURN 0660 C$="R" : D$="ROOK" : RETURN 0690 C$="Q" : D$="QUEEN" : RETURN 0720 C$="K" : D$="KING" : RETURN 0750 GOSUB 5700 : IF R<1 THEN 1080 : IF V6>-10 THEN 900 : C=H2 : D=I2 : FOR X=1 TO 8 : FOR Y=1 TO 8 : IF B(X,Y)<=0 THEN 850 : GOSUB 1720 : IF Q=1 THEN 1660 0850 NEXT Y,X 0870 PRINT AT(0,0,320);"AFTER";R;"MOVES, ITS A STALEMATE." : PRINT "GOOD PLAY ";Z$ : GOTO 6270 0900 FOR X=X8 TO X9 : FOR Y=Y8 TO Y9 : IF B(X,Y)<=0 THEN 1020 : FOR C=1 TO 8 : FOR D=1 TO 8 : IF B(C,D)>0 THEN 1000 : GOSUB 1720 : IF Q=0 THEN 1000 : GOSUB 4260 : IF Q=1 THEN 1080 1000 NEXT D,C 1020 NEXT Y,X : IF C5=0 THEN 870 : PRINT AT(0,0,320);"THE COMPUTER HAS DEFEATED YOU" : PRINT "IN";R;"MOVES ";Z$ : GOTO 6270 1080 PRINT AT(22,0,70); "WHERE IS THE PIECE YOU WANT TO MOVE, ";Z$;","; : INPUT " (R,C) ", X,Y : IF X<>10 THEN 1220 : GOSUB 4760 : IF F9=0 THEN 1080 : R=R+1 : GOTO 1690 1210 PRINT AT(21,0,70);"WHAT?....THERES NO SUCH PIECE, ";Z$ : GOTO 1080 1220 IF X>8OR Y>8OR X<1OR Y<1 OR B(X,Y)<=0 THEN 1210 : GOSUB 530 : PRINT AT(21,0,70);AT(22,0,70);"PLAYER MOVES, ";D$;" TO WHERE "; : INPUT "(R,C)", C,D : IF C=0 THEN 1080 : IF C>8OR D>8OR C<1OR D<1 THEN 1210 : IF B(C,D)<=0 THEN 1340 : PRINT AT(21,0,70);"YOU CANT TAKE YOUR OWN PIECE, ";Z$;"!";HEX(07) : GOTO 1080 1340 PRINT AT(0,0,320); : IF X<>4OR C<>3OR ABS(Y-D)<>1OR B(X,Y)<>1OR M(D)<>1 THEN 1440 : GOSUB 4260 : IF Q=0 THEN 1480 : B(X,D)=0 : PRINT "AND THE PLAYER TAKES MY PAWN, EN PASSENT" : GOTO 1540 1440 GOSUB 1720 : IF Q=0 THEN 1490 : GOSUB 4260 : IF Q=1 THEN 1510 1480 PRINT "YOU CAN NOT MOVE INTO CHECK ";Z$;"." 1490 PRINT "ILLEGAL MOVE." : GOTO 1080 1510 IF B(C,D)=0 THEN 1540 : GOSUB 520 : PRINT "AND THE PLAYER TAKES MY ";D$ 1540 B(C,D)=B(X,Y) : R=R+1 : IF B(C,D)=9THEN F2=1 : IF B(C,D)<>5 THEN 1600 : IF Y=8 THEN F1=1 : IF Y=1 THEN F4=1 1600 B(X,Y)=0 : IF B(C,D)<>1OR C<>1 THEN 1690 : B(C,D)=7 : PRINT "(PLAYER PROMOTES TO QUEEN)" : GOTO 1690 1660 PRINT AT(0,0,320); "CONGRATULATIONS ";Z$;" YOU HAVE" : PRINT "CHECKMATED THE COMPUTER IN";R;"MOVES." : GOTO 6270 1690 PRINT "ACCEPTED" : GOSUB 5700 : RETURN 1720 ON ABS(B(X,Y)) GOTO 1730,1950,1950,2230,2010,1950,2570,1950,2600 1730 IF ABS(Y-D)>1 OR ABS(X-C)>2 THEN 2750 : IF B(X,Y)>0 THEN 1850 : IF B(C,D)=0 THEN 1790 : IF C<>X+1 THEN 2750 : GOTO 1870 1790 IF C=X+1 THEN 1830 : IF C<>4OR X<>2OR B(3,D)<>0 THEN 2750 1830 IF D<>Y THEN 2750 : GOTO 2730 1850 IF B(C,D)=0 THEN 1890 : IF C<>X-1 THEN 2750 1870 IF ABS(D-Y)<>1 THEN 2750 : GOTO 2730 1890 IF C=X-1 THEN 1830 : IF C<>5OR X<>7OR B(6,D)<>0 THEN 2750 : GOTO 1830 1950 IF ABS(C-X)>2 OR ABS(D-Y)>2OR X=COR Y=DOR ABS(C-X)=ABS(D-Y) THEN 2750 : GOTO 2730 2010 IF X=C THEN 2130 : IF Y<>D THEN 2750 : IF ABS(C-X)=1 THEN 2730 : IF X>C THEN 2090 : FOR K=X+1 TO C-1 : IF B(K,D)<>0 THEN 2750 : NEXT K : GOTO 2730 2090 FOR K=C+1 TO X-1 : IF B(K,D)<>0 THEN 2750 : NEXT K : GOTO 2730 2130 IF ABS(D-Y)=1 THEN 2730 : IF Y>D THEN 2190 : FOR K=Y+1 TO D-1 : IF B(X,K)<>0 THEN 2750 : NEXT K : GOTO 2730 2190 FOR K=D+1 TO Y-1 : IF B(X,K)<>0 THEN 2750 : NEXT K : GOTO 2730 2230 IF ABS(C-X)<>ABS(D-Y) THEN 2750 : D4=D : C4=C : IF ABS(C-X)<>1 THEN 2280 : IF ABS(D-Y)=1 THEN 2730 2280 IF C<X OR D<Y THEN 2360 : FOR L=1 TO C-X-1 : D4=D4-1 : C4=C4-1 : IF B(C4,D4)<>0 THEN 2750 : NEXT L : GOTO 2730 2360 IF C>XOR D>Y THEN 2440 : FOR L=1 TO X-C-1 : C4=C4+1 : D4=D4+1 : IF B(C4,D4)<>0 THEN 2750 : NEXT L : GOTO 2730 2440 IF X<C THEN 2510 : FOR L=1 TO X-C-1 : C4=C4+1 : D4=D4-1 : IF B(C4,D4)<>0 THEN 2750 : NEXT L : GOTO 2730 2510 FOR L=1 TO C-X-1 : C4=C4-1 : D4=D4+1 : IF B(C4,D4)<>0 THEN 2750 : NEXT L : GOTO 2730 2570 IF X=COR Y=D THEN 2010 : GOTO 2230 2600 IF ABS(C-X)>1OR ABS(Y-D)>1 THEN 2750 : IF X<>Y THEN 2640 : IF C=D THEN 2750 2640 FOR X3=C-1 TO C+1 : FOR Y3=D-1 TO D+1 : IF X3>8OR Y3>8OR X3<1OR Y3<1 THEN 2710 : IF B(X3,Y3)+B(X,Y)=0 THEN 2750 2710 NEXT Y3,X3 2730 Q=1 : RETURN 2750 Q=0 : RETURN 2770 X8,Y8=8 : X9,Y9,C9,D9=1 : FOR H=1 TO 8 : M(H)=0 : FOR I=1 TO 8 : IF B(H,I)<=0 THEN 2900 : IF H<X8 THEN X8=H : IF I<Y8 THEN Y8=I : IF H>X9 THEN X9=H : IF I>Y9 THEN Y9=I : IF B(H,I)<>9 THEN 2960 : H5=H : I5=I 2900 IF B(H,I)=0 THEN 2960 : IF H>C9 THEN C9=H : IF I>D9 THEN D9=I : IF B(H,I)<>-9 THEN 2960 : H2=H : I2=I 2960 NEXT I,H : V6=-10 : P1,C8=0 : FOR X=1 TO C9 : FOR Y=1 TO D9 : IF B(X,Y)>=0 THEN 3400 : FOR C=1 TO 8 : FOR D=1 TO 8 : IF B(C,D)<0 THEN 3380 : GOSUB 1720 : IF Q=0 THEN 3380 : GOSUB 3820 : IF M8=10 THEN 3380 : IF C8=1 THEN GOSUB 4470 3110 V4=V4+2.5*RND(1)/(ABS(C-H5)+ABS(D-I5)) : IF S6=1 THEN 3260 : IF X<>1 THEN 3230 : IF Y=4 THEN V4=V4+1 3150 IF S1=1 THEN 3190 : IF Y>3 THEN 3190 : IF Y=1 THEN V4=V4-1 3180 IF Y>1 THEN V4=V4+1.2 3190 IF S8=1 THEN 3260 : IF Y<5 THEN 3230 : IF Y<8 THEN V4=V4+1.2 : IF Y=8 THEN V4=V4-1 3230 IF X<>2 THEN 3260 : IF Y=2OR Y=5 THEN V4=V4+1 3260 V5=B(C,D)+V4 : IF C<>8 THEN 3270 : IF B(X,Y)=-1 THEN V5=V5+3 3270 IF V5<V6 THEN 3380 : V6=V5 : X6=X : Y6=Y : C5=C8 : C6=C : D6=D : Y6=Y 3380 NEXT D,C 3400 NEXT Y,X : IF V6=-10 THEN 3740 : IF S6=1 THEN 3510 : IF V6>2 THEN 3510 : IF S1=1 THEN 3480 : GOSUB 5420 : IF S6=1 THEN 3790 3480 IF S8=1 THEN 4830 : GOSUB 5270 : IF S6=1 THEN 3790 3510 X=X6 : Y=Y6 : C=C6 : D=D6 : GOSUB 530 : IF B(X,Y)=-1 AND C=X+2 THEN M(D)=1 : PRINT AT(0,0,320);"THE COMPUTER MOVES ";D$;" TO ";C;",";D : IF B(C,D)=0 THEN 3630 : GOSUB 520 : PRINT "AND TAKES YOUR ";D$ 3630 B(C,D)=B(X,Y) : IF C5=1 THEN PRINT "...AND YOURE IN CHECK!" : B(X,Y)=0 : IF C<>8 THEN 3690 : IF B(C,D)<>-1 THEN 3690 : PRINT "COMPUTER PROMOTES TO QUEEN" : B(C,D)=-7 3690 PRINT : IF X<>H2 THEN 3740 : IF Y<>I2 THEN 3740 : H2=C : I2=D 3740 IF B(C,D)=-9 THEN S6=1 : IF B(C,D)<>-5 THEN RETURN : IF Y=1 THEN S1=1 : IF Y=8 THEN S8=8 : RETURN 3790 PRINT AT(0,0,320);"AND THE COMPUTER CASTLES." : RETURN 3820 X2=X 3830 C2=C 3840 D2=D 3850 Y2=Y 3860 P4=B(C,D) 3870 Z7=C9 3880 Z4=D9 3890 B(C,D)=B(X,Y) 3900 C8,M8,V4,B(X,Y)=0 3910 IF C>C9 THEN 3912 : GOTO 3920 3912 C9=C 3920 IF D>D9 THEN 3922 : GOTO 3930 3922 D9=D 3930 FOR C=1 TO C9 3940 FOR D=1 TO D9 3950 IF B(C,D)>=-1 THEN 4070 3960 FOR X=X8 TO X9 3970 FOR Y=Y8 TO Y9 3980 IF B(X,Y)<=0 THEN 4050 3990 GOSUB 1720 4000 IF Q=0 THEN 4050 4010 N4=B(C,D) 4020 IF N4=-9 THEN 4022 : GOTO 4030 4022 M8=10 4030 IF ABS(N4)<B(X,Y) THEN 4032 : GOTO 4040 4032 GOSUB 5830 4040 IF N4<V4 THEN 4042 : GOTO 4050 4042 V4=N4 4050 NEXT Y,X 4070 NEXT D,C 4090 X=C2 4100 Y=D2 4110 C=H5 4120 D=I5 4130 IF C>Z7 THEN 4132 : GOTO 4140 4132 C9=Z7 4140 IF D>Z4 THEN 4142 : GOTO 4150 4142 D9=Z4 4150 GOSUB 1720 4160 IF Q=0 THEN 4190 4170 C8=1 4180 V4=V4+1 4190 C=C2 4200 D=D2 4210 X=X2 4220 Y=Y2 4230 B(X,Y)=B(C,D) 4240 B(C,D)=P4 4250 RETURN 4260 X2=X 4270 Y2=Y 4280 C2=C 4290 D2=D 4300 P4=B(C,D) 4310 B(C,D)=B(X,Y) 4320 B(X,Y)=0 4330 IF B(C,D)=9 THEN 4360 4340 C=H5 4350 D=I5 4360 FOR X=1 TO 8 4370 FOR Y=1 TO 8 4380 IF B(X,Y)>=0 THEN 4410 4390 GOSUB 1720 4400 IF Q=1 THEN 4450 4410 NEXT Y,X 4430 Q=1 4440 GOTO 4190 4450 Q=0 4460 GOTO 4190 4470 E5=B(C,D) 4480 E1=X 4490 E2=Y 4500 E3=C 4510 E4=D 4520 B(C,D)=B(X,Y) 4530 B(X,Y)=0 4540 FOR X=X8 TO X9 4550 FOR Y=Y8 TO Y9 4560 IF B(X,Y)<=0 THEN 4660 4570 FOR C=1 TO 8 4580 FOR D=1 TO 8 4590 IF B(C,D)>0 THEN 4640 4600 GOSUB 1720 4610 IF Q=0 THEN 4640 4620 GOSUB 4260 4630 IF Q=1 THEN 4690 4640 NEXT D,C 4660 NEXT Y,X 4680 V4=100 4690 X=E1 4700 Y=E2 4710 C=E3 4720 D=E4 4730 B(X,Y)=B(C,D) 4740 B(C,D)=E5 4750 RETURN 4760 PRINT AT(21,0,70);AT(22,0,70);"CASTLING: "; 4770 A$=" " 4780 IF F9=1 THEN 4782 : GOTO 4790 4782 A$="CASTLED PREVIOUSLY" 4790 IF F2=1 THEN 4792 : GOTO 4800 4792 A$="PREVIOUSLY MOVED YOUR KING" 4800 IF C5=1 THEN 4802 : GOTO 4810 4802 A$="MAY NOT CASTLE OUT OF CHECK" 4810 IF A$<>" " THEN 4940 : PRINT "KINGS SIDE OR QUEENS (K OR Q)"; 4830 INPUT V$ : PRINT AT(0,0,320) 4840 IF V$="K" THEN 4900 4850 IF F1=1 THEN 4852 : GOTO 4860 4852 GOSUB 5250 4860 FOR G1=5 TO 6 4870 GOSUB 5100 4880 NEXT G1 4890 GOTO 4940 4900 FOR G1=2 TO 3 4910 IF F4=1 THEN 4912 : GOTO 4920 4912 GOSUB 5250 4920 GOSUB 5100 4930 NEXT G1 4940 IF A$=" " THEN 4990 4950 F9=0 4960 PRINT AT(0,0,320);HEX(07); "YOU CAN NOT CASTLE, ";Z$;", BECAUSE:" 4970 PRINT "YOU ";A$ 4980 RETURN 4990 F9=1 5000 B(8,4)=0 5010 IF V$="K" THEN 5060 5020 B(8,6)=9 5030 B(8,8)=0 5040 B(8,5)=5 5050 RETURN 5060 B(8,2)=9 : B(8,1)=0 : B(8,3)=5 : RETURN 5100 IF B(8,G1)<>0 THEN 5230 : D=G1 : C=8 : FOR X=1 TO 8 : FOR Y=1 TO 8 : IF B(X,Y)>=0 THEN 5180 : GOSUB 1720 : IF Q=1 THEN 5210 5180 NEXT Y,X : RETURN 5210 A$="HAVE CONTROLLED SQUARES BETWEEN ROOK AND KING" : RETURN 5230 A$="HAVE A PIECE BETWEEN ROOK AND KING" : RETURN 5250 A$="PREVIOUSLY MOVED YOUR ROOK" : RETURN 5270 C=1 5280 FOR D=2 TO 4 5290 GOSUB 5570 5300 IF Q=1 THEN RETURN 5310 NEXT D 5320 X,Y=1 5330 D=3 5340 GOSUB 3820 5350 IF V4<-2 THEN RETURN 5360 B(1,4),B(1,1)=0 5370 B(1,2)=-9 5380 I2=2 5390 B(1,3)=-5 5400 S6=1 : RETURN 5420 C=1 5430 FOR D=4 TO 7 5440 GOSUB 5570 5450 IF Q=1 THEN RETURN 5460 NEXT D 5470 X,C=1 5480 Y=8 5490 D=5 5500 GOSUB 3820 5510 IF V4<-2 THEN RETURN 5520 B(1,4),B(1,8)=0 5530 B(1,6)=-9 5540 I2=6 5550 B(1,5)=-5 5560 GOTO 5400 5570 Q=0 5580 IF B(C,D)=-9 THEN 5600 5590 IF B(C,D)<>0 THEN 5680 5600 FOR X=X8 TO X9 5610 FOR Y=Y8 TO Y9 5620 IF B(X,Y)<=0 THEN 5650 5630 GOSUB 1720 5640 IF Q=1 THEN RETURN 5650 NEXT Y,X : RETURN 5680 Q=1 : RETURN 5700 GOTO 5705 : PRINT AT(4,14);BOX(16,40) 5701 GOTO 5705 5702 FOR D=1 TO 8 : PRINT AT(4,9+5*D);BOX(16,5) : NEXT D 5705 PRINT AT(4,0); : FOR C=1 TO 8 : PRINT TAB(14); : FOR D=1 TO 8 : GOSUB 520 5706 IF B(C,D)<>0 THEN 5707 : IF MOD(MOD(C,2)+MOD(D,2),2)=C0 THEN PRINT HEX(0E);B$;HEX(0F); : ELSE PRINT " "; : GOTO 5708 5707 IF MOD(MOD(C,2)+MOD(D,2),2)=C0 THEN PRINT HEX(0E); : IF B(C,D)>0 THEN PRINT " ";C$;" ";HEX(0F); : ELSE PRINT " <";C$;"> ";HEX(0F); 5708 IF D=8 THEN PRINT HEX(0F);" R-";C : NEXT D 5709 PRINT TAB(14); : FOR D=1 TO 8 5710 IF MOD(MOD(C,2)+MOD(D,2),2)=C0 THEN PRINT HEX(0E);" ";HEX(0F); : ELSE PRINT " "; 5740 NEXT D : PRINT : NEXT C : PRINT HEX(0F);" C-1 C-2 C-3 C-4 C-5 C-6 C-7 C-8" : PRINT : RETURN 5830 IF N4<-6 THEN RETURN : X1=X : Y1=Y : C1=C : D1=D : P6=N4 : B(C,D)=B(X,Y) : B(X,Y)=0 : FOR X=1 TO C9 : FOR Y=1 TO D9 : IF B(X,Y)>=0 THEN 5960 : GOSUB 1720 : IF Q=1 THEN 5990 5960 NEXT Y,X : GOTO 6000 5990 N4=0 6000 B(X1,Y1)=B(C1,D1) : B(C1,D1)=P6 : X=X1 : Y=Y1 : C=C1 : D=D1 : RETURN 6070 PRINT "AS THE COMPUTER REQUESTS IT, INPUT THE" : PRINT "COORDINATES OF YOUR MOVE- FIRST THE" : PRINT "LOCATION OF THE PIECE, THEN THE DESTINATION." : PRINT "TYPE X,Y WHERE X IS THE RANK (ROW) AND Y IS" : PRINT "THE FILE (COLUMN)" : PRINT : PRINT "SPECIAL RULES" 6140 PRINT "-------------" : PRINT " TO CASTLE, TYPE 10,10" : PRINT " TO START A MOVE ALL OVER, TYPE 0,0" : PRINT " TO MOVE EN PASSENT, GIVE COORDINATES AS USUAL" : PRINT : RETURN 6270 PRINT AT(21,0,);"DO YOU WANT TO PLAY ANOTHER GAME ";Z$;"? (Y/N)" : INPUT Z1$ : IF Z1$ = "N" THEN 6280 : IF Z1$ <> "Y" THEN 6270 : GOTO 105 6280 DEFFN'31 : PRINT HEX(0202000F) : LOAD DC T#0,"START"