Matroids Matheplanet Forum Index
Moderiert von matroid
Matroids Matheplanet Forum Index » Problemschach » Endspiele König Turm gegen König - wieviele Matt in 0,1,2 Zügen Stellungen
Thema eröffnet 2019-10-28 00:54 von Delastelle
Seite 2   [1 2]   2 Seiten
Autor
Kein bestimmter Bereich J Endspiele König Turm gegen König - wieviele Matt in 0,1,2 Zügen Stellungen
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.40, eingetragen 2019-11-04

Ich glaube, die Aussage "man kann in max. 16 Zügen mattsetzen", bezieht sich darauf, dass es Stellungen mit Schwarz am Zug gibt, bei denen sich Schwarz noch 32 Halbzüge, also 16 Züge halten kann.


   Profil
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 8300
Wohnort: Milchstraße
  Beitrag No.41, eingetragen 2019-11-04

Hallo, es gibt ja insgesamt 64*63*62 Möglichkeiten, die drei Figuren aufs Brett zu setzen. Wenn Weiß am Zug ist, darf Schwarz nicht im Schach stehen. Für letzteres gibt es nach meinen Berechnungen 76328 Möglichkeiten. (Kann das jemand bestätigen?) Folglich gibt es 64*63*62 - 76328 = 173656 mögliche Stellungen, in denen Weiß (in wie vielen Zügen auch immer) den schwarzen König matt setzen kann. Wenn ich die ungeraden Zeilen aus #33 (Delastelle) addiere, komme ich aber auf 177968 Wenn ich die ungeraden Zeilen aus #32 (Gonz) addiere, komme ich auf 175168. [Die Antwort wurde nach Beitrag No.39 begonnen.]


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.42, eingetragen 2019-11-04

Ich habe folgende Summen: \sourceon 64^3 = 262144 In 12160 Situationen kollidieren die Positionen der Figuren, In 26040 Situationen geben die Koenige einander Schach. Damit koennen noch 223944 Situationen wirklich aufs Brett kommen In 22176 Situationen erzwingt Schwarz am Zug remis, indem er den Turm schleagt, in 68 Situationen ist Schwarz am Zug patt, in 216 Situationen ist Schwarz matt gesetzt und kann somit nicht am Zug sein. In 48776 Situationen kann Weiss nicht am Zug sein, da Schwarz im Schach steht. Damit sind fuer Weiss jeweils 175186 Situationen zu pruefen. \sourceoff ( Fehler in der Zahl der Zugmöglichkeiten für Weiss korrigiert, der Wert passt jetzt von der von StrgAltEntf gezählten Anzahl der Positionen in meinem Post )


   Profil
AnnaKath
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.12.2006
Mitteilungen: 3751
Wohnort: hier und dort (s. Beruf)
  Beitrag No.43, eingetragen 2019-11-04

Huhu zusammen, ohne jetzt zuviel Salz in die Suppe streuen zu wollen; es sollte meinem Verständnis noch eine Reihe weiterer Positionen geben - es ist nämlich möglich, dass Weiss noch Rochaderechte besitzt! lg, AK.


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 2320
  Beitrag No.44, vom Themenstarter, eingetragen 2019-11-04

