Empfohlenes Datenformat zur Beschreibung der Schachregeln

8

Ich werde einen Schachserver und einen oder mehrere Clients für Schach schreiben und die Schachregeln (z. B. zulässige Züge basierend auf dem Spielstatus, Regeln für den Abschluss eines Spiels) in einer Programmiersprache beschreiben unabhängige Art und Weise. Dies ist ein bisschen schwierig, da einige der Schachregeln (z. B. King Castling, en passent, Draws basierend auf 3 oder mehr wiederholten Zügen) nicht nur auf dem Board-Layout basieren, sondern auch auf der Geschichte der Züge.

Ich würde das Format bevorzugen:

  • textuell
  • menschenlesbar
  • basiert auf einem Standard (z. B. YAML, XML)
  • leicht in einer Vielzahl von Sprachen zu parsen

Aber ich bin bereit, irgendwelche von diesen für eine geeignete Lösung zu opfern.

Meine Hauptfrage ist: Wie kann ich Algorithmen einer solchen Komplexität erstellen, die in einem so komplexen Zustand aus einem Datenformat operieren?

Eine Nachfolgefrage ist: Können Sie ein Beispiel für ein ähnliches Problem auf ähnliche Weise geben, das als Ausgangspunkt dient?

Bearbeiten: Als Antwort auf eine Bitte um Klarheit - bedenken Sie, dass ich einen Server in Python geschrieben habe, einen Client in C # und einen anderen in Java geschriebenen Client. Ich möchte es vermeiden, die Regeln (z. B. für zulässige Stückbewegung, Umstände für Scheck usw.) an jedem Ort festzulegen. Ich würde es vorziehen, diese Regeln einmal in einer Sprache unabhängig zu spezifizieren.

    
James Fassett 11.10.2008, 16:34
quelle

9 Antworten

4

Lass uns nachdenken. Wir beschreiben Objekte (Orte und Stücke) mit Zuständen und Verhaltensweisen. Wir müssen einen aktuellen Status und eine sich ständig ändernde Menge an erlaubten Statusänderungen aus einem aktuellen Zustand notieren.

Das ist Programmieren. Sie wollen keine "Metasprache", die Sie dann in einer normalen Programmiersprache parsen können. Verwenden Sie einfach eine Programmiersprache.

Beginnen Sie mit gewöhnlichen Klassendefinitionen in einer gewöhnlichen Sprache. Holen Sie alles zur Arbeit. Dann sind diese Klassendefinitionen die Definition von Schach.

Mit nur minimalen Ausnahmen sind alle Programmiersprachen

  • Textuell
  • Menschenlesbar
  • Vernünftig standardisiert
  • Leicht von ihren jeweiligen Compilern oder Interpretern geparst.

Wählen Sie einfach eine Sprache, und Sie sind fertig. Da es eine Weile dauern wird, bis die Nuancen herausgearbeitet sind, werden Sie wahrscheinlich mit einer dynamischen Sprache wie Python oder Ruby glücklicher sein als mit einer statischen Sprache wie Java oder C #.

Wenn Sie Portabilität wünschen. Wählen Sie eine tragbare Sprache. Wenn Sie möchten, dass die Sprache in eine "größere" Anwendung eingebettet wird, wählen Sie die Sprache für Ihre "größere" Anwendung.

Da die ursprünglichen Anforderungen unvollständig waren, besteht ein sekundäres Problem darin, wie Code zusammen mit mehreren Clients ausgeführt werden kann.

  1. Haben Sie keine Kunden in mehreren Sprachen. Wähle eins. Java zum Beispiel und bleibe dabei.

  2. Wenn Sie Clients in mehreren Sprachen benötigen, benötigen Sie eine Sprache, die Sie in alle drei Laufzeitumgebungen einbetten können. Sie haben zwei Möglichkeiten.

    • Betten Sie einen Interpreter ein. Zum Beispiel sind Python, Tcl und JavaScript leichte Interpreter, die Sie aus C- oder C # -Programmen aufrufen können. Dieser Ansatz funktioniert für Browser, es kann für Sie arbeiten. Java, via JNI, kann dies ebenfalls nutzen. Es gibt BPEL-Regel-Engines, mit denen Sie das ausprobieren können.

    • Erzeugen Sie einen Interpreter als separaten Subprozess. Öffnen Sie eine Named Pipe oder einen Socket oder etwas zwischen Ihrer App und dem erstellten Interpreter. Ihre Java- und C # -Clients können mit einem Python-Subprozess sprechen. Ihr Python-Server kann diesen Code einfach verwenden.

