|
Autor |
Endspiele König Turm gegen König - wieviele Matt in 0,1,2 Zügen Stellungen |
|
gonz
Senior  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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 2 | Gehe zur Seite: 1 | 2 |
|
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]
|