Hallo, @gonz (Beitrag 39) \showon Matt in 4 Zügen (Schwarz am Zug); WK auf C2 (Feld 7/3), Verteilung von WT merk( 1) = 0 // A8 merk( 2) = 0 // B8 merk( 3) = 1 merk( 4) = 1 merk( 5) = 1 merk( 6) = 1 merk( 7) = 1 merk( 8) = 1 merk( 9) = 0 merk( 10) = 0 merk( 11) = 1 merk( 12) = 1 merk( 13) = 1 merk( 14) = 1 merk( 15) = 1 merk( 16) = 1 merk( 17) = 0 merk( 18) = 0 merk( 19) = 1 merk( 20) = 1 merk( 21) = 1 merk( 22) = 1 merk( 23) = 1 merk( 24) = 1 merk( 25) = 0 merk( 26) = 0 merk( 27) = 1 merk( 28) = 1 merk( 29) = 1 merk( 30) = 1 merk( 31) = 1 merk( 32) = 1 merk( 33) = 0 merk( 34) = 1 merk( 35) = 1 merk( 36) = 1 merk( 37) = 1 merk( 38) = 1 merk( 39) = 1 merk( 40) = 1 merk( 41) = 0 merk( 42) = 1 merk( 43) = 1 merk( 44) = 1 merk( 45) = 1 merk( 46) = 1 merk( 47) = 1 merk( 48) = 1 merk( 49) = 0 merk( 50) = 0 merk( 51) = 0 merk( 52) = 1 merk( 53) = 1 merk( 54) = 1 merk( 55) = 1 merk( 56) = 1 merk( 57) = 0 merk( 58) = 1 merk( 59) = 1 merk( 60) = 2 merk( 61) = 2 merk( 62) = 2 merk( 63) = 2 merk( 64) = 2 // H1 \showoff Vielleicht erkennst Du ja welche Stellungen du mehr hast... Zur Anzahl der Stellungen: Ich habe (wie schon früher erwähnt) az = 447888 Stellungen Dies sind Stellungen in denen die Könige legal zueinander stehen, der Turm auf einem leeren Feld steht und das mal 2 - jede Stellung 1x für Weiß am Zug und 1x für Schwarz am Zug. Siehe Stellung aus Beitrag 31 (Schwarz am Zug: Remis/Patt, Weiß am Zug Matt in 3 (Halb)zügen) Eine mögliche Rochade habe ich nicht mit eingerechnet. Zur Rochade: man könnte wohl noch ermitteln, ob Weiß oder Schwarz einen Vorteil/Nachteil durch eine Rochade hat. Wieviele Züge man zum Gewinn braucht, sieht man wohl am besten wenn die Endspielberechnung fertig ist. Bei Wiki/Schacharena (der Link Beitrag 4) zeigt wohl nicht optimales Spiel für Weiß und Schwarz. Viele Grüße Ronald


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.45, eingetragen 2019-11-05

\quoteon(2019-11-04 22:46 - AnnaKath in Beitrag No. 43) Huhu zusammen, ohne jetzt zuviel Salz in die Suppe streuen zu wollen; es sollte meinem Verständnis noch eine Reihe weiterer Positionen geben - es ist nämlich möglich, dass Weiss noch Rochaderechte besitzt! lg, AK. \quoteoff Das ist ein hervorragender Einwand :) Es wäre mal nett eine Situation zu konstruieren, bei der Weiss dadurch schneller matt setzen kann... PS.: Das Recht zu rochieren muß ja, wenn es noch besteht, im ersten Zug von Weiß in Anspruch genommen werden. Damit ist die Anzahl der zu betrachtenden Möglichkeiten recht überschaubar. PPS.: In Stellungen, in den Schwarz im Schach steht, kann Weiss am Zug das Rochaderecht auch nicht mehr haben, da ja der weisse Turm gezogen haben muß, um Schach zu geben.


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.46, eingetragen 2019-11-05

@Delastelle: Bezogen auf 4 Halbzuege, also Schwarz am Zug, wK auf c2 Ich habe jeweils 2 Möglichkeiten für den Turm auf d2,e2,f2,g2 und h2 zB. für wT auf d2: wK:c2 sK:a1 wT:d2 wK:c2 sK:a2 wT:d2


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 2320
  Beitrag No.47, vom Themenstarter, eingetragen 2019-11-05