S.Lott 11.10.2008 16:48
quelle
2

Es gibt bereits ein weit verbreitetes schachspezifisches Format namens Portable Game Notation . Es gibt auch ein Smart Game Format , das an viele verschiedene Spiele angepasst werden kann.

    
Bill the Lizard 11.10.2008 17:09
quelle
2

Ich würde Prolog für die Beschreibung der Regeln vorschlagen.

    
Paul Nathan 11.10.2008 17:14
quelle
2

Dies beantwortet die folgende Frage: -)

Ich kann darauf hinweisen, dass einer der beliebtesten Schachserver rund um sein Protokoll hier dokumentiert (Warnung, FTP-Link und unterstützt kein passives FTP), aber nur um Schnittstellen zu schreiben , nicht für andere Zwecke. Sie könnten anfangen, einen Client für diesen Server als Lernerfahrung zu schreiben.

Eine Sache, die relevant ist, ist, dass gute Schachserver viel mehr Funktionen als nur ein Verschiebungsrelais bieten.

Das heißt, es gibt ein grundlegenderes Protokoll für die Anbindung an Schach-Engines, dokumentiert hier .

Oh, und übrigens: Board Representation bei Wikipedia

Alles, was über die Vertretung hinausgeht, gehört zum Programm selbst, worauf schon viele hingewiesen haben.

    
Vinko Vrsalovic 11.10.2008 17:00
quelle
2
___ answer194332 ___

Ich würde Prolog für die Beschreibung der Regeln vorschlagen.

    
___ answer194306 ___

Lass uns nachdenken. Wir beschreiben Objekte (Orte und Stücke) mit Zuständen und Verhaltensweisen. Wir müssen einen aktuellen Status und eine sich ständig ändernde Menge an erlaubten Statusänderungen aus einem aktuellen Zustand notieren.

Das ist Programmieren. Sie wollen keine "Metasprache", die Sie dann in einer normalen Programmiersprache parsen können. Verwenden Sie einfach eine Programmiersprache.

Beginnen Sie mit gewöhnlichen Klassendefinitionen in einer gewöhnlichen Sprache. Holen Sie alles zur Arbeit. Dann sind diese Klassendefinitionen die Definition von Schach.

Mit nur minimalen Ausnahmen sind alle Programmiersprachen

  • Textuell
  • Menschenlesbar
  • Vernünftig standardisiert
  • Leicht von ihren jeweiligen Compilern oder Interpretern geparst.

Wählen Sie einfach eine Sprache, und Sie sind fertig. Da es eine Weile dauern wird, bis die Nuancen herausgearbeitet sind, werden Sie wahrscheinlich mit einer dynamischen Sprache wie Python oder Ruby glücklicher sein als mit einer statischen Sprache wie Java oder C #.

Wenn Sie Portabilität wünschen. Wählen Sie eine tragbare Sprache. Wenn Sie möchten, dass die Sprache in eine "größere" Anwendung eingebettet wird, wählen Sie die Sprache für Ihre "größere" Anwendung.

Da die ursprünglichen Anforderungen unvollständig waren, besteht ein sekundäres Problem darin, wie Code zusammen mit mehreren Clients ausgeführt werden kann.

  1. Haben Sie keine Kunden in mehreren Sprachen. Wähle eins. Java zum Beispiel und bleibe dabei.

  2. Wenn Sie Clients in mehreren Sprachen benötigen, benötigen Sie eine Sprache, die Sie in alle drei Laufzeitumgebungen einbetten können. Sie haben zwei Möglichkeiten.

    • Betten Sie einen Interpreter ein. Zum Beispiel sind Python, Tcl und JavaScript leichte Interpreter, die Sie aus C- oder C # -Programmen aufrufen können. Dieser Ansatz funktioniert für Browser, es kann für Sie arbeiten. Java, via JNI, kann dies ebenfalls nutzen. Es gibt BPEL-Regel-Engines, mit denen Sie das ausprobieren können.

    • Erzeugen Sie einen Interpreter als separaten Subprozess. Öffnen Sie eine Named Pipe oder einen Socket oder etwas zwischen Ihrer App und dem erstellten Interpreter. Ihre Java- und C # -Clients können mit einem Python-Subprozess sprechen. Ihr Python-Server kann diesen Code einfach verwenden.

___ answer194326 ___

