Listing of file='CHESS' on disk='vmedia/more_games.wvd.zip'
# Sector 388, program filename = 'CHESS'
0010 REM % CHESS
: REM CHESS GAME
: REM 07/10/80 CDH
: REM
0105 PRINT
: PRINT HEX(0306);AT(6,32);BOX(1,14);" C H E S S "
: PRINT HEX(0A0A);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),C$(2,7)27,A$25,Z1$1
: F1,F2,F4,F9,R,S1,S6,S8,V6=0
: MAT READ B
0201 C$(1,1),C$(2,1)=HEX(C0C0C0C0C00A0808080808C0C0C0C0C00A0808080808C0C0C0C0C
0)
0202 C$(1,2)=HEX(C0C0C0C0C00A0808080808C0E8EDC0C00A0808080808C0FAFAD0C0)
0204 C$(1,3)=HEX(C0C0C0C0C00A0808080808C0F0D6D5C00A0808080808C0F8F5D5C0)
0206 C$(1,4)=HEX(C0C0C0C0C00A0808080808C0C8DDC0C00A0808080808C0FAFAD0C0)
0208 C$(1,5)=HEX(C0C0C0C0C00A0808080808C0EDEDC5C00A0808080808C0FAFAD0C0)
0210 C$(1,6)=HEX(C0D0D4D0C00A0808080808C0FBEBD1C00A0808080808C0FAFAD0C0)
0212 C$(1,7)=HEX(C0F0FEF4D00A0808080808C0F8D5FDD00A0808080808C0FAF5FFD0)
0222 C$(2,2)=HEX(C0C0C0C0C00A0808080808C0E8FDC0C00A0808080808C0FAFFD0C0)
0224 C$(2,3)=HEX(C0C0C0C0C00A0808080808C0F0FED5C00A0808080808C0F8FFD5C0)
0226 C$(2,4)=HEX(C0C0C0C0C00A0808080808C0C8DDC0C00A0808080808C0FAFFD0C0)
0228 C$(2,5)=HEX(C0C0C0C0C00A0808080808C0EDFDC5C00A0808080808C0FAFFD0C0)
0230 C$(2,6)=HEX(C0D0D4D0C00A0808080808C0FBFFD1C00A0808080808C0FAFFD0C0)
0232 C$(2,7)=HEX(C0F0FEF4D00A0808080808C0F8FFFDD00A0808080808C0FAFFFFD0)
0400 PRINT TAB(31);
: INPUT "WHAT IS YOUR NAME",Z$
: PRINT
0460 PRINT HEX(0306);
: FOR K=1TO 8
: PRINT AT(0,0);BOX(K*3,K*6);AT((8-K)*3,(8-K)*6);BOX(K*3,K*6)
: NEXT K
0465 GOSUB 5700
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 C0=1
: D$="CHARACTER ERROR"
: RETURN
0570 C0=2
: D$="PAWN"
: RETURN
0600 C0=3
: D$="KNIGHT"
: RETURN
0630 C0=4
: D$="BISHOP"
: RETURN
0660 C0=5
: D$="ROOK"
: RETURN
0690 C0=6
: D$="QUEEN"
: RETURN
0720 C0=7
: 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 GOSUB '100
: PRINT AT(2,50);"AFTER";R;"MOVES, IT'S";AT(3,50);"A STALEMATE. GOOD PLAY.
"
: GOTO 6260
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
: GOSUB '100
: PRINT AT(2,50);"THE COMPUTER HAS DEFEATED YOU";AT(3,50);"IN";R;"MOVES ";Z
$;"."
: GOTO 6260
1080 FOR K=19TO 21
: PRINT AT(K,50,29);
: NEXT K
: PRINT AT(19,50); "WHERE IS THE PIECE YOU WANT";AT(20,50);"TO MOVE (R,C)";
: INPUT X,Y
: IF X<>10 THEN 1220
: GOSUB 4760
: IF F9=0 THEN 1080
: R=R+1
: GOSUB '100
: GOTO 1690
1210 GOTO 1080
1220 IF X>8OR Y>8OR X<1OR Y<1 OR B(X,Y)<=0 THEN 1210
: GOSUB 530
: FOR K=19TO 22
: PRINT AT(K,50,29);
: NEXT K
: PRINT AT(19,50);"PLAYER MOVES, ";D$;AT(20,50);"TO WHERE (R,C)";
: INPUT 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 HEX(07)
: GOTO 1080
1340 GOSUB '100
: 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 AT(0,50);"YOU TAKE MY PAWN, EN PASSENT"
: GOTO 1540
1440 GOSUB 1720
: IF Q=0 THEN 1490
: GOSUB 4260
: IF Q=1 THEN 1510
1480 PRINT AT(22,50);"YOU CAN'T MOVE INTO CHECK."
1490 PRINT AT(22,50);"ILLEGAL MOVE."
: GOTO 1080
1510 GOSUB '100
: IF B(C,D)=0 THEN 1540
: GOSUB 520
: PRINT AT(0,50);"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
: GOSUB '100
: PRINT AT(0,50);"(PLAYER PROMOTES TO QUEEN)"
: GOTO 1690
1660 GOSUB '100
: PRINT AT(0,50);"CONGRATULATIONS ";Z$;",";AT(1,50);"YOU HAVE CHECKMATED TH
E";AT(2,50);"COMPUTER IN";R;"MOVES."
: GOTO 6260
1690 PRINT HEX(06)
: PRINT AT(1,50);"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
: GOSUB '100
: PRINT AT(0,50,29);AT(2,50);"COMPUTER MOVES ";AT(3,50);D$;" TO";C;",";D
: IF B(C,D)=0 THEN 3630
: GOSUB 520
: PRINT AT(4,50);"AND TAKES YOUR ";D$
3630 B(C,D)=B(X,Y)
: IF C5=1 THEN PRINT AT(5,50);"...AND YOU'RE IN CHECK!"
: B(X,Y)=0
: IF C<>8 THEN 3690
: IF B(C,D)<>-1 THEN 3690
: PRINT AT(4,50);"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 GOSUB '100
: PRINT AT(2,50);
: PRINT "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 FOR K=19TO 22
: PRINT AT(K,50,29);
: NEXT K
: PRINT AT(19,50);"(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$="ALREADY MOVED YOUR KING"
4800 IF C5=1 THEN 4802
: GOTO 4810
4802 A$="CAN'T CASTLE OUT OF CHECK"
4810 IF A$<>" " THEN 4940
: PRINT AT(20,50);"KING'S SIDE OR QUEEN'S";AT(21,50);"(ENTER K OR Q)";
4830 INPUT V$
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(22,50);"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"
: RETURN
5230 A$="HAVE A PIECE BETWEEN"
: RETURN
5250 A$="ALREADY 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 PRINT HEX(06010202020F);
5705 FOR C=1 TO 8
: FOR D=1 TO 8
: GOSUB 520
5710 IF C=1 OR C=3 OR C=5 OR C=7 THEN 5720
: IF D=2 OR D=4 OR D=6 OR D=8 THEN PRINT HEX(020400020E);
: ELSE PRINT HEX(0F);
: GOTO 5730
5720 IF D=1 OR D=3 OR D=5 OR D=7 THEN PRINT HEX(020400020E);
: ELSE PRINT HEX(0F);
5730 PRINT AT((C-1)*3,(D-1)*6+1);
5740 IF B(C,D)>=0 THEN PRINT C$(1,C0);
: ELSE PRINT C$(2,C0);
5750 PRINT HEX(01)
: NEXT D,C
: PRINT HEX(0F)
: 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 HEX(0603)
: FOR K=1TO 8
: PRINT AT(0,0);BOX(K,K*2);AT(8-K,(8-K)*2);BOX(K,K*2)
: NEXT K
: FOR K=1TO 8
: PRINT AT(K-1,17);K
: NEXT K
: PRINT AT(8,0);" 1 2 3 4 5 6 7 8"
: PRINT
6080 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 "\D3\D0\C5\C3\C9\C1\CC\A0\D2\D5\CC\C5\D3"
6140 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
6260 FOR P=1 TO 500
: NEXT P
6270 PRINT AT(19,50);"DO YOU WANT TO PLAY ANOTHER";AT(20,50);"GAME ";Z$;"? (Y
/N)";
: LINPUT Z1$
: IF Z1$ = "N" THEN 6280
: IF Z1$ <> "Y" THEN 6270
: GOTO 105
6280 DEFFN'16
: LOAD DC T#0,"START"
7000 DEFFN'100
: PRINT HEX(06)
: FOR K=0TO 22
: PRINT AT(K,50,29)
: NEXT K
: RETURN
8990 DEFFN'31
: SCRATCH T"CHESS"
: SAVE T()"CHESS"