Hallo, die beiden Stellungen von eben sind: https://www.matheplanet.de/matheplanet/nuke/html/uploads/b/15578_Endspiel_KT_K_Matt4a.jpg https://www.matheplanet.de/matheplanet/nuke/html/uploads/b/15578_Endspiel_KT_K_Matt4b.jpg Bei mir wurde die Stellung mit dem schwarzen König in der Ecke nicht erkannt(Wert -1000 oder undefiniert) - mal sehen ob ich das beheben kann. Viele Grüße Ronald Edit: Da war ein Fehler mit der Bestimmung ob der schwarze König im Schach steht (anderswo im Programm schon verbessert...) Matt 0 bis Matt in 4 stimmen jetzt überein - nur noch endlich viele Fehler ... :-) \showon Matt in 0 bis Matt in 32 Matt : 0 216 27.0000000000 Matt : 1 1512 189.000000000 Matt : 2 624 78.0000000000 Matt : 3 4676 584.500000000 Matt : 4 1948 243.500000000 Matt : 5 4412 551.500000000 Matt : 6 648 81.0000000000 Matt : 7 1900 237.500000000 Matt : 8 1584 198.000000000 Matt : 9 4824 603.000000000 Matt : 10 3768 471.000000000 Matt : 11 9020 1127.50000000 Matt : 12 4728 591.000000000 Matt : 13 11416 1427.00000000 Matt : 14 5444 680.500000000 Matt : 15 17364 2170.50000000 Matt : 16 11448 1431.00000000 Matt : 17 20424 2553.00000000 Matt : 18 13672 1709.00000000 Matt : 19 19432 2429.00000000 Matt : 20 15872 1984.00000000 Matt : 21 20628 2578.50000000 Matt : 22 22788 2848.50000000 Matt : 23 21704 2713.00000000 Matt : 24 28660 3582.50000000 Matt : 25 18144 2268.00000000 Matt : 26 33540 4192.50000000 Matt : 27 16304 2038.00000000 Matt : 28 36420 4552.50000000 Matt : 29 5292 661.500000000 Matt : 30 17284 2160.50000000 Matt : 31 916 114.500000000 Matt : 32 3056 382.000000000 \showoff \showon Matt in 5 (Halb)Zügen = Weiß am Zug, Stellung weißer König merk( 1) = 0 // A8 merk( 2) = 0 // B8 merk( 3) = 18 merk( 4) = 58 merk( 5) = 58 merk( 6) = 18 merk( 7) = 0 merk( 8) = 0 merk( 9) = 0 merk( 10) = 0 merk( 11) = 10 merk( 12) = 126 merk( 13) = 126 merk( 14) = 10 merk( 15) = 0 merk( 16) = 0 merk( 17) = 18 merk( 18) = 10 merk( 19) = 57 merk( 20) = 167 merk( 21) = 167 merk( 22) = 57 merk( 23) = 10 merk( 24) = 18 merk( 25) = 58 merk( 26) = 126 merk( 27) = 167 merk( 28) = 288 merk( 29) = 288 merk( 30) = 167 merk( 31) = 126 merk( 32) = 58 merk( 33) = 58 merk( 34) = 126 merk( 35) = 167 merk( 36) = 288 merk( 37) = 288 merk( 38) = 167 merk( 39) = 126 merk( 40) = 58 merk( 41) = 18 merk( 42) = 10 merk( 43) = 57 merk( 44) = 167 merk( 45) = 167 merk( 46) = 57 merk( 47) = 10 merk( 48) = 18 merk( 49) = 0 merk( 50) = 0 merk( 51) = 10 merk( 52) = 126 merk( 53) = 126 merk( 54) = 10 merk( 55) = 0 merk( 56) = 0 merk( 57) = 0 merk( 58) = 0 merk( 59) = 18 merk( 60) = 58 merk( 61) = 58 merk( 62) = 18 merk( 63) = 0 merk( 64) = 0 // H1 \showoff Total 4412 Stellungen (Matt in 5 (Halb)Zügen. Ich habe in Beitrag 2 (erste Seite oben) noch eine Doppelseite aus "Schach am PC" eingefügt - meine Vorgehensweise ist dort zu sehen


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.48, eingetragen 2019-11-06

