Entwickler-Ecke

Open Source Projekte - Mattsuche


Fiete - Di 14.01.14 17:52
Titel: Mattsuche
Das Programm löst Mattprobleme in n Zügen(n<=9) (17 Halbzüge dauern natürlich :wink: )
Einige(46) Aufgaben sind mitgeliefert.
Eine Stellung wird eingegeben durch anklicken der Figur mit anschließendem
Setzen auf dem Brett. Figuren lassen sich mit Rechtsklick löschen,
verschieben ist möglich wenn der D&D-Modus aktiviert ist (Klick aufs Panel).

Ist der Schlüsselzug gefunden, kann dieser per D&D ausgeführt werden,
Schwarz am Zug wird aktiviert, nächste Suche, Zug ausführen,
Weiß ist am Zug, Mattsuche verringern und nächste Suche.
So kann man sich langsam durchackern.

Die meisten Stellungen stammen von
http://de.wikipedia.org/wiki/Schachkomposition

user defined image

Zur Programmierung:
// internes SpielFeld

{
110 111 112 113 114 115 116 117 118 119
100 101 102 103 104 105 106 107 108 109
-----------------------------------
090 | 091 092 093 094 095 096 097 098 | 099
080 | 081 082 083 084 085 086 087 088 | 089
070 | 071 072 073 074 075 076 077 078 | 079
060 | 061 062 063 064 065 066 067 068 | 069
050 | 051 052 053 054 055 056 057 058 | 059
040 | 041 042 043 044 045 046 047 048 | 049
030 | 031 032 033 034 035 036 037 038 | 039
020 | 021 022 023 024 025 026 027 028 | 029
-----------------------------------
010 011 012 013 014 015 016 017 018 019
000 001 002 003 004 005 006 007 008 009
}
Es werden alle legalen Zugkombinationen generiert und im letzten Zug geprüft ob Schachmatt.
Es gibt keine Datenbank oder Hashtabelle.
Viel Spaß beim Testen
Fiete

Rev4: Stellungsauswahl und en Passant Wahlmöglichkeit
Rev5: die Stellungen sind nach Zügen sortiert


Fiete - Fr 17.01.14 15:53

Rev1: en Passant ist implementiert, weitere Beispiele sind hinzugekommen,
der berechnete Schlüsselzug kann durch anklicken ausgeführt werden.
Die Schachnotation wurde verbessert.


GuaAck - Fr 17.01.14 21:21

Hallo Fiete,

hübsches Programm, gut gemacht. Ich habe ein ähnliches Programm vor vielen Jahren gemacht, einige Procedures könnten wir fast austauschen. Somit habe ich Deinen Quellcode auch schnell verstanden.

Und dann habe ich einen Vergleich gemacht:

Zweizüger: Dein Programm war gut schneller.
Fünfzüger: Dein Programm rechnet noch, während ich hier schreibe, meines war nach 1 s fertig. (W: Kc6, Ta7; S: Ke8).

Ich glaube, es ist in dem alpha-beta-Algorithmus ein Denkfehler drin, ganz sicher bin ich mir aber nicht und kann mich auch nicht den ganzen Abend in Deinen Code hinein denken. Man muss ja alpha-beta für jeden Unterbaum anwenden und trotzdem mit dem des TOP-Zuges (jeder Farbe) vergleichen. Mein Code ist diesem Bereich jedenfalls viel umfangreicher, ansonsten haben ich es mit dem rekursiven Aufruf von "SucheZug" ebenso gemacht.

Ist schon eine wirklich interessante Sache!!!

Viel Erfolg weiterhin,

Gruß
GuaAck

P. S.: Schachbrett und Randbuchstaben/Zahlen passen bei mir nicht zueinander, d1 muss weiß sein.


Horst_H - Sa 18.01.14 10:46

Hallo,

Bei mir braucht Brehmer3 108.4 Sekunden und testet 1298452 Stellungen.
Also 12000 Stellungen pro Sekunde.
Das Programm soll doch nur nach Schachmatt suchen und ist in keinster Weise optimiert.
Sollte es auch nicht, um klar verständlich zu bleiben.

Zum Beispiel:

Delphi-Quelltext
1:
function TMattsuche.Weiss_im_Schach(Feld:TSpielFeld):Boolean;                    

das große Feld wird immer wieder kopiert, obwohl es nicht bearbeitet wird.

Delphi-Quelltext
1:
function TMattsuche.Weiss_im_Schach(const Feld:TSpielFeld):Boolean;                    

bringt nur 20%.
Oder der Zuggenerator, in dem ständig Dinge in Zug eingetragen werden, die dort schon drin sind:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
 function NichtErlaubt(i:TFeld;Feld:TSpielFeld):Boolean;
  begin NichtErlaubt:=(Feld[i].Gestalt=illegal) or (Feld[i].Farbe=Amzug) end;

 procedure LaeuferZuege(StartFeld:TFeld;Feld:TSpielFeld;var N:Integer);
  var j,ZugLaenge,ZielFeld:TFeld;
      Zug:TSpielZug;
  begin
   for J:=1 to 4 do
    begin
     ZugLaenge:=1;ZielFeld:=StartFeld+L_Weite[j]*ZugLaenge;
     while Feld[ZielFeld].Gestalt=Leer do
      begin
       Zug.von:=StartFeld;Zug.nach:=ZielFeld;Zug.Entferne:=119;
       Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Amzug;
       inc(N);ZL[N]:=Zug;inc(ZugLaenge);
       ZielFeld:=StartFeld+L_Weite[j]*ZugLaenge;
      end;
     if not NichtErlaubt(ZielFeld,Feld) then
      begin
       Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Amzug;
       Zug.von:=StartFeld;Zug.nach:=ZielFeld;Zug.Entferne:=119;
       inc(N);ZL[N]:=Zug
      end
    end
  end;

