Computer Chess Club Archives


Search

Terms

Messages

Subject: qBASIC Chess program - from 1984 by Dieter Steinwender

Author: Mike Byrne

Date: 19:41:08 02/23/03


it works ...
===================================================================
10 PRINT "  ****************************"
20 PRINT "  ** PROGRAMME D'ECHECS CSS **"
30 PRINT "  ****************************"
40 PRINT "     par Dieter Steinwender"
50 PRINT
60 DEFINT A-L, N-Z
70 DIM B(119), S(10, 4)
71 DIM M(10), A$(10), U(10), F$(10)
72 DIM R1(4), R2(4), R3(4), R4(4), R5(4), R6(4), R7(4), G1(10)
73 DIM W(10), P(10)
80 DIM O(15), OA(6), OE(6), L(6), Z(200, 6)
90 DIM ZT(9, 8), BV(8), BL(2, 9), TL(2, 9)
100 DIM T7(2), BA(2), KR(2), KL(2)
200 RESTORE
210 REM: initialisation
270 FOR I = 0 TO 119
280 B(I) = 100
290 NEXT I
300 FOR I = 9 TO 2 STEP -1
310 FOR J = 1 TO 8
320 READ B(I * 10 + J)
330 NEXT J
340 NEXT I
350 DATA  -2,-4,-3,-5,-6,-3,-4,-2
360 DATA  -1,-1,-1,-1,-1,-1,-1,-1
370 DATA   0, 0, 0, 0, 0, 0, 0, 0
380 DATA   0, 0, 0, 0, 0, 0, 0, 0
390 DATA   0, 0, 0, 0, 0, 0, 0, 0
400 DATA   0, 0, 0, 0, 0, 0, 0, 0
410 DATA   1, 1, 1, 1, 1, 1, 1, 1
420 DATA   2, 4, 3, 5, 6, 3, 4, 2
430 F = 1
440 FOR I = 1 TO 4
450 S(0, I) = 1
460 NEXT I
470 S(0, 0) = 0
480 M(0) = 0
510 FOR I = 0 TO 6
520 READ A$(I), U(I)
530 NEXT I
540 DATA ".",0,"P",100,"T",500,"F",350
550 DATA "C",325,"D",900,"R",20000
560 M0 = 48100!
590 F$(0) = "."
600 F$(1) = "."
610 F$(2) = "*"
640 FOR I = 0 TO 15
650 READ O(I)
660 NEXT I
670 DATA -9,-11,9,11,-1,10,1,-10,19,21,12,-8,-19,-21,-12,8
690 FOR I = 1 TO 6
700 READ OA(I), OE(I), L(I)
710 NEXT I
720 DATA 0,3,0,4,7,1,0,3,1,8,15,0,0,7,1,0,7,0
750 FOR I = 1 TO 4
760 READ R1(I), R2(I), R3(I), R4(I), R5(I), R6(I), R7(I)
770 NEXT I
780 DATA 96,97,95,97,95,97,98
790 DATA 92,94,93,95,95,93,91
800 DATA 26,27,25,27,25,27,28
810 DATA 22,24,23,25,25,23,21
840 FOR J = 1 TO 8
850 FOR I = 2 TO 9
860 ZT(I, J) = 12 - 4 * (ABS(5.5 - I) + ABS(4.5 - J))
870 NEXT I
880 READ BV(J)
890 NEXT J
900 DATA 0,0,4,6,7,2,0,0
930 MZ = 0
940 G1(0) = 1
950 T0 = 1
1800 T = 0
2000 REM: coup du joueur
2020 PRINT "   VOTRE COUP"; : INPUT E$
2050 IF E$ <> "DE" THEN 2070
2060 GOTO 200
2070 IF E$ <> "FI" THEN 2090
2080 GOTO 15000
2090 IF E$ <> "PO" THEN 2120
2100 GOSUB 4000
2110 GOTO 2000
2120 IF E$ <> "PB" THEN 2150
2130 GOSUB 5000
2140 GOTO 2000
2150 IF E$ <> "AV" THEN 2170
2160 GOTO 3500
2170 IF E$ <> "CM" THEN 2210
2180 PRINT "COUPS MULTIPLES: ";
2190 IF MZ = 0 THEN MZ = 1: PRINT "DEBUT": GOTO 2000
2200 MZ = 0: PRINT "FIN": GOTO 2000
2210 IF E$ <> "LC" THEN 2260
2220 Z0 = Z1
2230 GOSUB 6500
2240 Z1 = Z0
2250 GOTO 2000
2260 IF E$ <> "RC" THEN 2330
2270 IF T = 1 THEN 2300
2280 PRINT "  DESOLE: PAS POSSIBLE"
2290 GOTO 2000
2300 GOSUB 9600
2310 PRINT "  OK"
2320 GOTO 2000
2330 IF E$ <> "PR" THEN 3000
2340 PRINT "  PROFONDEUR D'ANALYSE="; T0;
2350 INPUT T0
2360 T0 = ABS(T0)
2370 GOTO 2000
3000 REM
3010 IF LEN(E$) < 4 THEN 2000
3020 V1 = ASC(E$) - 64 + 10 * (ASC(MID$(E$, 2, 1)) - 47)
3030 N1 = ASC(MID$(E$, 3, 1)) - 64 + 10 * (ASC(MID$(E$, 4, 1)) - 47)
3040 GOSUB 8800
3050 GOSUB 7000
3060 FOR Z1 = 1 TO G - 1
3070 IF Z(Z1, 1) <> V1 THEN 3090
3080 IF Z(Z1, 2) = N1 THEN 3120
3090 NEXT Z1
3100 PRINT "  COUP ILLEGAL"
3110 GOTO 2000
3120 IF Z(Z1, 4) = 0 THEN 3170
3140 IF RIGHT$(E$, 1) = "C" THEN Z1 = Z1 + 1
3150 IF RIGHT$(E$, 1) = "F" THEN Z1 = Z1 + 2
3160 IF RIGHT$(E$, 1) = "T" THEN Z1 = Z1 + 3
3170 PRINT "  VOTRE COUP: ";
3180 GOSUB 6000
3190 GOSUB 9000
3200 GOSUB 7000
3210 IF MT = 0 THEN 3300
3220 GOSUB 9600
3230 GOTO 3100
3300 IF MZ = 1 THEN 2000
3500 REM: coup de l'ordinateur
3520 GOSUB 8800
3530 GOSUB 10000
3540 IF Z2 = 0 THEN 3650
3545 IF W = 1 THEN 3660
3550 IF W = -32766 THEN 3630
3560 Z1 = Z2
3570 PRINT "  MON COUP: ";
3580 GOSUB 6000
3590 GOSUB 9000
3595 IF W = -2 THEN 3660
3600 IF W < 32765 THEN 3670
3610 PRINT "  ECHEC ET MAT!"
3620 GOTO 3670
3630 PRINT "  DAMNED, VOUS AVEZ GAGNE!"
3640 GOTO 3670
3650 IF T0 = 0 THEN 3670
3660 PRINT "  PAT: PARTIE NULLE!"
3670 PRINT "  VALEUR="; W; "  POSITIONS ANALYSEES="; C1
3680 GOTO 2000
4000 REM: affichage de la position
4020 PRINT
4030 FOR I = 9 TO 2 STEP -1
4040 PRINT "  "; I - 1; "  ";
4050 FOR J = 1 TO 8
4060 A1 = B(I * 10 + J)
4070 F1 = SGN(A1)
4080 A1 = ABS(A1)
4090 PRINT F$(F1 + 1); A$(A1); "  ";
4100 NEXT J
4110 PRINT : PRINT
4120 NEXT I
4140 PRINT "        ";
4150 FOR J = 1 TO 8
4160 PRINT CHR$(64 + J); "   ";
4170 NEXT J
4180 PRINT : PRINT
4190 PRINT "   BILAN MATERIEL= "; M(T)
4200 PRINT "   CASE E.P.     =  "; : GOSUB 6700
4210 PRINT "   STATUT ROQUE  = "; S(T, 1); S(T, 2); S(T, 3); S(T, 4)
4220 PRINT "   AU TOUR DE    = ";
4230 IF F = 1 THEN PRINT " BLANC": GOTO 4250
4240 PRINT " NOIR"
4250 RETURN
5000 REM: entree de la position
5020 T = 0
5030 PRINT "   VIDER L'ECHIQUIER(O/N) "
5040 INPUT E$
5050 IF E$ = "N" THEN 5130
5060 IF E$ <> "O" THEN 5030
5070 FOR I = 2 TO 9
5080 FOR J = 1 TO 8
5090 B(I * 10 + J) = 0
5100 NEXT J
5110 NEXT I
5120 M(0) = 0
5130 PRINT "  BLANC ";
5140 F = 1
5150 GOSUB 5500
5160 PRINT "  NOIR ";
5170 F = -1
5180 GOSUB 5500
5190 PRINT "  AU TOUR DE (B/N) ";
5200 INPUT E$
5210 IF E$ = "N" THEN 5240
5220 IF E$ <> "B" THEN 5190
5230 F = 1
5240 PRINT "  MODIF DU STATUT E.P./ROQUE  (O/N) ";
5250 INPUT E$
5260 IF E$ = "N" THEN 5320
5270 IF E$ <> "O" THEN 5240
5280 PRINT "  COLONNE E.P. "; : INPUT E$
5285 IF E$ = "0" THEN S(0, 0) = 0: GOTO 5300
5290 S(0, 0) = F * 15 + ASC(E$) - 9
5300 PRINT "  STATUT ROQUE ";
5310 INPUT S(0, 1), S(0, 2), S(0, 3), S(0, 4)
5320 GOSUB 4000
5330 RETURN
5500 REM: installation des pieces d'un cote
5520 INPUT E$
5530 IF E$ = "." THEN 5660
5540 IF LEN(E$) <> 3 THEN 5590
5560 FOR I = 0 TO 6
5570 IF LEFT$(E$, 1) = A$(I) THEN A = I: GOTO 5600
5580 NEXT I
5590 PRINT " ENTREE ERRONEE": GOTO 5520
5600 REM
5610 N = ASC(MID$(E$, 2, 1)) - 64 + 10 * (ASC(MID$(E$, 3, 1)) - 47)
5620 M(0) = M(0) - SGN(B(N)) * U(ABS(B(N)))
5630 B(N) = F * A
5640 M(0) = M(0) + F * U(A)
5650 GOTO 5520
5660 RETURN
6000 REM: affichage du coup
6020 A$ = A$(ABS(B(Z(Z1, 1))))
6030 FOR J = 1 TO 2
6040 RE = INT(Z(Z1, J) / 10)
6050 LI = Z(Z1, J) - 10 * RE
6060 A$ = A$ + CHR$(64 + LI) + CHR$(47 + RE)
6070 NEXT J
6080 IF Z(Z1, 4) = 0 THEN 6100
6090 A$ = A$ + "=" + A$(Z(Z1, 4))
6100 PRINT A$
6110 RETURN
6500 REM: affichage des coups legaux
6520 GOSUB 7000
6530 IF MT = 0 THEN 6560
6540 PRINT "  LE ROI PEUT ETRE PRIS"
6550 RETURN
6560 PRINT G - G1(T); " COUPS PSEUDO-LEGAUX"
6570 FOR Z1 = G1(T) TO G - 1
6580 GOSUB 6000
6590 NEXT Z1
6600 RETURN
6700 REM: affichage d'une case e.p.
6710 IF S(T, 0) = 0 THEN A$ = "0": GOTO 6750
6720 RE = INT(S(T, 0) / 10)
6730 LI = S(T, 0) - 10 * RE
6740 A$ = CHR$(64 + LI) + CHR$(47 + RE)
6750 PRINT A$
6760 RETURN
7000 REM: generation des coups
7020 MT = 0
7030 G = G1(T)
7040 FOR V = 21 TO 98
7050 A = B(V)
7060 IF A = 100 THEN 7490
7070 IF SGN(A) <> F THEN 7490
7080 A = ABS(A)
7110 IF A <> 1 THEN 7360
7120 N = V + (F * 10)
7130 IF B(N) <> 0 THEN 7210
7140 GOSUB 7900
7150 IF (INT(V / 10) - 5.5) * F <> -2.5 THEN 7210
7160 N = V + (F * 20)
7170 IF B(N) <> 0 THEN 7210
7180 GOSUB 8500
7190 Z(G - 1, 6) = (V + N) * .5
7210 REM
7220 FOR I = 1 TO 2
7230 N = V + O(F + I)
7240 IF B(N) = 100 THEN 7330
7250 IF N = S(T, 0) THEN 7300
7260 IF SGN(B(N)) <> -F THEN 7330
7270 IF B(N) = -F * 6 THEN MT = 1: GOTO 7810
7280 GOSUB 7900
7290 GOTO 7330
7300 GOSUB 8500
7310 Z(G - 1, 3) = 1
7320 Z(G - 1, 6) = N - 10 * F
7330 NEXT I
7340 GOTO 7490
7360 REM
7370 FOR I = OA(A) TO OE(A)
7380 LA = L(A)
7390 N = V
7400 N = N + O(I)
7410 IF B(N) = 100 THEN 7480
7420 IF SGN(B(N)) = F THEN 7480
7430 IF B(N) = 0 THEN 7460
7440 IF B(N) = -F * 6 THEN MT = 1: GOTO 7810
7450 LA = 0
7460 GOSUB 8500
7470 IF LA = 1 THEN 7400
7480 NEXT I
7490 NEXT V
7520 FOR I = F + 2 TO F + 3
7530 IF S(T, I) = 0 THEN 7790
7540 FOR J = R1(I) TO R2(I)
7550 IF B(J) <> 0 THEN 7790
7560 NEXT J
7580 FOR J = R3(I) TO R4(I)
7590 FOR K = 0 TO 7
7600 N = J
7610 N = N + O(K)
7620 IF B(N) = 100 THEN 7700
7630 IF SGN(B(N)) = F THEN 7700
7640 IF B(N) = 0 THEN 7610
7650 IF OA(ABS(B(N))) > K THEN 7700
7660 IF OA(ABS(B(N))) < K THEN 7700
7670 IF N = J + O(K) THEN 7790
7680 IF L(ABS(B(N))) <> 1 THEN 7700
7690 GOTO 7790
7700 NEXT K
7710 FOR K = 8 TO 15
7720 IF B(J + O(K)) = -F * 4 THEN 7790
7730 NEXT K
7740 NEXT J
7750 V = R5(I)
7760 N = R6(I)
7770 GOSUB 8500
7780 Z(G - 1, 5) = I
7790 NEXT I
7800 G1(T + 1) = G
7810 RETURN
7900 REM: noter les coups de pion
7920 IF (INT(N / 10) - 5.5) * F <> 3.5 THEN GOSUB 8500: GOTO 7980
7940 FOR I2 = 5 TO 2 STEP -1
7950 GOSUB 8500
7960 Z(G - 1, 4) = I2
7970 NEXT I2
7980 RETURN
8500 REM: placer le coup genere dans la pile des coups
8520 Z(G, 1) = V
8530 Z(G, 2) = N
8540 Z(G, 3) = ABS(B(N))
8550 FOR I1 = 4 TO 6
8560 Z(G, I1) = 0
8570 NEXT I1
8580 IF G = 200 THEN 8600
8590 G = G + 1
8600 RETURN
8800 REM: initialisation de l'arbre des coups
8820 IF T = 0 THEN 8880
8830 FOR I = 0 TO 4
8840 S(0, I) = S(1, I)
8850 NEXT I
8860 M(0) = M(1)
8870 T = 0
8880 RETURN
9000 REM: execution du coup
9020 T = T + 1
9030 S(T, 0) = 0
9040 FOR I = 1 TO 4
9050 S(T, I) = S(T - 1, I)
9060 NEXT I
9070 M(T) = M(T - 1)
9080 V = Z(Z1, 1)
9090 N = Z(Z1, 2)
9100 IF Z(Z1, 6) = 0 THEN 9160
9110 IF Z(Z1, 3) = 0 THEN 9140
9120 B(Z(Z1, 6)) = 0
9130 GOTO 9430
9140 S(T, 0) = Z(Z1, 6)
9150 GOTO 9430
9160 REM
9170 IF V <> R5(F + 2) THEN 9210
9180 S(T, F + 2) = 0
9190 S(T, F + 3) = 0
9200 GOTO 9360
9210 IF V <> R7(F + 2) THEN 9240
9220 S(T, F + 2) = 0
9230 GOTO 9260
9240 IF V <> R7(F + 3) THEN 9260
9250 S(T, F + 3) = 0
9260 IF N <> R7(-F + 2) THEN 9290
9270 S(T, -F + 2) = 0
9280 GOTO 9310
9290 IF N <> R7(-F + 3) THEN 9310
9300 S(T, -F + 3) = 0
9310 REM
9320 IF Z(Z1, 4) = 0 THEN 9430
9330 B(V) = Z(Z1, 4) * F
9340 M(T) = M(T) + F * (U(Z(Z1, 4)) - 100)
9350 GOTO 9430
9360 REM
9370 RO = Z(Z1, 5)
9380 IF RO = 0 THEN 9430
9390 VO = R7(RO)
9400 B(VO) = 0
9410 NA = (R5(RO) + R6(RO)) * .5
9420 B(NA) = 2 * F
9430 REM
9440 B(N) = B(V)
9450 B(V) = 0
9460 M(T) = M(T) + F * U(Z(Z1, 3))
9470 F = -F
9480 RETURN
9600 REM: reprise de coup
9620 F = -F
9630 V = Z(Z1, 1)
9640 N = Z(Z1, 2)
9650 IF Z(Z1, 6) = 0 THEN 9710
9660 IF Z(Z1, 3) = 0 THEN 9820
9670 B(Z(Z1, 6)) = -F
9680 B(V) = F
9690 B(N) = 0
9700 GOTO 9840
9710 REM
9720 RO = Z(Z1, 5)
9730 IF RO = 0 THEN 9790
9740 NA = (R5(RO) + R6(RO)) * .5
9750 B(NA) = 0
9760 VO = R7(RO)
9770 B(VO) = 2 * F
9780 GOTO 9820
9790 REM
9800 IF Z(Z1, 4) = 0 THEN 9820
9810 B(N) = F
9820 B(V) = B(N)
9830 B(N) = -F * Z(Z1, 3)
9840 T = T - 1
9850 RETURN
10000 REM: recherche alpha-beta
10020 Z2 = 0
10030 C1 = 0
10040 W(0) = -32767
10050 W(1) = -32767
10070 IF T < T0 THEN 10110
10080 GOSUB 12000
10090 W(T + 2) = W * F
10100 GOTO 10380
10110 GOSUB 7000
10120 IF MT = 0 THEN 10150
10130 W(T + 2) = 32767 - T
10140 GOTO 10380
10150 IF G > G1(T) THEN 10190
10160 W(T + 2) = 0
10170 GOTO 10380
10180 REM
10190 P(T) = G1(T)
10200 W(T + 2) = W(T)
10220 Z1 = P(T)
10230 IF T <> 0 THEN 10250
10240 GOSUB 6000
10250 GOSUB 9000
10260 C1 = C1 + 1
10270 GOTO 10070
10290 IF -W(T + 3) <= W(T + 2) THEN 10350
10300 W(T + 2) = -W(T + 3)
10310 IF T > 0 THEN 10340
10320 Z2 = P(T)
10330 PRINT "  NOUVEAU MEILLEUR COUP "; "- VALEUR="; W(2)
10340 IF W(T + 2) >= -W(T + 1) THEN 10380
10350 P(T) = P(T) + 1
10360 IF P(T) < G1(T + 1) THEN 10220
10370 IF W(T + 2) <> -32766 + T THEN 10380
10371 F = -F
10372 GOSUB 7000
10373 F = -F
10374 IF MT = 1 THEN 10380
10375 W(T + 2) = 1 + T
10380 IF T = 0 THEN 10430
10390 Z1 = P(T - 1)
10400 GOSUB 9600
10410 GOTO 10290
10430 W = W(2)
10440 RETURN
12000 REM: fonction d'evaluation
12020 REM: W = 0: RETURN: REM: *** fonction d'evaluation nulle, pour problemes
***
12030 M = 0
12040 W = 0
12050 FOR I = 0 TO 2
12060 T7(I) = 0
12070 BA(I) = 0
12080 FOR J = 0 TO 9
12090 BL(I, J) = 0
12100 TL(I, J) = 0
12110 NEXT J
12120 NEXT I
12140 FOR I = 2 TO 9
12150 FOR J = 1 TO 8
12160 V = I * 10 + J
12170 A = ABS(B(V))
12180 IF A = 0 THEN 12420
12190 FA = SGN(B(V))
12200 M = M + U(A)
12210 ON A GOTO 12220, 12270, 12320, 12360, 12420, 12390
12220 REM
12230 BA(FA + 1) = BA(FA + 1) + 1
12240 BL(FA + 1, J) = BL(FA + 1, J) + 1
12250 W = W + FA * BV(J) * (3.5 - FA * (5.5 - I))
12260 GOTO 12420
12270 REM
12280 IF (I - 5.5) * FA <> 2.5 THEN 12300
12290 T7(FA + 1) = T7(FA + 1) + 1
12300 TL(FA + 1, J) = TL(FA + 1, J) + 1
12310 GOTO 12420
12320 REM
12330 IF (I - 5.5) * FA <> -3.5 THEN 12420
12340 W = W - FA * 10
12350 GOTO 12420
12360 REM
12370 W = W + FA * ZT(I, J)
12380 GOTO 12420
12390 REM
12400 KR(FA + 1) = I
12410 KL(FA + 1) = J
12420 NEXT J
12430 NEXT I
12440 REM
12460 FA = SGN(M(T))
12470 IF FA = 0 THEN 12500
12480 W = W + M(T) + INT(M(T) * BA(FA + 1) / (BA(FA + 1) + 1) * (M0 - M) *
.0001)
12500 REM
12510 W = W + INT(ZT(KR(2), KL(2)) * (43000! - M + M(T)) * .001)
12520 W = W - INT(ZT(KR(0), KL(0)) * (43000! - M - M(T)) * .001)
12550 W = W + T7(2) * T7(2) * 12
12560 W = W - T7(0) * T7(0) * 12
12590 FOR I = 1 TO 8
12600 FOR J = 0 TO 2
12610 FA = J - 1
12620 IF FA = 0 THEN 12880
12630 IF BL(J, I) = 0 THEN 12830
12640 W = W - FA * (BL(J, I) - 1) * 8
12650 IIS = 0
12660 IF BL(J, I - 1) > 0 THEN 12710
12670 IF BL(J, I + 1) > 0 THEN 12710
12690 W = W - FA * 20
12700 IIS = 1
12710 IF BL(2 - J, I) > 0 THEN 12880
12730 W = W - FA * TL(2 - J, I) * TL(2 - J, I) * 3
12740 IF BL(2 - J, I - 1) > 0 THEN 12790
12750 IF BL(2 - J, I + 1) > 0 THEN 12790
12770 W = W + FA * 18
12780 GOTO 12890
12790 REM
12800 IF IIS = 0 THEN 12890
12810 W = W - FA * 10
12820 GOTO 12890
12830 IF BL(2 - J, I) > 0 THEN 12880
12850 W = W + TL(2, I) * TL(2, I) * 8
12860 W = W - TL(0, I) * TL(0, I) * 8
12870 GOTO 12890
12880 NEXT J
12890 NEXT I
12900 RETURN
15000 END





This page took 0.01 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.