Für die 5-Halbzügler habe ich für den weißen König auf c7 (dein merk=10) überhaupt keine Lösungen, es wäre gut, wenn du mir diese mitteilen könntest, dann kann ich gucken, was ich da übersehen habe.... \showon # Gewinnsituation fuer fuenf Halbzuege - nach Position des weissen Königs a8=>0 b8=>0 c8=>13 d8=>53 e8=>53 f8=>13 g8=>0 h8=>0 a7=>0 b7=>0 c7=>0 d7=>116 e7=>116 f7=>0 g7=>0 h7=>0 a6=>13 b6=>0 c6=>37 d6=>147 e6=>147 f6=>37 g6=>0 h6=>13 a5=>53 b5=>116 c5=>147 d5=>268 e5=>268 f5=>147 g5=>116 h5=>53 a4=>53 b4=>116 c4=>147 d4=>268 e4=>268 f4=>147 g4=>116 h4=>53 a3=>13 b3=>0 c3=>37 d3=>147 e3=>147 f3=>37 g3=>0 h3=>13 a2=>0 b2=>0 c2=>0 d2=>116 e2=>116 f2=>0 g2=>0 h2=>0 a1=>0 b1=>0 c1=>13 d1=>53 e1=>53 f1=>13 g1=>0 h1=>0 Summe = 3852 Positionen \showoff Ich gehe im Detail etwas anders vor, als in dem von dir in #2 beschriebenen Verfahren, aber nach demselben Prinzip, eine Liste aller möglichen Stellungen zu erzeugen, und dann der Reihe nach aufsteigend zu markieren, welche Stellungen schon ein Matt für Schwarz zeigen (level=0), dann in welchen Weiss in einem Zug eine solche Stellung erreichen kann (level=1), und dann für welche Schwarz nicht anders kann, als in eine Level-1 Stellung zu gehen (Level=2), und dann immer weiter nach demselben Schema. Um das Ganze etwas kompakter zu machen gibt es Hilfsprozeduren, die prüfen, ob eine Figur auf ein bestimmtes Feld ziehen kann bzw. andersherum ein dort stehender (schwarzer) König ins Schach gerät. Ich habe beim Programmieren mehr auf Einfachheit geschaut, als auf Optimierung, die Anzahl der Stellungen passt ja gut in den Speicher und es hat sich herausgestellt, dass das Programm auch in ein paar Sekunden durchläuft. Entsprechend habe ich die Symmetrie nicht genutzt, um die Anzahl der Postionen zu verringern, da dies eben erhöhten Aufwand im Algorithmus erfordert hätte. Die Felder bezeichne ich durch einen Werte 0..63, und berechne nur dort, wo ich es brauche, die zugehörige Linie/Reihe, das macht die Schleifenkonstrukte etwas übersichtlicher. Der Frage, was mit der möglichen Rochade ist, bin ich noch nicht nachgegangen, das steht noch auf der todo-Liste. Ich vermerke mit der Stellung auch, durch welchen Zug Scharz bzw. Weiss fortsetzen sollte, und kann somit von gegebener Stellung auch rückwärts den Partieverlauf leicht ablesen. Es liegt natürlich nahe, die Daten dann einfach mal in eine (zB mySQL) Datenbank zu schaufeln, um darauf eine kleine nette Oberfläche zur Abfrage zu erstellen. Aktuell erzeugt ich den Stellungsbaum einfach bei jedem Programmlauf von Grund auf neu. Programmiert habe ich das ganze in plain old C. Grüße (und du hast recht - der Prozess der Fehlersuche ist endlich) Gonz


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 2320
  Beitrag No.49, vom Themenstarter, eingetragen 2019-11-06

Hallo gonz! Noch einen Fehler gefunden; in der Routine P2 wo vor dem Weißen Zug kein Schach sein darf, jetzt auch Test ob durch Bewegung des Weißen Königs (vorher) ein Schach aufgetreten ist (ca. Abzugsschach). \showon Matt in 0 bis Matt in 32 Matt : 0 216 27.0000000000 Matt : 1 1512 189.000000000 Matt : 2 624 78.0000000000 Matt : 3 4676 584.500000000 Matt : 4 1948 243.500000000 Matt : 5 3852 481.500000000 Matt : 6 648 81.0000000000 Matt : 7 1900 237.500000000 Matt : 8 1584 198.000000000 Matt : 9 4824 603.000000000 Matt : 10 3768 471.000000000 Matt : 11 8732 1091.50000000 Matt : 12 4728 591.000000000 Matt : 13 11320 1415.00000000 Matt : 14 5444 680.500000000 Matt : 15 17172 2146.50000000 Matt : 16 11448 1431.00000000 Matt : 17 20088 2511.00000000 Matt : 18 13672 1709.00000000 Matt : 19 19016 2377.00000000 Matt : 20 15872 1984.00000000 Matt : 21 20468 2558.50000000 Matt : 22 22788 2848.50000000 Matt : 23 21464 2683.00000000 Matt : 24 28660 3582.50000000 Matt : 25 17824 2228.00000000 Matt : 26 33540 4192.50000000 Matt : 27 16160 2020.00000000 Matt : 28 36420 4552.50000000 Matt : 29 5244 655.500000000 Matt : 30 17284 2160.50000000 Matt : 31 916 114.500000000 Matt : 32 3056 382.000000000 \showoff Viele Grüße Ronald


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.50, eingetragen 2019-11-06