Geht auch so :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
 function NichtErlaubt(const a:TFigur):boolean;
 begin
   with a do
     NichtErlaubt := (Farbe=Amzug) OR (Gestalt=illegal);
 end;

 procedure LaeuferZuege(StartFeld:TFeld;const Feld:TSpielFeld;var N:Integer);
  var j,ZugLaenge,ZielFeld:TFeld;
      Zug:TSpielZug;
  begin
    Zug.von:=StartFeld;
    Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Amzug;
    Zug.Entferne:=119;
    for J:=1 to 4 do
    begin
      ZugLaenge:=1;
      repeat
        ZielFeld:=StartFeld+L_Weite[j]*ZugLaenge;
        Zug.nach:=ZielFeld;
        inc(N);
        ZL[N]:=Zug;
        inc(ZugLaenge);
        IF Feld[ZielFeld].Gestalt<> Leer then
          break;
      until false;
      if NichtErlaubt(Feld[Zielfeld]) then
        dec(N);
    end
  end;

Aber das sind wohl nicht die größten Bremsen.
Ich weiß nicht, ob man den Zuggenerator nicht ändern sollte.Zwischen zwei Zügen ändert sich doch nicht viel und damit auch nicht die Zugmöglichkeiten der anderen Figuren.Das ist natürlich ein großer Aufwand, für jedes Feld, die sie erreichenden Figuren zu speichern.Aber es gibt auch nur 32 (Bit) Figuren.Zudem müsste man bei einer Bewegung dann die neuen Möglichkeiten der betroffenen unbewegten Figuren ermitteln.Eine sich bewegende Dame ist ja enormer Aufwand, ein bewegter Bauer fast keiner.
Lange Rede keinen Sinn, man wüßte sofort ob Schach oder nicht.

Gruß Horst


Fiete - Sa 18.01.14 12:19

Moin Horst_H,
das Original ist 1992 unter TP4(DOS) entstanden als ich mich mit Strategieprogrammen beschäftigt habe.
Ich wollte keinen großen Aufwand betreiben :wink:
Es bleibt viel zu optimieren, für mich war wichtig dass der Schlüsselzug gefunden wurde.

@GuaAck: den alpha-beta-Algorithmus habe ich ohne nachzudenken benutzt, das Programm sollte laufen(jetzt hinkt es wohl :roll: )

Gruß Fiete


Horst_H - Sa 18.01.14 12:44

Hallo,

Zitat:
Ich wollte keinen großen Aufwand betreiben

Lohnt auch nicht ;-) "Heute" sind scheinbar 1 Mio/s drin. ( Houdini oder so ähnlich )
Aber es funktioniert.

Gruß Horst


Fiete - Di 28.01.14 12:42

Moin,
habe den Zuggenerator beschleunigt und Rangecheck deaktiviert.
Die Suche läuft jetzt 5x schneller, natürlich kein Houdini :wink:
user defined image
Gruß Fiete


Horst_H - Di 28.01.14 14:02

Hallo,

ganz erstaunlich :zustimm: :
Jetzt bei mir :
459054 Stellungen in 3,69 sek
zuvor
1298452 Stellungen in 108.4 Sekunden
also nur ein Drittel der Stellungen in 1/30 der Zeit.
Das muss ich mir mal genauer anschauen.

Gruß Horst
Edit:
Die Laufzeiten sind enorm schwankend.Zwischen 3.5 bis über 6.6 Sekunden.
Guttman5 46493500 Stellungen in 170 Sekunden
Ich habe mal Lazarus 1.2RC2 probiert. Mit viel Brimborium zwischen 2.8 ( oft 3.2 ) und 9.9 Sekunden.
Wahrscheinlich sind die Energiespareinstellungen von Windows7 rigoros.

Edit2:
Ich hätte nicht auf Energiesparmodus gehen sollen :-(
Nun 2.32 Sekunden für Brehmer3:-)
Nun habe ich die Version geändert.
Zuerst habe ich Zugliste dieses ständige Zuweisen von VirFeld= Feld eliminiert, indem ich nur den Zug selbst wieder rückgängig mache.Das war dann 1.7 Sekunden.
Jeder mögliche Zug wird darauf getestet, ob man sich ins Schach begibt.
Dabei wird jedes mal der König gesucht.Das muss nicht sein.
Ich merke mir die Position des Königs und schon sind es nur noch 1.2 Sekunden oder besser Guttmann5 in 56 Sekunden < 1 min = für ~46.?? Mio Züge = 821428 Züge pro Sekunde ist schon etwas besser.

Gruß Horst


Horst_H - Mi 29.01.14 22:28

Hallo,

das Programm findet für Stellung Loyd5 keine Lösung. Fiete Rev 2 auch nicht nach 644 Sekunden.
Gibt es da dennoch eine?

Gruß Horst


Fiete - Do 30.01.14 13:10

Moin Horst,
es gibt eine Lösung: b2-b4, http://de.wikipedia.org/wiki/Samuel_Loyd
Deine Verbesserungen sind sehr gut, es gibt nichts was man nicht verbessern könnte.
Ich muss noch mal die Bauernzüge und die Bewertung kontrollieren, irgendwo da liegt der Fehler.
Gruß Fiete


Horst_H - Do 30.01.14 14:15

