SchachMatt analyse

    • GM 8

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • SchachMatt analyse

      Hallo liebe Community

      Ich sitze gerade an einem Schachspiel, welches man über TCP/IP spielen kann. Die ganzen Bewegungen usw. funktioniert alles, jedoch fehlt dem Spiel noch die Gabe, ein Schach Matt zu erkennen. Kurz überdacht fand ich diese Kalkulation nicht besonders, jedoch nun ein bisschen reingesteigert ist es eine schwere Sache.

      Nach reifer Überlegung habe ich nun folgendes vor:

      Ich kopiere bei jedem Schach setzten das momentane Spielbrett und berechne jeden möglichen Zug, der der Spieler ausführen kann und prüfe bei jedem Zug, ob er nicht mehr Schach steht. Wenn es nun kein Zug mehr gibt, ist der Spieler Schachmatt.
      Folgende Funktionen würde ich einsetzten:
      scr_vi_brett_set(string)
      scr_vi_brett_move(x,y,x2,y2)
      scr_vi_brett_checkMatt(spieler)
      scr_vi_brett_getObj(x,y)

      Nun wollt ich fragen, ob euch evt. eine bessere Variante bekannt ist, dies zu berechnen (Bei meiner wird einfach alles mögliche durchgespielt xD) und oder evt. eine DLL oder existierende Funktionen bekannt sind für ein Schachspiel.

      Vielen Dank im voraus und liebe Grüsse
      Sandro
    • du kannst ja zb einfach vom könig aus alle möglichen züge zu ihm durchchecken und die passenden genauer berechnen. das wäre wesentlich schneller als alle möglichen züge auf dem feld zu errechnen.
      "das war meine letzte flamewar PM an dich ."
    • Ich glaube das wird nicht funktionieren, weil beim Schach man ja auch bedenken muss das auch andere Figuren den König
      "retten" können. Das geht auf viele verschiedene Arten, so kann man Figuren dazwischenstellen oder bedrohende Figuren
      schlagen. Um die Berechnung aller möglichen Züge wird er wohl kaum herumkommen.
    • (Bei meiner wird einfach alles mögliche durchgespielt xD)
      Ähm... ist das nicht zufällig die einzige Möglichkeit? :huh: Naja... eventuell könnte man vielleicht nur prüfen, ob es Bewegungen gibt, die die Felder belegen können, die das Schach beenden würden - man müsste also nur nach jedem Bewegungsmuster, das es gibt, rückwärts prüfen ob eine entsprechende Figur in Reichweite ist. Zusätzlich müsste man natürlich noch prüfen ob der König bei einer Bewegung weiterhin im Schach bleibt.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von F4LL0UT ()

    • Hm... das sind jetzt nur Ideen, die nicht zu Ende gedacht sind. Allerdings spart das einige Berechnungen, denk ich.

      Zunächst wäre es sinnvoll, alle Zugmöglichkeiten des Königs selbst zu analysieren.
      Wenn er in allen Zugmöglichkeiten außer der Startposition in Schach steht, bringt es schonmal nichts, ihn zu bewegen.
      Nun sollte man die Startposition prüfen - wenn er dabei von mehr als einer Figur bedroht wird, ist er schachmatt.*

      Nun müssen wir das Retten durch andere Figuren überprüfen. Dazu muss man testen ob man
      a) einen Bedroher schlagen kann oder
      b) sich von einem Bedroher selbst bedrohen lassen kann.

      Für die Fälle, auf die a oder b zutrifft, prüft man wieder das Gesamtbild.
      Hat man dann alle Figuren durch, die a oder b erfüllen, müsste man Gewissheit haben.


      Bei dieser Vorgehensweise berechnet man die einfachen Sachen zuerst und sollte einen recht angenehmen best case haben. Weiterhin verzichtet man auf alle unbeteiligten Figuren. Das ganze jetzt aber in ein SCript umzuwandeln, wird sehr spaßig. ;)



      * Mir fällt gerade keine Möglichkeit ein, wie man durch das Ziehen einer anderen Figur gleich zwei potentielle Angreifer ablocken kann - wenn das doch geht, dann ist diese Idee natürlich wertlos.
    • Hier noch ein Vorschlag, um die Idee von MewX weiter auszuarbeiten:

      Merke dir bei jedem Zug (falls du es nicht ohnehin schon tust), wer zuletzt gezogen hat, d.h. Ursprung (U) und Ziel (Z).
      Wenn dein König im Schach steht, prüfst du zunächst, wie MewX sagte, ob er ein Fluchtfeld besitzt.

      Falls dem nicht so ist prüfst du zwei Dinge:
      I.: Bietet die Figur, die nun auf Z steht (d.h. die, die gerade gezogen hat), dem König Schach?
      II.: Befinden sich das Feld des Königs und U auf der selben Linie, Reihe oder Diagonalen? Falls ja, prüfe, ob (vom König aus betrachtet) "hinter" U eine Figur steht, die dem König Schach bietet (und die bis eben verstellt war).

      Soll beides eingetreten sein, d.h. der König von zwei Figuren gleichzeitig bedroht werden, so ist es in der Tat bereits Matt. Falls nicht, musst du nur noch für die eine, schachbietende Figur überprüfen, ob die Drohung beseitigt werden kann.

      In jedem Fall hilft schlagen; prüfe also, ob diese Figur von eigenen Figuren bedroht wird. Sollte es sich um einen Läufer, einen Turm oder eine Dame handeln, dann hilft es auch, eine Figur dazwischen zu ziehen; prüfe also für alle Felder zwischen König und schachbietender Figur, ob eine eigene Figur dieses Feld "bedroht". Sollte sowohl Schlagen als auch Zwischenziehen nicht möglich sein, ist es Matt.

      Für all dies bietet sich ein Skript an, das als Parameter ein Feld (d.h. dessen ID oder Koordinaten, je nach dem, wie du das Brett speicherst), die Farbe eines Spielers und einen weiteren Parameter (zu dem ich gleich nochmal kommen werde) nimmt, und true zurückgibt, wenn es eine Figur dieses Spielers gibt, die (evtl. durch Schlagen) auf dieses Feld ziehen könnte, wenn der Spieler nun dran wäre (und ansonsten false). Dies kannst du zum einen nutzen, um die freien Felder neben dem König zu überprüfen (kann der Gegner auf dieses Feld ziehen, dann steht der König dort auch im Schach), zum zweiten, um zu prüfen, ob eigene Figuren die schachbietende Figur schlagen können, und zum dritten, um zu prüfen, ob Figuren zwischenziehen können.

      Eben erwähnter letzter Parameter entscheidet hierbei, wie die Bauern zu beurteilen sind. Wenn es darum geht, ob sie dem König Schach bieten oder ob sie die schachbietende Figur schlagen können, muss bei ihnen die Frage lauten "könnten der Bauer auf das fragliche Feld schlagen, wenn dort nun eine gegnerische Figur stünde" (und entsprechendes geprüft werden). Wenn es allerdings darum geht, dass sie dazwischen ziehen sollen, muss die Frage lauten "kann der Bauer auf dieses Feld ziehen?" (und trivialerweise wird dieses Feld frei sein, wenn es zu dieser Frage kommt).

      Wobei mir gerade einfällt: Wie stellst du überhaupt fest, dass der König im Schach steht? Doch nur auch wieder durch Analyse, ob die gerade gezogene Figur den König angreift, oder ob sie einer anderen Figur den Weg freigegeben hat. In dem Fall ergibt sich eine andere Reihenfolge, in der du testen solltest:

      1.: Führe die beiden oben genannten Tests (I. und II.) durch.
      2.: Falls nur einer Schach bietet, versuche ihn zu schlagen (einmal oben beschriebenes Skript aufrufen).
      2. (a): Falls der König die einzige Figur ist, die die schachbietende Figur schlagen kann (um dies zu überprüfen, sollte der König vom Skript ignoriert und separat geprüft werden), prüfe, ob der Gegner das Feld mit einer anderen Figur deckt (wieder einmal das Skript rufen, diesmal mit der Farbe des anderen Spielers; damit das funktioniert, sollte das Skript wirklich nur true liefern, wenn sich die gefundene Figur auch wirklich bewegt und nicht schon auf dem gefragten Feld steht). Falls ja, kann der König nicht schlagen, da er sonst im Schach stünde.
      3.: Falls du ihn nicht schlagen kannst, schaue, ob die schachbietende Figur ein Läufer, ein Turm oder eine Dame ist, und ob zwischen König und Figur noch Felder frei sind; überprüfe jedes dieser Felder daraufhin, ob eine eigene Figur dazwischen ziehen kann (max. 6 Mal das Skript aufrufen).
      4.: Falls niemand dazwischen ziehen kann, oder zwei Figuren Schach bieten, prüfe die Felder um den König: Steht eine eigene Figur drauf, kannst du dort nicht hin. Ist es frei, prüfe, ob eine gegnerische Figur das Feld bedroht (max. 8 Mal das Skript rufen).

      Wenn auch der 4. Schritt keine Hilfe gefunden hat, ist es Matt, ansonsten brich ab, sobald du einen Weg gefunden hast, dem Schach zu entgehen.

      Nun musst du nur noch dieses Skript möglichst effizient implementieren.

      Ich hoffe, ich habe mich nicht zu unklar ausgedrückt.
    • Benutzer online 1

      1 Besucher