Hey! Dann wären wir hier: Stellungen mit "Matt in 9 Halbzügen", ich habe dort 4848 Stellungen Aufgrund der Symmetrie brauchen wir doch eigentlich nur 10 Werte abgleichen: \showon # Gewinnsituation fuer 9 Halbzuege, nach Position des weissen Koenigs a8=>0 b8=>0 c8=>17 d8=>173 b7=>0 c7=>15 d7=>145 c6=>24 d6=>169 d5=>150 \showoff


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 2320
  Beitrag No.51, vom Themenstarter, eingetragen 2019-11-06

Hallo gonz! \showon Matt in 9 Halbzügen (Weiß am Zug), WK auf D8 (170 Stellungen), hier Stellung des Weißen Turmes merk( 1) = 2 // A8 merk( 2) = 2 // B8 merk( 3) = 2 merk( 4) = 0 merk( 5) = 1 merk( 6) = 1 merk( 7) = 1 merk( 8) = 1 merk( 9) = 2 merk( 10) = 2 merk( 11) = 3 merk( 12) = 2 merk( 13) = 2 merk( 14) = 1 merk( 15) = 2 merk( 16) = 1 merk( 17) = 5 merk( 18) = 4 merk( 19) = 5 merk( 20) = 4 merk( 21) = 4 merk( 22) = 4 merk( 23) = 0 merk( 24) = 1 merk( 25) = 4 merk( 26) = 4 merk( 27) = 4 merk( 28) = 6 merk( 29) = 6 merk( 30) = 3 merk( 31) = 3 merk( 32) = 2 merk( 33) = 3 merk( 34) = 4 merk( 35) = 3 merk( 36) = 4 merk( 37) = 4 merk( 38) = 2 merk( 39) = 2 merk( 40) = 1 merk( 41) = 3 merk( 42) = 3 merk( 43) = 3 merk( 44) = 4 merk( 45) = 4 merk( 46) = 2 merk( 47) = 1 merk( 48) = 1 merk( 49) = 3 merk( 50) = 3 merk( 51) = 3 merk( 52) = 4 merk( 53) = 4 merk( 54) = 2 merk( 55) = 1 merk( 56) = 1 merk( 57) = 3 merk( 58) = 3 merk( 59) = 3 merk( 60) = 4 merk( 61) = 4 merk( 62) = 2 merk( 63) = 1 merk( 64) = 1 // H1 \showoff So gehen dann nach und nach die Fehler aus meinem Programm ... Viele Grüße Ronald


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.52, eingetragen 2019-11-06

Hi Ronald, das geht ja wie das Brezelbacken :) Ok, für 9 Halbzuege, wK:D8, wT:A8 habe ich eine Lösung mehr (genauso wie für wT:b8 und wT:c8 auch jeweils 3 statt 2) \showon d8-f8-a8 d8-g8-a8 d8-h8-a8 https://matheplanet.de/matheplanet/nuke/html/uploads/b/36025_kkt-9a.jpg \showoff Grüße, Gerhard


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 2320
  Beitrag No.53, vom Themenstarter, eingetragen 2019-11-06