Hallo,

die Verbesserungen sind ja Quelltextmäßig nur marginal, aber fehlerbehaftet.
Manchmal steht der König doch nicht da, wo er eigentlich bei Machzug gespeichert ist.

Ich habe mal fritz 5.32 installiert ( Win98/me kompatibel eingestellt) der saust mit bis zu 20 Mio Knots/s dahin
GuAcks vorgeschlagener 5-Züger ist ja mit Tastendruck erledigt.

Vielleicht sollte man sich die Stellung der Figuren merken, um eine schon geprüfte Stellung vorzeitig abzubrechen.Sicher kommt in der Zugfolge so was vor: wTurm eins links,sTurm eins rechts,wTurm eins rechts,sTurm eins links, <- kann ab hier wegfallen, da Ausgangsposition. Das lohnt wohl nur ab 3 Zügen aufwärts.

Ich bin gespannt, wie man den Fehler bei Loyd5 finden kann.Einfach anzeigen lassen, wann der Zug b2-b4 gemacht wird?

Jedenfalls ist das Programm besser als fpChess ( nicht mal mit Quellcode ) was kein enpassant kennt und einfach mit dem König ins Schach zieht und den Zug zurücknimmt und nicht weiterspielt. Es scheint auch mehr als GUI für Schachserver geplant gewesen zu sein.

Gruß Horst


JoelH - Do 30.01.14 16:16

Hi ihr zwei,

der Fehler (ich habe das Programm runter geladen aus dem ersten Posting) liegt am Zuggenerator. Er erzeugt bei der Bauernumwandlung nicht alle Züge wenn die Verwandlung mit einem Schlagzug kombiniert ist.

Also in dieser Lloydstellung erzeugt er b7-b8D, b7-b8T, b7-b8L und b7-b8S aber dann nur noch b7xa8 und in der Zugliste bleibt die Verwandlung unberücksichtigt. Er lässt auf a8 einen Bauern stehen. Das ist zum einen nicht mal legal. Und da dies der letzte Schlüsselzug ist also b7xa8L# bzw. b7xa8D# findet das Programm das Matt nicht.

Anbei die Schlüsselstellung etwas umgebaut (anstatt Schlagzug mit Umwandlung direkt Umwandlung), da findet er das Matt in 1 sofort.


Horst_H - Do 30.01.14 17:01

Hallo,

das kommt davon, wenn man keine Ahnung vom Schach hat ;-) jedenfalls ich nicht.
Mal schauen, ob ich es einfügen kann.
en passant gibt es in der Reihe aber nicht?

Gruß Horst


Fiete - Do 30.01.14 18:41

