Files
tranZPUter/software/BAS/CHESS.bas

498 lines
12 KiB
QBasic
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
100 REM--CHESS BY RANDY MILLER, JAN, 1976
110 DEFINT A-Z:DEFSNG E:DEFSNG M:DEFSNG P
120 DIM PS(70,3),MV(35,2),V(32)
130 DIM B(8,8),TM(8,8)
140 DEF FNL(X)=X\10
150 DEF FNM(X)=X MOD(10)
160 TM(1,1)=0
170 FOR X=1 TO 32
180 READ V(X)
190 NEXT
200 FOR Y=1 TO 8
210 FOR X=1 TO 8
220 READ B(X,Y)
230 NEXT X:NEXT Y
240 DATA -2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1
250 DATA 8,12,19,21,-8,-12,-19,-21
260 DATA 1,9,10,11,-1,-9,-10,-11
270 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
280 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
290 DATA -1,-1,-1,-1,-4,-2,-3,-6,-5,-3,-2,-4
300 CB=3:CW=3
310 PRINT:PRINT:PRINT:PRINT TAB(10);"**** CHESS ****"
320 INPUT "DO YOU WANT TO BE WHITE OR BLACK";C$
330 IF LEFT$(C$,1)="B" THEN 370
340 B(4,1)=5:B(4,8)=-5
350 B(5,1)=6:B(5,8)=-6
360 GOTO 380
370 PRINT "THANK YOU, THAT MEANS I GET TO GO FIRST":PRINT
380 FOR Y=1 TO 8
390 FOR X=1 TO 8
400 TM(X,Y)=B(X,Y)
410 NEXT X:NEXT Y
420 IF LEFT$(C$,1)<>"B" THEN 840
430 NB=1
440 REM -- COMPILE LIST OF POSSIBLE MOVES --
450 FOR X=1 TO 8
460 FOR Y=1 TO 8
470 IF SGN(B(X,Y))<>1 THEN 550
480 GOSUB 1870
490 FOR D=1 TO N
500 IF MV(D,1)=0 THEN 540
510 PS(NB,1)=MV(D,1)
520 PS(NB,2)=MV(D,2)
530 NB=NB+1
540 NEXT D
550 NEXT Y
560 NEXT X
570 PRINT:PRINT "NUMBER OF POSSIBLE MOVES FOR COMPUTER";NB-1:PRINT
580 IF NB>1 THEN PRINT "FROM TO BOARD VALUE":GOTO 620
590 PRINT "I DON'T BELIEVE IT! - YOU WON!!!"
600 END
610 REM -- EVALUATE EACH POSSIBLE MOVE --
620 FOR D=1 TO NB-1
630 D1=FNL(PS(D,1))
640 D2=FNM(PS(D,1))
650 D3=FNL(PS(D,2))
660 D4=FNM(PS(D,2))
670 D5=B(D3,D4)
680 TM(D3,D4)=TM(D1,D2)
690 TM(D1,D2)=0
700 GOSUB 1530
710 PS(D,3)=EV
720 TM(D1,D2)=TM(D3,D4)
730 TM(D3,D4)=D5
740 PRINT PS(D,1);PS(D,2);TAB(12);PS(D,3)
750 NEXT D
760 REM
770 MZ=PS(1,3):MX=1
780 IF NB=2 THEN 830
790 FOR D=2 TO NB-1
800 IF PS(D,3)<=MZ THEN 820
810 MX=D:MZ=PS(D,3)
820 NEXT D
830 GOSUB 1290
840 GOSUB 870
850 PRINT
860 GOTO 430
870 REM -- INPUT ROUTINE --
880 GOTO 910
890 INPUT "YOUR MOVE";M,N
900 IF M<>0 THEN 930
910 FOR P=1 TO 8:FOR P1=1 TO 8:PRINT B(P1,P);:NEXT P1:PRINT:NEXT P
920 GOTO 890
930 X1=FNL(M):Y1=FNM(M):X2=FNL(N):Y2=FNM(N)
940 IF X1>8 OR X1<1 OR Y1>8 OR Y1<1 THEN 970
950 IF X2>8 OR X2<1 OR Y2>8 OR Y2<1 THEN 970
960 IF SGN(B(X1,Y1))=-1 THEN 990
970 PRINT "YOU CAN'T DO THAT."
980 GOTO 890
990 REM
1000 FOR P=1 TO 8
1010 FOR P1=1 TO 8
1020 TM(P,P1)=B(P,P1)
1030 NEXT P1
1040 NEXT P
1050 GOSUB 3690
1060 IF LG=0 THEN 970
1070 TM(X2,Y2)=TM(X1,Y1)
1080 TM(X1,Y1)=0
1090 B(X2,Y2)=B(X1,Y1)
1100 B(X1,Y1)=0
1110 PRINT "ACCEPTED."
1120 IF Y2<>1 OR B(X2,Y2)<>-1 THEN 1180
1130 PRINT "TO PROMOTE YOUR PAWN TO A KNIGHT, TYPE 2; FOR A BISHOP,"
1140 PRINT "TYPE 3; FOR A ROOK, TYPE 4; FOR A QUEEN, TYPE 5";
1150 INPUT P
1160 IF P>5 OR P<2 THEN 1130
1170 B(X2,Y2)=-P:TM(X2,Y2)=-P
1180 IF B(X2,Y2)<>-6 OR ABS(X1-X2)<>2 THEN 1240
1190 IF X1-X2=2 THEN 1250
1200 B(8,8)=0:TM(8,8)=0
1210 B(X2-1,8)=-4:TM(X2-1,8)=-4
1220 CB=(CB AND -3)
1230 PRINT "IT'S ABOUT TIME YOU CASTLED!":PRINT
1240 RETURN
1250 B(1,8)=0:TM(1,8)=0
1260 B(X2+1,8)=-4:TM(X2+1,8)=-4
1270 CB=(CB AND -3)
1280 GOTO 1230
1290 REM -- OUTPUT ROUTINE --
1300 IF PS(MX,3)<200 THEN 1350
1310 PRINT "HA - LET'S SEE YOU GET OUT OF THIS -"
1320 PRINT "I MOVE";PS(MX,1);"TO";PS(MX,2)
1330 PRINT "THANKS FOR THE GOOD GAME..."
1340 END
1350 ON INT(RND(1)*4)+1 GOTO 1360,1370,1380,1390
1360 PRINT "I RECKON I'LL MOVE ";:GOTO 1400
1370 PRINT "I GUESS I'LL TAKE";:GOTO 1400
1380 PRINT "MY MOVE IS";:GOTO 1400
1390 PRINT "I LIKE";
1400 PRINT PS(MX,1);"TO";PS(MX,2):PRINT
1410 D1=FNL(PS(MX,1))
1420 D2=FNM(PS(MX,1))
1430 D3=FNL(PS(MX,2))
1440 D4=FNM(PS(MX,2))
1450 B(D3,D4)=B(D1,D2)
1460 B(D1,D2)=0
1470 IF D4<>8 OR B(D3,D4)<>1 THEN 1500
1480 PRINT "I PROMOTE MY PAWN TO A QUEEN!"
1490 B(D3,D4)=5
1500 RETURN
1510 REM
1520 EV=RND(1):RETURN
1530 EV=RND(1)/2:US=0
1540 EV=EV+D4/7
1550 FOR PJ=1 TO 8
1560 IF TM(PJ,8)<>1 THEN 1590
1570 TM(PJ,8)=5
1580 GOTO 1610
1590 NEXT PJ
1600 IF SGN(D5)=-1 THEN EV=EV-D5
1610 FOR X=1 TO 8
1620 FOR Y=1 TO 8
1630 CX=TM(X,Y):CS=SGN(CX)
1640 IF CS<>-1 THEN 1750
1650 EV=EV+CX
1660 GOSUB 1840
1670 IF N=0 THEN 1750
1680 US=US+N:EV=EV-.166666
1690 FOR UX=1 TO N
1700 U1=MV(UX,1):U2=MV(UX,2)
1710 IF SGN(TM(FNL(U2),FNM(U2)))<>1 THEN 1740
1720 IF SGN(TM(FNL(U1),FNM(U1)))<>-1 THEN 1740
1730 EV=EV-2*TM(FNL(U2),FNM(U2))
1740 NEXT UX
1750 NEXT Y
1760 NEXT X
1770 IF US>0 THEN 1800
1780 EV=EV+1000
1790 GOTO 1810
1800 FOR X=3 TO 6:FOR Y=3 TO 6:EV=EV+TM(X,Y)/3:NEXTY:NEXTX
1810 IF PJ>8 THEN 1830
1820 TM(PJ,8)=1
1830 RETURN
1840 REM
1850 R=0
1860 GOTO 1880
1870 R=1
1880 MV(1,1)=0
1890 S1=SGN(TM(X,Y))
1900 AA=X*10+Y
1910 N=1
1920 ON ABS(TM(X,Y)) GOSUB 2330,2770,2880,3140,3400,3440
1930 IF N=1 THEN 1950
1940 IF R=1 THEN 1970
1950 N=N-1
1960 RETURN
1970 REM -- IF RESTRICTED --
1980 N1=N-1
1990 N=N1
2000 FOR K=1 TO N1
2010 C1=FNL(MV(K,1))
2020 C2=FNM(MV(K,1))
2030 C3=FNL(MV(K,2))
2040 C4=FNM(MV(K,2))
2050 IF ABS(TM(C3,C4))=6 THEN 2070
2060 IF SGN(TM(C3,C4))<>S1 THEN 2080
2070 MV(K,1)=0:MV(K,2)=0:GOTO 2290
2080 C5=TM(C3,C4)
2090 TM(C3,C4)=TM(C1,C2)
2100 TM(C1,C2)=0
2110 REM -- FIND KING --
2120 FOR Y2=1 TO 8
2130 FOR X2=1 TO 8
2140 IF TM(X2,Y2)=6*S1 THEN 2170
2150 NEXT X2
2160 NEXT Y2
2170 REM
2180 FOR Y1=1 TO 8
2190 FOR X1=1 TO 8
2200 IF SGN(TM(X1,Y1))<>-S1 THEN 2250
2210 IF TM(X1,Y1)<>-S1 THEN 2230
2220 IF X1=X2 AND ABS(Y2-Y1)>2 THEN 2250
2230 GOSUB 3660
2240 IF LG=1 THEN 2310
2250 NEXT X1
2260 NEXT Y1
2270 TM(C1,C2)=TM(C3,C4)
2280 TM(C3,C4)=C5
2290 NEXT K
2300 RETURN
2310 MV(K,1)=0:MV(K,2)=0
2320 GOTO 2250
2330 REM -- RAW PAWN MOVE --
2340 IF S1=-1 THEN 2560
2350 IF Y+1>8 THEN 2550
2360 IF TM(X,Y+1)<>0 THEN 2450
2370 MV(N,1)=AA
2380 MV(N,2)=X*10+Y+1
2390 N=N+1
2400 IF Y>2 THEN 2450
2410 IF TM(X,Y+2)<>0 THEN 2450
2420 MV(N,1)=AA
2430 MV(N,2)=X*10+Y+2
2440 N=N+1
2450 IF X=1 THEN 2500
2460 IF SGN(TM(X-1,Y+1))<>-S1 THEN 2500
2470 MV(N,1)=AA
2480 MV(N,2)=(X-1)*10+Y+1
2490 N=N+1
2500 IF X=8 THEN 2550
2510 IF SGN(TM(X+1,Y+1))<>-S1 THEN 2550
2520 MV(N,1)=AA
2530 MV(N,2)=(X+1)*10+Y+1
2540 N=N+1
2550 RETURN
2560 IF Y-1<1 THEN 2760
2570 IF TM(X,Y-1)<>0 THEN 2660
2580 MV(N,1)=AA
2590 MV(N,2)=X*10+Y-1
2600 N=N+1
2610 IF Y<7 THEN 2660
2620 IF TM(X,Y-2)<>0 THEN 2660
2630 MV(N,1)=AA
2640 MV(N,2)=X*10+Y-2
2650 N=N+1
2660 IF X=1 THEN 2710
2670 IF SGN(TM(X-1,Y-1))<>-S1 THEN 2710
2680 MV(N,1)=AA
2690 MV(N,2)=(X-1)*10+Y-1
2700 N=N+1
2710 IF X=8 THEN 2760
2720 IF SGN(TM(X+1,Y-1))<>-S1 THEN 2760
2730 MV(N,1)=AA
2740 MV(N,2)=(X+1)*10+Y-1
2750 N=N+1
2760 RETURN
2770 REM -- RAW KNIGHT MOVE --
2780 FOR C6=1 TO 15 STEP 2
2790 KL=V(C6):KM=V(C6+1)
2800 XT=X+KL
2810 YT=Y+KM
2820 IF XT>8 OR XT<1 OR YT>8 OR YT<1 THEN 2860
2830 MV(N,1)=AA
2840 MV(N,2)=XT*10+YT
2850 N=N+1
2860 NEXT C6
2870 RETURN
2880 REM -- RAW BISHOP MOVE --
2890 EL=(8-Y)*-(8-Y<=8-X)+(8-X)*-(8-X < 8-Y)
2900 IF EL=0 THEN 2930
2910 C6=11
2920 GOSUB 3060
2930 EL=(8-Y)*-(8-Y <= X-1)+(X-1)*-(X-1 < 8-Y)
2940 IF EL=0 THEN 2970
2950 C6=-9
2960 GOSUB 3060
2970 EL=(8-X)*-(8-X <= Y-1)+(Y-1)*-(Y-1 < 8-X)
2980 IF EL=0 THEN 3010
2990 C6=9
3000 GOSUB 3060
3010 EL=(Y-1)*-(Y-1 <= X-1)+(X-1)*-(X-1 < Y-1)
3020 IF EL=0 THEN 3050
3030 C6=-11
3040 GOSUB 3060
3050 RETURN
3060 FOR E=1 TO EL
3070 F=C6*E
3080 MV(N,1)=AA
3090 MV(N,2)=AA+F
3100 N=N+1
3110 IF TM(FNL(AA+F),FNM(AA+F))<>0 THEN 3130
3120 NEXT E
3130 RETURN
3140 REM -- RAW ROOK MOVE --
3150 EL=8-Y
3160 IF EL=0 THEN 3190
3170 C6=1
3180 GOSUB 3320
3190 EL=Y-1
3200 IF EL=0 THEN 3230
3210 C6=-1
3220 GOSUB 3320
3230 EL=8-X
3240 IF EL=0 THEN 3270
3250 C6=10
3260 GOSUB 3320
3270 EL=X-1
3280 IF EL=0 THEN 3310
3290 C6=-10
3300 GOSUB 3320
3310 RETURN
3320 FOR E=1 TO EL
3330 F=C6*E
3340 MV(N,1)=AA
3350 MV(N,2)=AA+F
3360 N=N+1
3370 IF TM(FNL(AA+F),FNM(AA+F))<>0 THEN 3390
3380 NEXT E
3390 RETURN
3400 REM -- RAW QUEEN MOVE --
3410 GOSUB 2880
3420 GOSUB 3140
3430 RETURN
3440 REM -- RAW KING MOVE --
3450 IF X=8 THEN 3510
3460 C6=10:GOSUB 3620
3470 IF Y=1 THEN 3500
3480 C6=9:GOSUB 3620
3490 IF Y=8 THEN 3520
3500 C6=11:GOSUB 3620
3510 IF X=1 THEN 3570
3520 C6=-10:GOSUB 3620
3530 IF Y=8 THEN 3570
3540 C6=-9:GOSUB 3620
3550 IF Y=1 THEN 3570
3560 C6=-11:GOSUB 3620
3570 IF Y=1 THEN 3590
3580 C6=-1:GOSUB 3620
3590 IF Y=8 THEN 3610
3600 C6=1:GOSUB 3620
3610 RETURN
3620 MV(N,1)=AA
3630 MV(N,2)=AA+C6
3640 N=N+1
3650 RETURN
3660 REM
3670 RR=0
3680 GOTO 3700
3690 RR=1
3700 IF TM(X1,Y1)<>0 THEN 3720
3710 LG=0:RETURN
3720 S=SGN(TM(X1,Y1))
3730 A=X1*10+Y1
3740 B=X2*10+Y2
3750 ON ABS(TM(X1,Y1)) GOSUB 4070,4270,4340,4510,4630,4680
3760 IF LG=0 THEN RETURN
3770 IF RR=1 THEN 3790
3780 LG=1:RETURN
3790 REM -- IF RESTRICTED --
3800 IF S=SGN(TM(X2,Y2)) THEN 3710
3810 T1=X1:T2=Y1:T3=X2:T4=Y2:T=TM(X2,Y2)
3820 TM(X2,Y2)=TM(X1,Y1):TM(X1,Y1)=0
3830 SV=S
3840 REM -- FIND KING --
3850 FOR Y2=1 TO 8
3860 FOR X2=1 TO 8
3870 IF TM(X2,Y2)=6*S THEN 3910
3880 NEXT X2
3890 NEXT Y2
3900 END
3910 REM
3920 FOR Y1=1 TO 8
3930 FOR X1=1 TO 8
3940 P=TM(X1,Y1):IF SGN(P)=S OR P=0 OR ABS(P)=6 THEN 3980
3950 GOSUB 3660
3960 S=SV
3970 IF LG=1 THEN 4050
3980 NEXT X1
3990 NEXT Y1
4000 LG=1
4010 TM(T1,T2)=TM(T3,T4)
4020 TM(T3,T4)=T
4030 X1=T1:Y1=T2:X2=T3:Y2=T4
4040 RETURN
4050 LG=0
4060 GOTO 4010
4070 REM -- RAW PAWN MOVE --
4080 IF SGN(Y2-Y1)=S THEN 4110
4090 LG=0:RETURN
4100 LG=1:RETURN
4110 IF S=-1 THEN 4190
4120 IF B-A=1 OR B-A=2 THEN 4160
4130 IF TM(X2,Y2)=0 THEN 4090
4140 IF B-A=-9 OR B-A=11 THEN 4100
4150 GOTO 4090
4160 IF Y2=2 THEN 4100
4170 IF B-A=1 THEN 4100
4180 GOTO 4090
4190 IF A-B=1 OR A-B=2 THEN 4230
4200 IF TM(X2,Y2)=0 THEN 4090
4210 IF A-B=-9 OR A-B=11 THEN 4100
4220 GOTO 4090
4230 IF Y2=7 THEN 4100
4240 IF A-B=1 THEN 4100
4250 IF Y1=7 AND A-B=2 THEN 4100
4260 GOTO 4090
4270 REM -- RAW KNIGHT MOVE --
4280 FOR P=17 TO 24
4290 P1=V(P)
4300 IF A+P1<>B THEN 4320
4310 LG=1:RETURN
4320 NEXT P
4330 LG=0:RETURN
4340 REM -- RAW BISHOP MOVE --
4350 IF Y2=Y1 OR X2=X1 THEN 4420
4360 SP=-9
4370 IF X2<X1 THEN 4470
4380 IF Y1<Y2 THEN 4430
4390 SP=9
4400 P=INT(ABS(A-B)/9)
4410 IF ABS(A-B)/9=P THEN 4490
4420 LG=0:RETURN
4430 SP=11
4440 P=INT(ABS(A-B)/11)
4450 IF ABS(A-B)/11<>P THEN 4420
4460 GOTO 4490
4470 IF Y1<Y2 THEN 4400
4480 SP=-11:GOTO 4440
4490 GOSUB 4950
4500 RETURN
4510 REM -- RAW ROOK MOVES --
4520 IF Y2=Y1 THEN 4590
4530 IF X1=X2 THEN 4550
4540 LG=0:RETURN
4550 P=ABS(B-A)
4560 SP=SGN(B-A)
4570 GOSUB 4950
4580 RETURN
4590 P=ABS(INT((B-A)/10))
4600 SP=SGN(B-A)*10
4610 GOSUB 4950
4620 RETURN
4630 REM -- RAW QUEEN MOVE --
4640 GOSUB 4340
4650 IF LG=1 THEN RETURN
4660 GOSUB 4510
4670 RETURN
4680 REM -- KING MOVE --
4690 IF ABS(A-B)<>20 THEN 4890
4700 IF A-B=20 THEN 4730
4710 IF CB<>1 AND CB<>3 THEN 4880
4720 GOTO 4740
4730 IF CB=0 OR CB=1 THEN 4880
4740 PS=SGN(A-B):FORP2=28+50*((PS=-1)*-1)TOA+10-20*((PS=-1)+1)STEP10*P
4750 IF TM(FNL(P2),FNM(P2))<>0 THEN 4880
4760 NEXT P2:T1=X1:T2=Y1:T3=X2:T4=Y2
4770 FOR P2=A TO 18+70*((PS=-1)*-1) STEP 10*-PS
4780 X2=FNL(P2):Y2=FNM(P2)
4790 FOR X1=1 TO 8
4800 FOR Y1=1 TO 8
4810 IF SGN(TM(X1,Y1))<>1 THEN 4840
4820 GOSUB 3690
4830 IF LG=1 THEN 4880
4840 NEXT Y1:NEXT X1:NEXT P2
4850 LG=1
4860 X1=T1:Y1=T2:X2=T3:Y2=T4
4870 RETURN
4880 LG=0:GOTO 4860
4890 FOR P=25 TO 32
4900 P1=V(P)
4910 IF B=A+P1 THEN 4940
4920 NEXT P
4930 LG=0:RETURN
4940 LG=1:RETURN
4950 REM
4960 LG=0
4970 IF P=0 THEN STOP
4980 IF P>1 THEN 5000
4990 LG=1:RETURN
5000 FOR P1=1 TO P-1
5010 P2=A+SP*P1
5020 IF TM(FNL(P2),FNM(P2))<>0 THEN RETURN
5030 NEXT P1
5040 LG=1:RETURN
5050 END

5000 FOR P1=1 TO