Hallo gonz! Ich bin jetzt bei Deinen Matt-Werten aus Beitrag 32, nachdem ich noch einen Fehler entfernt habe. Die Stellung mit WK D8, BK G8 und WT auf A8 wurde bei mir erst als Matt in 11 Halbzügen gefunden. \showon Matt in 0 bis Matt in 32 (Halb)Zügen Matt in Zügen, Stellungen, Stellungen / 8 Matt : 0 216 27.0000000000 Matt : 1 1512 189.000000000 Matt : 2 624 78.0000000000 Matt : 3 4676 584.500000000 Matt : 4 1948 243.500000000 Matt : 5 3852 481.500000000 Matt : 6 648 81.0000000000 Matt : 7 1900 237.500000000 Matt : 8 1584 198.000000000 Matt : 9 4848 606.000000000 Matt : 10 3768 471.000000000 Matt : 11 8708 1088.50000000 Matt : 12 4728 591.000000000 Matt : 13 11320 1415.00000000 Matt : 14 5444 680.500000000 Matt : 15 17172 2146.50000000 Matt : 16 11448 1431.00000000 Matt : 17 20088 2511.00000000 Matt : 18 13672 1709.00000000 Matt : 19 19016 2377.00000000 Matt : 20 15872 1984.00000000 Matt : 21 20476 2559.50000000 Matt : 22 22788 2848.50000000 Matt : 23 21480 2685.00000000 Matt : 24 28732 3591.50000000 Matt : 25 17824 2228.00000000 Matt : 26 33516 4189.50000000 Matt : 27 16136 2017.00000000 Matt : 28 36372 4546.50000000 Matt : 29 5244 655.500000000 Matt : 30 17284 2160.50000000 Matt : 31 916 114.500000000 Matt : 32 3056 382.000000000 \showoff Jetzt fehlt nur noch, dass StrgAltEntf das Problem auch noch angeht und zu gänzlich anderen Werten kommt ;-) . Bisher habe ich die Ergebnisse relativ einfach gespeichert: - eine ASCII-Datei - Reihenfolge der Daten: WK Zeile,Spalte // BK Zeile,Spalte // WT Zeile,Spalte // Dran (1 Weiß, 2 Schwarz) // Wert: 0 bis 32 Matttiefe von Weiß oder -1000 undefiniert - Rechenzeit ca.15 Sekunden Viele Grüße Ronald


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.54, eingetragen 2019-11-07