Es gibt bereits ein weit verbreitetes schachspezifisches Format namens Portable Game Notation . Es gibt auch ein Smart Game Format , das an viele verschiedene Spiele angepasst werden kann.

    
___ antwort194318 ___

Bearbeiten: Übermäßig wortreiche Antwort gelöscht.

Die kurze Antwort lautet: Schreibe die Regeln in Python. Verwenden Sie Iron Python als Schnittstelle zum C # -Client und Jython für den Java-Client.

    
___ answer199233 ___

Was ich bisher aus den Antworten erhalten habe:

Für Schachbrett-Datendarstellungen:

Siehe den Wikipedia-Artikel zu [Schachbrett-Darstellungen] ( Ссылка .

Für Schach verschieben Sie Datendarstellungen:

Siehe Wikipedia Artikel auf Portable Game Notation und Algebraische Schachnotation

Für Schachregeln:

Dies muss mit einer Programmiersprache erfolgen. Wenn man die Menge an geschriebenem Code reduzieren möchte, wenn die Regeln in mehr als einer Sprache implementiert werden, dann gibt es ein paar Optionen.

  1. Verwenden Sie eine Sprache, in der ein einbettbarer Interpreter für die Zielsprachen existiert (z. B. Lua, Python).
  2. Verwenden Sie eine virtuelle Maschine, auf die die gängigen Sprachen kompilieren können (z. B. IronPython für C #, JPython für Java).
  3. Verwenden Sie einen Hintergrund-Daemon oder Unterprozess für die Regeln, mit denen die Zielsprachen kommunizieren können.
  4. Implementieren Sie die Regelalgorithmen in jeder Zielsprache neu.

Obwohl mir eine deklarative Syntax gefallen wäre, die von mehreren Sprachen interpretiert werden konnte, um die Schachregeln durchzusetzen, hat mich meine Forschung zu keinem Kandidaten geführt. Ich habe den Verdacht, dass Constraint Based Programming ein möglicher Weg sein könnte, da Solver für viele Sprachen existieren, aber ich bin mir nicht sicher würde diese Anforderung wirklich erfüllen. Danke für all die Aufmerksamkeit und vielleicht in der Zukunft wird eine Antwort erscheinen.

    
___ answer194321 ___

Dies beantwortet die folgende Frage: -)

Ich kann darauf hinweisen, dass einer der beliebtesten Schachserver rund um sein Protokoll hier dokumentiert (Warnung, FTP-Link und unterstützt kein passives FTP), aber nur um Schnittstellen zu schreiben , nicht für andere Zwecke. Sie könnten anfangen, einen Client für diesen Server als Lernerfahrung zu schreiben.

Eine Sache, die relevant ist, ist, dass gute Schachserver viel mehr Funktionen als nur ein Verschiebungsrelais bieten.

Das heißt, es gibt ein grundlegenderes Protokoll für die Anbindung an Schach-Engines, dokumentiert hier .

Oh, und übrigens: Board Representation bei Wikipedia

Alles, was über die Vertretung hinausgeht, gehört zum Programm selbst, worauf schon viele hingewiesen haben.

    
___ answer194417 ___

Drools hat eine moderne Implementierung von menschenlesbaren Regeln - Ссылка . Sie haben eine Möglichkeit, wie Benutzer ihre Regeln in Excel eingeben können. Viel mehr Benutzer können verstehen, was in Excel als in anderen Werkzeugen ist.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ qstntxt ___

Ich werde einen Schachserver und einen oder mehrere Clients für Schach schreiben und die Schachregeln (z. B. zulässige Züge basierend auf dem Spielstatus, Regeln für den Abschluss eines Spiels) in einer Programmiersprache beschreiben unabhängige Art und Weise. Dies ist ein bisschen schwierig, da einige der Schachregeln (z. B. King Castling, en passent, Draws basierend auf 3 oder mehr wiederholten Zügen) nicht nur auf dem Board-Layout basieren, sondern auch auf der Geschichte der Züge.

Ich würde das Format bevorzugen:

  • textuell
  • menschenlesbar
  • basiert auf einem Standard (z. B. YAML, XML)
  • leicht in einer Vielzahl von Sprachen zu parsen

Aber ich bin bereit, irgendwelche von diesen für eine geeignete Lösung zu opfern.

Meine Hauptfrage ist: Wie kann ich Algorithmen einer solchen Komplexität erstellen, die in einem so komplexen Zustand aus einem Datenformat operieren?

Eine Nachfolgefrage ist: Können Sie ein Beispiel für ein ähnliches Problem auf ähnliche Weise geben, das als Ausgangspunkt dient?

Bearbeiten: Als Antwort auf eine Bitte um Klarheit - bedenken Sie, dass ich einen Server in Python geschrieben habe, einen Client in C # und einen anderen in Java geschriebenen Client. Ich möchte es vermeiden, die Regeln (z. B. für zulässige Stückbewegung, Umstände für Scheck usw.) an jedem Ort festzulegen. Ich würde es vorziehen, diese Regeln einmal in einer Sprache unabhängig zu spezifizieren.

    
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123dataformat ___ hilf uns dieses Wiki zu bearbeiten ___ tag123chess ___ Dieses Tag ist für das Schachspiel und Probleme mit Computern, es zu spielen. ___ answer217035 ___

Um den aktuellen Zustand eines Boards (einschließlich Rochierungsmöglichkeiten usw.) darzustellen, können Sie verwenden Forsyth-Edwards Notation , die Ihnen eine kurze ASCII-Darstellung gibt. z.B.:

%Vor%

Wäre die Position des Eröffnungsbretts.

Um dann eine bestimmte Bewegung von einer Position darzustellen, könnte man numerische Bewegungsschreibweise (wie im Fernschach verwendet) verwenden, Die geben Ihnen eine kurze (4-5 Ziffern) Darstellung einer Bewegung auf der Tafel.

Um die Regeln zu repräsentieren - würde ich mich gerne selbst kennenlernen. Derzeit sind die Regeln für meine Schach-Engine nur in Python geschrieben und wahrscheinlich nicht so deklarativ wie ich möchte.

    
___ qstnhdr ___ Empfohlenes Datenformat zur Beschreibung der Schachregeln ___ answer297803 ___

Ich würde dem Kommentar von ΤΖΩΤΖΙΟΥ zustimmen. Lassen Sie den Server einfach die Validierung durchführen und lassen Sie die Clients einen möglichen Umzug einreichen. Wenn dies nicht die Art ist, wie Sie das Design verwenden möchten, schreiben Sie einfach die Regeln in Python, wie von S. Lott und anderen vorgeschlagen.

Es sollte wirklich nicht so schwer sein. Sie können die Regeln in drei Hauptkategorien unterteilen:
  - Regeln, die sich auf den Zustand des Spielplans beziehen (Rochade, En Passant, Remis, Check, Checkmate, Check durchgehen, ist auch dieser Spieler an der Reihe usw.)

  - Regeln, die für alle Steine ​​gelten (können nicht das gleiche Feld wie ein anderes Stück deiner eigenen Farbe einnehmen, bewegen sich zu einem Quadrat mit der Figur des Gegners == Eroberung, kann nicht vom Spielbrett abweichen)

  - Regeln, die für jedes einzelne Stück gelten. (Bauern können sich nicht rückwärts bewegen, Burgen können sich nicht diagonal bewegen, usw.)

Jede Regel kann als eine Funktion implementiert werden, und dann wird für jede Halbbewegung die Gültigkeit bestimmt, indem man sieht, ob sie alle Validierungen besteht.

Für jeden möglichen Zug müssen Sie nur die Regeln in der folgenden Reihenfolge überprüfen:

  1. ist die vorgeschlagene Bewegung potenziell gültig? (die richtige "Form" für das Stück)
  2. Passt es zu den Beschränkungen des Boards? (Ist das Stück blockiert, würde es sich von der Kante bewegen)
  3. verletzt die Bewegung staatliche Anforderungen? (Bin ich nach diesem Umzug in Schach? Gehe ich durch den Check? Ist das passender Capture legal?)

Wenn all das in Ordnung ist, sollte der Server den Umzug als legal akzeptieren ...

    
___
Mike F 11.10.2008 16:57
quelle
2

Was ich bisher aus den Antworten erhalten habe:

Für Schachbrett-Datendarstellungen:

Siehe den Wikipedia-Artikel zu [Schachbrett-Darstellungen] ( Ссылка .

Für Schach verschieben Sie Datendarstellungen:

Siehe Wikipedia Artikel auf Portable Game Notation und Algebraische Schachnotation

Für Schachregeln:

Dies muss mit einer Programmiersprache erfolgen. Wenn man die Menge an geschriebenem Code reduzieren möchte, wenn die Regeln in mehr als einer Sprache implementiert werden, dann gibt es ein paar Optionen.

  1. Verwenden Sie eine Sprache, in der ein einbettbarer Interpreter für die Zielsprachen existiert (z. B. Lua, Python).
  2. Verwenden Sie eine virtuelle Maschine, auf die die gängigen Sprachen kompilieren können (z. B. IronPython für C #, JPython für Java).
  3. Verwenden Sie einen Hintergrund-Daemon oder Unterprozess für die Regeln, mit denen die Zielsprachen kommunizieren können.
  4. Implementieren Sie die Regelalgorithmen in jeder Zielsprache neu.

Obwohl mir eine deklarative Syntax gefallen wäre, die von mehreren Sprachen interpretiert werden konnte, um die Schachregeln durchzusetzen, hat mich meine Forschung zu keinem Kandidaten geführt. Ich habe den Verdacht, dass Constraint Based Programming ein möglicher Weg sein könnte, da Solver für viele Sprachen existieren, aber ich bin mir nicht sicher würde diese Anforderung wirklich erfüllen. Danke für all die Aufmerksamkeit und vielleicht in der Zukunft wird eine Antwort erscheinen.

    
James Fassett 13.10.2008 22:22
quelle
0

Drools hat eine moderne Implementierung von menschenlesbaren Regeln - Ссылка . Sie haben eine Möglichkeit, wie Benutzer ihre Regeln in Excel eingeben können. Viel mehr Benutzer können verstehen, was in Excel als in anderen Werkzeugen ist.

    
anjanb 11.10.2008 18:31
quelle
0

Um den aktuellen Zustand eines Boards (einschließlich Rochierungsmöglichkeiten usw.) darzustellen, können Sie verwenden Forsyth-Edwards Notation , die Ihnen eine kurze ASCII-Darstellung gibt. z.B.:

%Vor%

Wäre die Position des Eröffnungsbretts.

Um dann eine bestimmte Bewegung von einer Position darzustellen, könnte man numerische Bewegungsschreibweise (wie im Fernschach verwendet) verwenden, Die geben Ihnen eine kurze (4-5 Ziffern) Darstellung einer Bewegung auf der Tafel.

Um die Regeln zu repräsentieren - würde ich mich gerne selbst kennenlernen. Derzeit sind die Regeln für meine Schach-Engine nur in Python geschrieben und wahrscheinlich nicht so deklarativ wie ich möchte.

    
John Montgomery 19.10.2008 21:53
quelle
0

Ich würde dem Kommentar von ΤΖΩΤΖΙΟΥ zustimmen. Lassen Sie den Server einfach die Validierung durchführen und lassen Sie die Clients einen möglichen Umzug einreichen. Wenn dies nicht die Art ist, wie Sie das Design verwenden möchten, schreiben Sie einfach die Regeln in Python, wie von S. Lott und anderen vorgeschlagen.

Es sollte wirklich nicht so schwer sein. Sie können die Regeln in drei Hauptkategorien unterteilen:
  - Regeln, die sich auf den Zustand des Spielplans beziehen (Rochade, En Passant, Remis, Check, Checkmate, Check durchgehen, ist auch dieser Spieler an der Reihe usw.)

  - Regeln, die für alle Steine ​​gelten (können nicht das gleiche Feld wie ein anderes Stück deiner eigenen Farbe einnehmen, bewegen sich zu einem Quadrat mit der Figur des Gegners == Eroberung, kann nicht vom Spielbrett abweichen)

  - Regeln, die für jedes einzelne Stück gelten. (Bauern können sich nicht rückwärts bewegen, Burgen können sich nicht diagonal bewegen, usw.)

Jede Regel kann als eine Funktion implementiert werden, und dann wird für jede Halbbewegung die Gültigkeit bestimmt, indem man sieht, ob sie alle Validierungen besteht.

Für jeden möglichen Zug müssen Sie nur die Regeln in der folgenden Reihenfolge überprüfen:

  1. ist die vorgeschlagene Bewegung potenziell gültig? (die richtige "Form" für das Stück)
  2. Passt es zu den Beschränkungen des Boards? (Ist das Stück blockiert, würde es sich von der Kante bewegen)
  3. verletzt die Bewegung staatliche Anforderungen? (Bin ich nach diesem Umzug in Schach? Gehe ich durch den Check? Ist das passender Capture legal?)

Wenn all das in Ordnung ist, sollte der Server den Umzug als legal akzeptieren ...

    
andrewdotnich 18.11.2008 03:48
quelle

Tags und Links