REM korresponderende felter i skak. REM REM Kilder: Schach+Mathematik (s.28) af J.Gik REM PLY 1993/1 s. 27 REM CSS 1993/2 s. 16 REM REM Brugt til artikel i Skakbladet marts 1994 REM REM Ka1,b5,b6,e4,e5,g3/Kh8,b7,e6,g4. REM Hvid er i tr‘kket. REM i denne stilling kan kun kongerne flytte. REM hvid vinder ved at komme til d6 eller g4. REM kan han det? REM og hvordan? REM dette program starter ved gevinststillingerne REM og arbejder sig bagl‘ns med retrograd analyse. REM REM resultatet udskrives til sidst. REM REM Dette program blev lavet til en udf›rlig omtale af ovenn‘vnte studie REM i det danske skakblad marts 1994. REM /Jens B‘k Nielsen CLEAR , 110000: REM dette giver mere plads til variable PRINT "bytes free in the heap:"; FRE(-1) PRINT "bytes never used in stack:"; FRE(-2) PRINT "bytes free for the program:"; FRE(0) DEFINT B-Z: REM INT-variable fylder mindre og eksekverer hurtigere tottv = 0 DIM kingmove%(8) DIM wok%(119) DIM bok%(119) REM Der bruges en standardtabel med 120 elementer (0-119), REM som er opdelt i 10x12 REM Derved kan man n›jes med 1 indeks i.s.f. 2 indeks. DIM wwin%(119, 119) DIM blose%(119, 119) PRINT "after DIM: bytes free for the program:"; FRE(0) kingmove(1) = -11 kingmove(2) = -10 kingmove(3) = -9 kingmove(4) = -1 kingmove(5) = 1 kingmove(6) = 9 kingmove(7) = 10 kingmove(8) = 11 atime = TIMER a1 = 21: b1 = 22: c1 = 23: d1 = 24: e1 = 25: f1 = 26: g1 = 27: h1 = 28 a2 = 31: b2 = 32: c2 = 33: d2 = 34: e2 = 35: f2 = 36: g2 = 37: h2 = 38 a3 = 41: b3 = 42: c3 = 43: d3 = 44: e3 = 45: f3 = 46: g3 = 47: h3 = 48 a4 = 51: b4 = 52: c4 = 53: d4 = 54: e4 = 55: f4 = 56: g4 = 57: h4 = 58 a5 = 61: b5 = 62: c5 = 63: d5 = 64: e5 = 65: f5 = 66: g5 = 67: h5 = 68 a6 = 71: b6 = 72: c6 = 73: d6 = 74: e6 = 75: f6 = 76: g6 = 77: h6 = 78 a7 = 81: b7 = 82: c7 = 83: d7 = 84: e7 = 85: f7 = 86: g7 = 87: h7 = 88 a8 = 91: b8 = 92: c8 = 93: d8 = 94: e8 = 95: f8 = 96: g8 = 97: h8 = 98 REM F›rst markeres hvor hvid konge m† g†, derefter sorts. FOR z = a1 TO h1: wok(z) = 1: NEXT z FOR z = a2 TO h2: wok(z) = 1: NEXT z FOR z = a3 TO e3: wok(z) = 1: NEXT z FOR z = a4 TO d4: wok(z) = 1: NEXT z wok(f4) = 1: wok(g4) = 1: wok(a5) = 1: wok(c5) = 1: wok(d6) = 1 FOR z = g5 TO h5: bok(z) = 1: NEXT z FOR z = g6 TO h6: bok(z) = 1: NEXT z FOR z = d7 TO h7: bok(z) = 1: NEXT z FOR z = a8 TO h8: bok(z) = 1: NEXT z move = 2: tv = 0 wk = d6 FOR bk = g5 TO h5: GOSUB wsetlose: NEXT bk FOR bk = g6 TO h6: GOSUB wsetlose: NEXT bk FOR bk = f7 TO h7: GOSUB wsetlose: NEXT bk FOR bk = a8 TO h8: GOSUB wsetlose: NEXT bk wk = g4 FOR bk = g6 TO h6: GOSUB wsetlose: NEXT bk FOR bk = d7 TO h7: GOSUB wsetlose: NEXT bk FOR bk = a8 TO h8: GOSUB wsetlose: NEXT bk PRINT move - 1; "= dybde", tv; "stillinger tabt med sort i tr‘kket" WHILE tv > 0 PRINT move - 1; "= dybde", TIMER - atime; " sekunder " tottv = tottv + tv tv = 0: move = move + 1 FOR bk = g5 TO h8 IF bok(bk) = 1 THEN FOR wk = a1 TO d6 IF wok(wk) = 1 AND blose(wk, bk) < 1 THEN q = 0 IF wk = f4 OR wk = g4 OR wk = d6 THEN FOR x = 1 TO 8 IF wk + kingmove(x) = bk THEN q = 1: REM Kongerne st†r ved siden af hinanden END IF NEXT x END IF IF q = 0 THEN IF wwin(wk, bk) = 0 THEN wwin(wk, bk) = -1: REM A.h.t. udskrift markeres lovlige stillinger END IF z = 0 FOR x = 1 TO 8 bk2 = bk + kingmove(x) IF bok(bk2) = 1 THEN IF wwin(wk, bk2) > 0 AND wwin(wk, bk2) < move THEN z = z + 1 ELSE x = 8 END IF ELSE z = z + 1 END IF NEXT x IF z = 8 THEN GOSUB setlose END IF END IF END IF NEXT wk END IF NEXT bk PRINT move - 1; "= dybde", tv; "stillinger tabt med sort i tr‘kket" WEND PRINT TIMER - atime; " sekunder ialt ", tottv; " stillinger ialt" INPUT "Tryk RETURN for at se print p† sk‘rmen", dum$ PRINT PRINT "********** For at holde remis skal sort g† til:" FOR wk = a1 TO d6 IF wok(wk) = 1 THEN f = wk: GOSUB bogtal PRINT "Hvid konge st†r p† "; flt$; ":" FOR bk = g5 TO h8 IF wwin(wk, bk) = -1 THEN f = bk: GOSUB bogtal PRINT ; flt$; " "; END IF NEXT bk PRINT END IF NEXT wk PRINT PRINT "********** For at vinde skal hvid g† til:" FOR bk = g5 TO h8 IF bok(bk) = 1 THEN f = bk: GOSUB bogtal w = 0 PRINT "Sort konge st†r p† "; flt$; ":" FOR wk = a1 TO d6 IF blose(wk, bk) > 0 THEN IF w > 7 THEN w = 0 PRINT END IF w = w + 1 f = wk: GOSUB bogtal PRINT ; flt$; " ("; blose(wk, bk) - 1; ") "; IF (blose(wk, bk) - 1) < 10 THEN PRINT ; " "; END IF END IF NEXT wk PRINT END IF NEXT bk INPUT "Tryk RETURN for at printe f›rste del", dum$ LPRINT LPRINT "********** For at holde remis skal sort g† til:" FOR wk = a1 TO d6 IF wok(wk) = 1 THEN f = wk: GOSUB bogtal LPRINT "Hvid konge st†r p† "; flt$; ":" FOR bk = g5 TO h8 IF wwin(wk, bk) = -1 THEN f = bk: GOSUB bogtal LPRINT ; flt$; " "; END IF NEXT bk LPRINT END IF NEXT wk INPUT "Tryk RETURN for at printe sidste del", dum$ LPRINT LPRINT "********** For at vinde skal hvid g† til:" FOR bk = g5 TO h8 IF bok(bk) = 1 THEN f = bk: GOSUB bogtal w = 0 LPRINT "Sort konge st†r p† "; flt$; ":" FOR wk = a1 TO d6 IF blose(wk, bk) > 0 THEN IF w > 7 THEN w = 0 LPRINT END IF w = w + 1 f = wk: GOSUB bogtal LPRINT ; flt$; " ("; blose(wk, bk) - 1; ") "; IF (blose(wk, bk) - 1) < 10 THEN LPRINT ; " "; END IF END IF NEXT wk LPRINT END IF NEXT bk END wsetlose: REM De to startstillinger er ogs† vundne med hvid i tr‘kket. REM I denne stilling betyder det dog intet at lave denne markering, REM da sort hverken kan g† til d6 eller g4. wwin(wk, bk) = move - 1 GOSUB setlose RETURN setlose: REM Her markeres stillinger, det er tabt for sort med sort i tr‘kket. REM Alle de lovlige stillinger, som med et hvidt tr‘k f›rer til REM denne stilling, markeres som vundne med hvid i tr‘kket. tv = tv + 1 blose(wk, bk) = move FOR x = 1 TO 8 wk2 = wk + kingmove(x) IF wok(wk2) = 1 THEN IF wwin(wk2, bk) < 1 THEN q = 0 IF wk2 = f4 OR wk2 = g4 OR wk2 = d6 THEN FOR s = 1 TO 8 IF wk2 + kingmove(s) = bk THEN q = 1 END IF NEXT s END IF IF q = 0 THEN wwin(wk2, bk) = move END IF END IF END IF NEXT x RETURN bogtal: REM Her omregnes f.eks. f=74 til flt$="d6" flt$ = MID$("abcdefgh", f MOD 10, 1) + RIGHT$(STR$((f \ 10) - 1), 1) RETURN