@Ronald: prima :) Ich habe noch auf der todo-Liste: Werte in Datenbank einpflegen Eventuell kleine Oberfläche dafür bauen Rochadefälle auswerten Ggf. könnte man natürlich auch andere Endspiele angehen wir zB K+D vs. K+T... Anbei das Programm in C (nicht, dass es besonders toll wäre, nur zweckens Dokumentation). Das Programm braucht 4-5 Sekunden für die Berechnung der Liste, es gab also auch keinen Grund, geschwindigkeitsoptimiert zu programmieren. Es ist explitit für die Endspiele K-K-T ausgerichtet, für andere Fälle müsste man einiges allgemeiner halten... enthält etwas bei 136 "Logical Lines of Code" \showon \sourceon pure C #include #include int wk,wt,sk; int situation[64][64][64]; int weiss_best[64][64][64]; int schwarz_best[64][64][64]; int weiss_moveto[64][64][64]; int schwarz_moveto[64][64][64]; int gesamtzahl = 0; int kollision = 0; int koenige_schach = 0; int schwarz_patt = 0; int schwarz_schlaegt = 0; int schwarz_matt = 0; int schwarz_im_schach = 0; int sonstige = 0; int abs(int x) { if (x<0) return -x; else return x; } int koenig_gehtnach (int k1, int k2) { // Nebenbei heisst das nicht, dass der Koenig auf dieses Feld // wirklich ziehen darf, er koennte dort ja im Schach stehen. if (k1==k2) return 0; else { int xk1 = k1 % 8; int yk1 = k1 / 8; int xk2 = k2 % 8; int yk2 = k2 / 8; if ((abs(xk1-xk2)<2) && (abs(yk1-yk2)<2)) return 1; else return 0; } } int turm_gehtnach (int t, int k, int wk) { // da der weisse Turm den eigenen Koenig nicht ueberspringen darf, // muss dessen Position mitgegeben werden. Wo der schwarze Koenig // steht, ist nicht relevant, da er nicht im Weg stehen kann, er // haette ja vorher schon im Schach gestanden. int xt = t % 8; int yt = t / 8; int xk = k % 8; int yk = k / 8; int myreturn = 0; int loop; if (t!=k) { if (xk==xt) { // ok, beide positionen auf derselben Linie // steht ggf. der Koenig noch im Weg? myreturn = 1; if (yk>yt) { for (loop=t;loop<=k;loop+=8) if (loop==wk) myreturn = 0; } else { for (loop=t;loop>=k;loop-=8) if (loop==wk) myreturn = 0; } } if (yk==yt) { // ok, beide positionen auf derselben reihe // steht ggf. der Koenig noch im Weg? myreturn = 1; if (xk>xt) { for (loop=t;loop<=k;loop++) if (loop==wk) myreturn = 0; } else { for (loop=t;loop>=k;loop--) if (loop==wk) myreturn = 0; } } } return myreturn; } int main() { time_t anfang,fertig; time(&anfang); printf("\nKKT by gonz, Vers. 1.01\n\n"); for (wk=0;wk<64;wk++) for (wt=0;wt<64;wt++) for (sk=0;sk<64;sk++) { gesamtzahl++; situation[wk][wt][sk]=1; weiss_best[wk][wt][sk]=1000; schwarz_best[wk][wt][sk]=1000; if ( (wk==wt) || (wk==sk) || (wt==sk) ) { situation[wk][wt][sk]=-1; kollision++; } else if (koenig_gehtnach(wk,sk)) { situation[wk][wt][sk]=-1; koenige_schach++; } else { // so diese Situationen sind moeglich. Ggf. sind sie // fuer schwarz schon verloren, oder erzwungen unentschieden. // es kann auch sein, dass sie nicht fuer weiss am Zug geeignet sind, // da Schwarz schon im Schach steht. // da wir das nachher brauchen, pruefen wird das zuerst. // nur der weisse turm kann schach geben. int now_schach; if ( turm_gehtnach(wt,sk,wk) ) { schwarz_im_schach++; now_schach=1; weiss_best[wk][wt][sk]=-1; } else now_schach=0; // zum Beispiel, wenn schwarz ungestraft den Turm schlagen kann // hierbei ist es erst einmal egal, ob schwarz im Schach stand if ( (koenig_gehtnach(sk,wt)==1) && (koenig_gehtnach(wk,wt)<1)) { schwarz_best[wk][wt][sk]=2000; schwarz_schlaegt++; } else { // und dann, ob patt gegeben ist. dh ob Schwarz nicht im Schach steht, // aber auch nicht mehr ziehen kann. int hat_zug=0; int sk_new; for (sk_new=0;sk_new<64;sk_new++) if (koenig_gehtnach(sk,sk_new)) if ( (koenig_gehtnach(wk,sk_new)<1) && (turm_gehtnach(wt,sk_new,wk)<1)) hat_zug=1; if (hat_zug==0) { if (now_schach) { schwarz_best[wk][wt][sk]=0; schwarz_matt++; } else { schwarz_best[wk][wt][sk]=2000; schwarz_patt++; } } } } } int found=1; int level=0; int level_sum; int best; int best_move; int new_wk; int new_wt; int new_sk; printf("Es wurden %i Situationen untersucht.\n",gesamtzahl); printf("In %i Situationen kollidieren die Positionen der Figuren,\n",kollision); printf("In %i Situationen geben die Koenige einander Schach.\n\n",koenige_schach); int summe1 = gesamtzahl-kollision-koenige_schach; printf("Damit koennen noch %i Situationen wirklich aufs Brett kommen.\n",summe1); printf("In %i Situationen erzwingt Schwarz am Zug remis, indem er den Turm schleagt,\n",schwarz_schlaegt); printf("In %i Situationen ist Schwarz am Zug patt,\n",schwarz_patt); printf("In %i Situationen ist Schwarz matt gesetzt.\n\n",schwarz_matt); printf("In %i Situationen kann Weiss nicht am Zug sein, da Schwarz im Schach steht.\n",schwarz_im_schach); printf("Damit sind fuer Weiss jeweils %i Situationen zu pruefen.\n\n",summe1-schwarz_im_schach); while (found) { found=0; level++; level_sum=0; if (level%2==1) { // weiss am Zug checken for (wk=0;wk<64;wk++) for (wt=0;wt<64;wt++) for (sk=0;sk<64;sk++) if ( (situation[wk][wt][sk]>0) && (weiss_best[wk][wt][sk]>level) ) { best = 1000; for (new_wk=0;new_wk<64;new_wk++) if ( (new_wk!=wt) && koenig_gehtnach(wk,new_wk) && (koenig_gehtnach(new_wk,sk)<1) ) if (schwarz_best[new_wk][wt][sk]0) && (schwarz_best[wk][wt][sk]<2000) && (schwarz_best[wk][wt][sk]>0) ) { best = 0; for (new_sk=0;new_sk<64;new_sk++) if ( (new_sk!=wt) && koenig_gehtnach(sk,new_sk) && (koenig_gehtnach(wk,new_sk)<1) && (turm_gehtnach(wt,new_sk,wk)<1) ) if (weiss_best[wk][wt][new_sk]>best) { best = weiss_best[wk][wt][new_sk]; best_move = new_sk; } if (best+10) printf ("Matt in %2i Halbzuegen: %i\n",level,level_sum); } } time(&fertig); printf("Habe fertig - %li Sekunden.\n\n",fertig-anfang); } \sourceoff \showoff Ach ja: wo ich mich mit Delastelle damit hier durchgequält habe, unsere Fehler zu finden - sei noch verraten, welcher Art diese bei mir waren... (Gonz im Plaudermodus): Es gab einen Fehler, bei dem ich in einer Schleife statt bis <64 bis <63 geschrieben hatte (also ein Konzentrationsfehler, den ich natürlich auch durch Verwendung einer Konstante hätte vermeiden können), und Es gab den Fehler, dass ich Stellungen, in denen Schwarz auf Patt steht, nicht mit Weiss am Zug in die Überlegungen einbezogen hatte, also eher ein algorithmischer Fehler (oder, wenn man so will, auch auf mangelnde Konzentration zurückzuführen).


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4738
Wohnort: Harz
  Beitrag No.55, eingetragen 2019-11-07