Moin Horst,
im Zuggenerator habe ich einiges vergessen, JoelH hat dies gut beschrieben.
Wenn ein Schlagzug in die letzte Reihe erfolgt fehlt die Umwandlung.
Loyd5 wird in 579s mit 127745944 Stellungen gelöst.
die veränderte Prozedure:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
procedure BauernZuege(StartFeld:TFeld;Feld:TSpielFeld;var N:Integer);
   var ZielFeld:TFeld;
       Zug:TSpielZug;
    begin
     if Amzug=Weiss then
      begin
       ZielFeld:=StartFeld+10;
       if Feld[ZielFeld].Gestalt=Leer then
        begin
         Zug.von:=StartFeld;Zug.nach:=ZielFeld;
         if ZielFeld>90 then // Bauernumwandlung
          begin
           Zug.Figur.Gestalt:=Dame;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Turm;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Springer;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end
         else
          begin
           Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end;
         ZielFeld:=StartFeld+20;
         if (StartFeld<39and (Feld[ZielFeld].Gestalt=Leer) then
          begin
           Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Weiss; // zwei Felder vor
           Zug.von:=StartFeld;Zug.nach:=ZielFeld;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end;
        end;
       ZielFeld:=StartFeld+9// eventuell schlagen
       if Feld[ZielFeld].Farbe=Schwarz then
        begin
         if ZielFeld>90 then // Bauernumwandlung
          begin
           Zug.von:=StartFeld;Zug.nach:=ZielFeld;
           Zug.Figur.Gestalt:=Dame;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Turm;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Springer;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end
         else
          begin
           Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Weiss;
           Zug.von:=StartFeld;Zug.nach:=ZielFeld;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end
         end;
       ZielFeld:=StartFeld+11// eventuell schlagen
       if Feld[ZielFeld].Farbe=Schwarz then
        begin
         if ZielFeld>90 then // Bauernumwandlung
          begin
           Zug.von:=StartFeld;Zug.nach:=ZielFeld;
           Zug.Figur.Gestalt:=Dame;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Turm;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Springer;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Weiss;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end
         else
          begin
           Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Weiss;
           Zug.von:=StartFeld;Zug.nach:=ZielFeld;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end
         end;
       // en passant
       if StartFeld in[61..68then
        begin
         if (Feld[StartFeld+11].Gestalt=Leer) and (Feld[StartFeld+21].Gestalt=Leer) then
          begin
           if (Feld[StartFeld+1].Gestalt=Bauer) and (Feld[StartFeld+1].Farbe=Schwarz) then
            begin
             Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Weiss;
             Zug.von:=StartFeld;Zug.nach:=StartFeld+11;
             Zug.Entferne:=StartFeld+1;
             inc(N);ZL[N]:=Zug
            end
           end;
         if (Feld[StartFeld+9].Gestalt=Leer) and (Feld[StartFeld+19].Gestalt=Leer)  then
          begin
           if (Feld[StartFeld-1].Gestalt=Bauer) and (Feld[StartFeld-1].Farbe=Schwarz) then
            begin
             Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Weiss;
             Zug.von:=StartFeld;Zug.nach:=StartFeld+9;
             Zug.Entferne:=StartFeld-1;
             inc(N);ZL[N]:=Zug
            end
          end;
        end;
      end
     else // Schwarz am Zug
      begin
       ZielFeld:=StartFeld-10;
       if Feld[ZielFeld].Gestalt=Leer then
        begin
         Zug.von:=StartFeld;Zug.nach:=ZielFeld;
         if ZielFeld<30 then
          begin
           Zug.Figur.Gestalt:=Dame;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Turm;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Springer;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end
         else
          begin
           Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end;
         ZielFeld:=StartFeld-20;
         if (StartFeld>80and (Feld[ZielFeld].Gestalt=Leer) then
          begin
           Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Schwarz;
           Zug.von:=StartFeld;Zug.nach:=ZielFeld;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug
          end
        end;
       ZielFeld:=StartFeld-9;
       if Feld[ZielFeld].Farbe=Weiss then
        begin
         Zug.von:=StartFeld;Zug.nach:=ZielFeld;
         if ZielFeld<30 then
          begin
           Zug.Figur.Gestalt:=Dame;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Turm;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Springer;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end
         else
          begin
           Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Schwarz;
           Zug.von:=StartFeld;Zug.nach:=ZielFeld;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug
          end;
        end;
       ZielFeld:=StartFeld-11;
       if Feld[ZielFeld].Farbe=Weiss then // hatte ich vergessen
        begin
         Zug.von:=StartFeld;Zug.nach:=ZielFeld;
         if ZielFeld<30 then
          begin
           Zug.Figur.Gestalt:=Dame;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Turm;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Springer;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
           Zug.Figur.Gestalt:=Laeufer;Zug.Figur.Farbe:=Schwarz;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug;
          end
         else
          begin
           Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Schwarz;
           Zug.von:=StartFeld;Zug.nach:=ZielFeld;Zug.Entferne:=119;
           inc(N);ZL[N]:=Zug
          end;
        end;
              // en passant
       if StartFeld in[51..58then
        begin
         if (Feld[StartFeld-11].Gestalt=Leer) and (Feld[StartFeld-21].Gestalt=Leer)  then
          begin
           if (Feld[StartFeld-1].Gestalt=Bauer) and (Feld[StartFeld-1].Farbe=Weiss) then
            begin
             Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Schwarz;
             Zug.von:=StartFeld;Zug.nach:=StartFeld-11;
             Zug.Entferne:=StartFeld-1;
             inc(N);ZL[N]:=Zug
            end
           end;
         if (Feld[StartFeld-9].Gestalt=Leer) and (Feld[StartFeld-19].Gestalt=Leer) then
          begin
           if (Feld[StartFeld+1].Gestalt=Bauer) and (Feld[StartFeld+1].Farbe=Weiss) then
            begin
             Zug.Figur.Gestalt:=Bauer;Zug.Figur.Farbe:=Schwarz;
             Zug.von:=StartFeld;Zug.nach:=StartFeld-9;
             Zug.Entferne:=StartFeld+1;
             inc(N);ZL[N]:=Zug
            end
          end;
        end;
      end
    end;

Gruß Fiete


Horst_H - Do 30.01.14 21:28

Hallo,

ich wußte, dass Bauernbehandlungsroutine viel Zeit frißt: viele Bauern, kuriose Zugmöglichkeiten.
Aber statt 1.21s für Brehmer3 nun 2.68s ist doch etwas happig :-(
Müßte man die komplette Zugfolge nicht in SucheZug in einem Feld speichern können und nicht nur den BestZug,also in einem Feld Zugfolge[ 0..Maxtiefe, TSpieler] of tZug;
Etwa so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TMattsuche.SucheZug ...
..PosKoenige := tmpPosKoenige;
....
        if M < AlphaBeta then
        begin
          M := AlphaBeta;
          ZugFolge[N,Amzug] := Zug
          if N = Tiefe then
            BestZug := Zug;
        end;                
..


Gruß Horst
Das Feld Zugfolge funktioniert wohl nicht. Jetzt wird der Zug gefunden, durch eine Korrektur meiner Bauernumwandlung.
Ich hatte vergessen nach der ganzen Umwandlerei zum Schluß wieder einen Bauern aus der Figur zu machen, damit die nachfolgenden Tests nicht plötzlich mit einem Lauefer durchgeführt werden, zudem musste auch bei enpassant wieder auf entferne wieder auf 119 gesetzt werden.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
  procedure BauernZuege(StartFeld: TFeld; const Feld: TSpielFeld);
  var
    ZielFeld: TFeld;

    procedure Bauernumwandlung;
    begin
      with gblZug do
      begin
        Inc(ZugNr);Figur.Gestalt := Dame;ZL[ZugNr] := gblZug;
        Inc(ZugNr);Figur.Gestalt := Turm;ZL[ZugNr] := gblZug;
        Inc(ZugNr);Figur.Gestalt := Springer;ZL[ZugNr] := gblZug;
        Inc(ZugNr);Figur.Gestalt := Laeufer;ZL[ZugNr] := gblZug;
        // Muss wieder Bauer sein
        Figur.Gestalt := Bauer;
      end;
    end;

  begin
    // Erstmal die Standartbelegung
    with gblZug do
    begin
      von := StartFeld;
      Entferne := 119;
      with Figur do
      begin
        Gestalt := Bauer;// Ist es eigentlich sowieso
        Farbe := Amzug;
      end;
    end;

    if Amzug = Weiss then
...


I


JoelH - Fr 31.01.14 01:26

user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

ich wußte, dass Bauernbehandlungsroutine viel Zeit frißt: viele Bauern, kuriose Zugmöglichkeiten.
Aber statt 1.21s für Brehmer3 nun 2.68s ist doch etwas happig :-(

Die Zeit frisst die Suche, nicht die Zugerzeugung! In diesem Fall ist es natürlich ein wenig anders, da das Programm ja quasi auf Matt getrimt ist und dazu noch die Zugzahl mitgegeben bekommt. Aber andernfalls ist die Suchoptimierung deutlich der Zuggenerierung zu bevorzugen!

user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:

Müßte man die komplette Zugfolge nicht in SucheZug in einem Feld speichern können und nicht nur den BestZug,also in einem Feld Zugfolge[ 0..Maxtiefe, TSpieler] of tZug;

Dazu empfehle ich
http://chessprogramming.wikispaces.com

alleine die Bitboarddarstellungen und Züge via Bitshifting sind grandios (schnell)! bzw. darum ist Houdini 100x schneller als wir.

PS: Interesanterweise habe ich ein Spiel geschrieben das ähnlich wie Schach ist. Ich bekomme aber auch hier nicht signifikant mehr Knoten bewertet. Obwohl die Regeln anders sind, aber die Suche ist AlphaBeta und die Suche bringt ca. 100.000 Züge in der Sekunde zustande. Sprich, es liegt nicht an der Generierung, somdern an der Suche.


Horst_H - Fr 31.01.14 10:00

Hallo,

don't overdo it, nichts übertreiben ;-)
Mir ging es nur darum, mit minimalen Änderungen die Geschwindigkeit zu steigern und nicht das komplette Prinzip des Datenaufbaus zu ändern.
Natürlich wäre es erheblich schneller mit Bitboards Stellungen zu überprüfen, am besten auf einem 64-Bit Betriebssystem.
Wenn Fiete daran Spaß findet, kann er das sicher zügig mit Int64 umsetzen.

Gruß Horst


Horst_H - So 02.02.14 17:07

Hallo,

was ist an der Stellung Albrecht2 so schwer, das nichts gefunden wird?
Als Dreizüger gerechnet kommt das naheliegende wBauer d5-d6+
Ich sehe nicht, wie man den König über 3 Züge retten kann :confused:
Da wäre es schön, wenn man die Zugfolgen ausgeben könnte.Aber wie in SucheZug speichern.

Gruß Horst


Mathematiker - So 02.02.14 17:27

Hallo,
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
was ist an der Stellung Albrecht2 so schwer, das nichts gefunden wird?
Als Dreizüger gerechnet kommt das naheliegende wBauer d5-d6+
Ich sehe nicht, wie man den König über 3 Züge retten kann :confused:

Es ist ein zweizügiges Matt. Der korrekte Zug ist Dg7-e7. Allerdings findet das Programm den Zug nicht.

Das Problem EnPassant3 ist nicht ganz korrekt. Damit ein Programm erkennt, dass es den b5-Bauern schlagen kann, müsste ihm mitgeteilt werden, dass der letzte schwarze Zug b7-b5 ist. Ich frage mich, wo die versteckte Information ist oder genügt schon der Dateiname?
Kennt man den letzten schwarzen Zug dagegen nicht, ist das Problem ein 4-Züger mit der Lösung Sc8-b6.
Ähnliches gilt für EnPassant1.

Auch EnPassant2 funktioniert ohne Zusatzinformation nicht. Die Lösung Kd5-d6 ist nur dann richtig, wenn man sicher weiß, dass Schwarz König und Turm schon gezogen hat. Andernfalls kann Schwarz mit der Rochade 0-0 antworten und entgeht dem zweizügigen Matt.

Beste Grüße
Mathematiker


Fiete - So 02.02.14 19:37

Moin Horst,
In der Stellung Albrecht2 gibt es eine Lösung wenn die e.p. Züge nicht berücksichtigt werden. Eine Checkbox wäre die Lösung. Den letzten schwarzen Zug kann man natürlich nur vermuten(s.Mathematiker).
Deine neue Version ist schön schnell :zustimm:
Gruß Fiete


Mathematiker - So 02.02.14 23:35

Hallo,
die Variante von Horst ist ziemlich schnell, sehr schön.
Ich hänge einmal eines meiner Lieblingsprobleme von Loyd an. Dieser Dreizüger ist eigentlich nicht sonderlich schwierig, hat aber eine interessante Lösung.
Fietes Programm findet b7a8 mit Umwandlung in eine Dame. Das geht aber nicht, da dann Schwarz nicht mehr ziehen kann und die Partie Patt endet.

Beste Grüße
Mathematiker


Horst_H - Mo 03.02.14 00:17

Hallo,

Ich habe enpassant so umgeschrieben.Aus der Stellung selbst kann man den letzten ja Zug nicht erkennen und er wird bei den Stellungen wohl auch nicht angegeben, die in ihren Aufbau auch wie hingestellt und nicht "erspielt" aussehen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
    procedure EnpassantTest;
    //SW ist die Schrittweite zur naechsten Zeile 
    // ZielFeld ist das in der gleichen Reihe benachbarte Feld
    begin
      with Feld[ZielFeld], cBauer[Amzug] do
        //Steht dort ein gegnerischer Bauer
        if (Gestalt = Bauer) and (Farbe = Opponent) then
          // koennte der mit einem Doppelschritt dorthin gelangt sein
          if (Feld[ZielFeld + Sw].Gestalt = Leer) and
            (Feld[ZielFeld + 2*SW].Gestalt = Leer) then
          begin
            Inc(ZugNr);
            //den gegnerischen Bauern entfernen
            gblZug.Entferne := ZielFeld;
            gblZug.nach := ZielFeld + SW;//Auf den Platz davor stellen
            ZL[ZugNr] := gblZug;
          end;
    end;


wDame g7-e7 -> sBauer g4xh3 e.p und es dauert länger, weil der König ein bisschen Platz bekommt.

Man kann die Suche, ob man sich selbst mit einem Zug ins Schach begibt, bei der Erstellung der ZugListe etwas verbessern.
Zu Beginn einmal komplett untersuchen.Stehe ich schon im Schach, muß ich wohl erst einmal jeden Zug komplett untersuchen.
Steht man nicht im Schach wird es einfacher.
Wenn man nicht den König selbst bewegt muss man nur den Quadranten, der aus dem König (= Ursprung ) und der bewegten Figur besteht untersuchen.
Dann ergeben sich schöne Dinge wie:
Gegnerische Springer brauche ich nicht untersuchen.
Nur wenn König und Figur auf einer Diagonale liegen, kann dort eine Dame oder Läufer der "hinter" der bewegten Figur liegt gefährlich werden.Das gleiche gilt für Zeile oder Spalte, mit Dame und Turm.
Maximal eine Richtung Zeile oder Spalte oder Diagonale muss untersucht werden.
Das könnte ein wenig Zeit sparen.

zu loyd3:
Da stimmt wohl was mit der Programmlogik von Patt nicht.Heute nicht mehr ...

Gruß Horst


Horst_H - Di 04.02.14 10:53

Hallo,

Bei Loyd3 ergibt sich etwas merkwürdiges, der König stellt sich frech ins Schach, wird aber nicht geschlagen.
(über 50000 Zeilen im Memo )
wDame b7 - b8/sKönig h1 x g2/wTurm e1 - a1/sLäufer g1 - c5/wKönig h4 - g5/
Das dies in meiner Version passiert, könnte an einer falschen Zuweisung, wo die Könige gerade sind, liegen, aber bei Fietes Original wird doch der König jedesmal gesucht. :?:
Wird sich schon finden...

Gruß Horst


Fiete - Di 04.02.14 18:26

Moin Mathematiker,
in der Prozedur SucheZug muss eine kleine Änderung eingebaut werden:

Delphi-Quelltext
1:
if (N=0or Schwarz_im_Patt(F,Amzug)then AlphaBeta:=Wert(F,Amzug)                    

jetzt wird der Bauer in einen Springer umgewandelt.
Gruß Fiete


Horst_H - Di 04.02.14 22:08

Hallo,

ich hoffe, ich habe es richtig eingebaut.
Die Speicherung des Spielzuges stimmt immer noch nicht.
Ich habe die Handhabung etwas geändert.
Wenn man den Zug spielt, wird automatisch die Spielfarbe umgeschaltet und man kann mittels <Enter> eine Erwiderung anzeigen lassen.
SpinEdit habe ich entfernt.Plötzlich meckert Turbo Delphi drüber.
Die Laufzeiten nehmen schlagartig zu, da erheblich öfter (~ 80% ) GenZugListe aufgerufen wird.

Gruß Horst


Mathematiker - Di 04.02.14 23:16

Hallo,
wahrscheinlich bin ich wohl hier der "Nörgler". Es tut mir auch leid, aber das angehängte Problem "alpha5" wird gar nicht gelöst, jeden Falls war nach 15 Minuten keine Lösung da.

Der Name "alpha5" kommt von der mathematischen DDR-Schülerzeitschrift "Alpha", wo viele Schachprobleme veröffentlicht wurden, allerdings ohne Angabe des Entwicklers.
Die korrekte Lösung wäre d7-d8=L mit Mattdrohung Lf6, was mein eigenes Programm nach 9s auswarf.
Die weitere Zugfolge ist zwangsweise - Td6xd8 ; c7xd8=L - Td2xd8 ; b7-b8=L - Td8xb8 ; a7xb8=L - Lg8xf7 und Matt mit Lb8xe5+.

Beste Grüße
Mathematiker


Horst_H - Mi 05.02.14 10:57

Hallo,

falscher Fehler von mir :-(
Ich hatte in .Wert
IF (Amzug= schwarz) AND Schattmatt(Felf,schwarz) then
Ohne (Amzug= schwarz) klappt es.
Ich denke, man müßte nur noch auf Schwarz_Im_Schach testen, den es wird zuvor immer auf Schwarz_im_Patt getestet, dann wäre der wäre GenZugliste etwas weniger häufig aufzurufen.

Gruß Horst
Edit:
Ich habe es mal eingebaut. Damit sind es nun 0.27 Sekunden für Brehmer3 ( nur noch ~1E5 Stellungen zu prüfen) und fast 68 Sekunden für alpha5.
Wenn mathematikers Version das schon in 9 Sekunden erledigt, läuft hier etwas grundsätzlich falsch.
Selbst ohne Bitboard würde ich jeder Figur ihr Koordinaten zuordnen und ob sie den König überhaupt bedroht und könnte, also Dame auf selber Diagonale/Zeile/Spalte oder Bauer eine Reihe dahinter oder so ähnlich.
Wenn ich die Zugliste damit generieren fallen dann enorm viele Dinge innerhalb des Tests auf Schach weg und verkürzen sich auf relevante Richtungen.


Mathematiker - Mi 05.02.14 20:02

Hallo Horst,
ich werde mir Dein Programm sofort ansehen.

Ohne Fiete Konkurrenz machen zu wollen, habe ich unter http://www.entwickler-ecke.de/viewtopic.php?p=683974#683974 jetzt mein ganzes Schachprogramm angehängt, d.h. auch den Teil zum Problemschach.
Mit diesem Programm habe ich die genannten 9s für alpha5 erreicht.
Die Erklärung des Programmteils findest Du im genannten Link.

Beste Grüße
Mathematiker


Fiete - Do 06.02.14 15:13

Moin Mathematiker,
Du sorgst indirekt für Verbesserungen bei Horst und mir.
Dein Schachprogramm habe ich schon im Programm "bhv Winfunktion Mathematik plus 17" benutzt,
der Zugriff auf die beigefügten Stellungen wäre schön, dann könnte ich sie konvertieren.
"alpha5" bereitet mir ein Problem, ich habe den ersten Zug per Hand erledigt.
Matt in 4 Zügen wird in 2,5s errechnet.
Jetzt muss ich nach der Ursache suchen die das Finden des Schlüsselzuges verhindert.

Gruß Fiete


Horst_H - Do 06.02.14 15:36

Hallo,

meine angepasste Version von gestern hat die Stellung alpha 5 auch dabei und löst sie auch, aber es dauert über eine Minute.
http://www.entwickler-ecke.de/download.php?id=16357
Ohne HexEditor kann man wohl nichts machen, aber vielleicht verrät Mathematiker den Aufbaus der *.c00 Datei.

Gruß Horst


Mathematiker - Do 06.02.14 16:07

Hallo,
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
..., aber vielleicht verrät Mathematiker den Aufbaus der *.c00 Datei.

Selbstverständlich.
Es ist nur eine gezipte Textdatei, im Anhang als txt. Der Aufbau ist einfach.
Jedes Problem:
1.Zeile: Entwickler, Jahr, Anzahl Züge
2.Zeile: Anzahl Züge als ganze Zahl
3.Zeile: Anfangsstellung als String, beginnend links oben bei A8 reihenweise bis links unten bei H1.
Allerdings ist zu beachten, dass ich die englische Abkürzung wähle, d.h.
R für rook = Turm , K für knight = Springer , B für Bishop = Läufer, Q für queen = Dame , K für king = König und P für pawn = Bauer.
Großbuchstaben sind weiße Figuren, Kleinbuchstaben schwarze.

Beste Grüße
Mathematiker


Hochhaus - Sa 08.02.14 19:06

Ich habe das Programm ausprobiert. Eine Super-Leistung !

Zwei Sachen sind mir aufgefallen, die man noch verbessern könnte: Es können mehrere gleichfarbige Könige aufs Brett gesetzt werden. Und: Eine Pattsituation, in der der schwarze König nicht mehr ziehen kann, wird als Matt eingestuft.

Grüsse,


Hochhaus


Horst_H - Sa 08.02.14 23:58

Hallo,

Zitat:
Eine Pattsituation, in der der schwarze König nicht mehr ziehen kann, wird als Matt eingestuft.

wenn Du meine letzte Version benutzt hast, wäre das mein Logik-Fehler in der.
Kannst Du mir ein kleines Beispiel geben, wo dem so ist?

Gruß Horst


Hochhaus - So 09.02.14 10:02

Weiss: Ke6, Df2
Schwarz: Kh8

Matt in zwei Zügen: Lösung: Df7 --> Patt


Hochhaus


Edit: Sorry. War nicht die neuste Version, sondern die zweitneuste. Jetzt funktioniert es.


Horst_H - So 09.02.14 17:51

Hallo,

wenn es funktioniert, dann ist es ja gut.Aber user profile iconMathematikers Version ist noch 11x schneller ( unter Win7 )und user profile iconGuaAcks ~ 2,5-fach.
Das muss nicht sein ;-)

Gruß Horst


Fiete - Mi 12.02.14 12:51

Moin,
habe jetzt die Stellungen von user profile iconMathematikerintegriert.
user defined image
Die Suchgeschwindigkeit muss ich noch verbessern :wink:
Gruß Fiete


Horst_H - Do 13.02.14 10:42

Hallo,

ich habe mal alpha 1987 ( 6 Züge ) probiert.
Da wird keine Lösung gefunden:
wKoenig f3-g4 und dann w i6 x d0 e.p. :?:
Ist das Feld nicht richtig initialisiert? i6 müsste Gestalt=illegal sein.Aber dann d0?
Die Version vom 2.2. findet keinen Zug.
Es wäre doch eine schöne Sache, die vorgegebene Liste an Stellungen nach Zugzahl zu sortieren.
Hilfreich wäre auch ein Testablauf, in dem der Lösungszug angegeben ist.
Alles nicht so einfach ;-) Nachher habe ich das falsche eingegeben, dennoch i6 sollte irgendwie nicht vorkommen.

Gruß Horst


Fiete - Do 13.02.14 15:55

Moin Horst_H,
habe die gleichen Ergebnisse erhalten.
Nachdem ich selbst gespielt habe(ich war Schwarz), war ich in 3 Zügen matt!
Im Programm geändert, schon kam die richtige Lösung.
Es sind wohl nicht alle Schachprobleme korrekt, z.B. Troitzky 1951 (1 Zug)
Deinen Vorschlag die Liste nach Zügen zu sortieren werde ich überdenken.
Gruß Fiete


Horst_H - Fr 14.02.14 11:42

Hallo,

eine neue Version von mir.
Ich habe ja innerhalb von GenZugListe den Test auf Patt und Schachmatt eingebaut.
Dadurch konnte ich ja in SucheZug auch die Erstellung der neuen Zugliste vorziehen, wodurch GenZugliste nur noch in 25% der Fälle aufgerufen wurde.
Dann kam mir die Idee, ich muss ja nicht auf Patt testen, sondern einfach auf Anzahl der möglichen Züge = 0, da ist Patt sowie Schachmatt enthalten.
Dummerweise spielt dann aber das Programm für schwarz völlig idiotisch.Ein Fünfzüger wird zum Zweizüger ( Buehler5 )
wDame g4-d7/ sBauer e7-e6/ wDame d7-d6 # :-(

Gruß Horst


Mathematiker - Fr 14.02.14 15:10

Hallo,
user profile iconFiete hat folgendes geschrieben Zum zitierten Posting springen:
Es sind wohl nicht alle Schachprobleme korrekt, z.B. Troitzky 1951 (1 Zug) ...

Tut mir leid. Die zwei Einzüger und der 12-Züger sind garantiert nicht richtig.

Beste Grüße
Mathematiker


Fiete - Fr 14.02.14 18:52

Moin,
die Liste der Stellungen ist jetzt nach Zügen geordnet.
Den Einzüger von Trotzky 1951 hab ich um einem weißen Turm ergänzt, jetzt wird in einem Zug matt gesetzt.
Gruß Fiete


Fiete - So 16.02.14 14:48

Moin,
das Programm findet für Schwarz nicht den besten Zug
Bühler 5:
1.Dd7! droht Se4 matt und Dd5 matt
1. - Txe5
2.cxd3 - droht d4 matt
2. - Sf5
3.d4+ Sxd4 Block
4.Dd5+! Txd5 Block
5.Se4 matt
für Weiß schon!
Ich habe die schwarzen Züge per d&d selbst gesetzt, dann geht's.

Wenn in einer Stellung Züge wie i6 auftauchen, ist das ein Zeichen dafür das die Suchtiefe zu groß ist,
Schwarz ist schon vorher Matt!
Gruß Fiete


Horst_H - So 16.02.14 21:31

Hallo,

Zitat:
Wenn in einer Stellung Züge wie i6 auftauchen, ist das ein Zeichen dafür das die Suchtiefe zu groß ist,

Das mag sein, das es "Verzweiflungszüge" sind, aber i6 dürfte schlicht gar nicht auftauchen, das ist rechts neben dem Brett als Startfeld, das ist doch ein "Das geht ja gar nicht"
Ich mache mal in GenZugListe eine Prüfung rein.

Gruß Horst


Fiete - Mo 17.02.14 15:19

Moin Horst,
habe die Compilerüberwachung auf R+,Q+ gesetzt, dies gab einen Range-Check-Error bei Bühler 5
Gruß Fiete


Horst_H - Mo 17.02.14 20:55

Hallo,

ich habe in MachZug einen Test auf Gültigkeit der Position gemacht in GenZugliste, bei der die Züge auch eigene Schachfreiheit getestet werden.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
   N:=0;
   Liste:=ZL;
   for K:=1 to ZugZahl do
    begin
     With ZL[k] do
     begin
        // 0..19+100..119-> 0,1 + 10,11
        IF (((nach DIV 10MOD 10IN[0..1then
          showmessage(Format('von %d nach %d Gestalt %d',[von,nach,Ord(Figur.Gestalt)]));
        // Spalte 0 und 9 -> 1,10 Mod 10 -> 1,0  
        IF ((nach+1MOD 10IN[0..1then
          showmessage(Format('von %d nach %d Gestalt %d',[von,nach,Ord(Figur.Gestalt)]));
     end;

Dabei kommt keine Fehlermeldung.
Du hast ja auch eine Zugvorbelegung beim Aufruf von SucheZug gemacht, um da Ungemach zu verhindern.
Es ist schon eine Krux, wenn die Zugzahl zu groß gewählt ist. Polster 2002 ( 5 Züge) ist scheinbar ein 4-Züger.
der schwarze König ist gefesselt und bleibt es.Übersehe ich da was?
wKönig g5-f5
sBauer e7-e6+

wKönig f5-f4
sBauer e6-e5+

wKönig f4-e3
sBauer e5-e4

wDame b4-d4#

Gruß Horst
EDIT oder
wKönig g5-f5
sBauer e7-e5 Bauer rauscht vorbei

wLaeufer d7-b5
sBauer e5-e4

wDame b4-c3
sKönig d5-d6

wDame c3-e5#


Fiete - Di 18.02.14 19:28

Moin,
du hast nichts übersehen, matt in 4 Zügen.
Wenn wLäufer d7-c8 setzt, dann ist es ein Matt in 5 Zügen.
Gruß Fiete


Horst_H - Di 18.02.14 19:36

Hallo,

dann muss user profile iconMathematiker sein Programm etwas überarbeiten oder uns den genialen Zug zeigen, sodass es doch 5 Züge braucht
In seinem Programm Problem 54, wenn ich es recht erinnere.

Gruß Horst


Mathematiker - Di 18.02.14 22:23

Hallo,
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
dann muss user profile iconMathematiker sein Programm etwas überarbeiten oder uns den genialen Zug zeigen, sodass es doch 5 Züge braucht

Da werde ich wohl den Fehler suchen müssen. Es liegt am Königszug. Mehr weiß ich aber noch nicht.

Beste Grüße
Mathematiker