Und nun auch ein Ergebnis in Sachen "Rochade". Weiß am Zug setzt schneller Matt, wenn er als erstes die kurze Rochade ausführen kann, in vier Fällen: schwarzer König auf g5 (21 statt 23 Halbzüge) schwarzer König auf g6 (21 statt 23 Halbzüge) schwarzer König auf g7 (19 statt 23 Halbzüge) schwarzer König auf g8 (19 statt 21 Halbzüge) Das ist auch ein wenig einsichtig, da dem schwarzen König auf der g-Linie durch die Rochade genau die Flucht über die f-Linie abgeschnitten wird. Steht der schwarze König auf g3 oder g4, kommt es sich gleich, ob man die kurze Rochade ausführt, in allen anderen Fällen ist es (teils wesentlich) umständlicher, wenn man kurz rochiert. Nach dem ersten Zug ist das weiße Rochaderecht dann ja eh verfallen... Grüße und dies nur der Vollständigkeit halber, gonz


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 2320
  Beitrag No.56, vom Themenstarter, eingetragen 2019-11-07

Hallo, ich hatte die Dimension des Brettes als Parameter. Damit komme ich auf Dimension // Matt in Halbzügen 3 // 6 4 // 14 6 // 24 8 // 32 10 // 42 12 // 50 (ohne Gewähr) Mein Fortran-Programm findet man hier (etwas länger als das von gonz): https://www.matheplanet.de/matheplanet/nuke/html/fav.php?uname=Delastelle Viele Grüße Ronald Edit: am interessantesten von den Endspielen mit wenig Steinen ist wohl K, Läufer und Springer gegen König.


   Profil
Delastelle hat die Antworten auf ihre/seine Frage gesehen.
Delastelle hat selbst das Ok-Häkchen gesetzt.
Seite 2Gehe zur Seite: 1 | 2  

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]