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.
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:
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.
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
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.
Haben Sie keine Kunden in mehreren Sprachen. Wähle eins. Java zum Beispiel und bleibe dabei.
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.
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.
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.
Ich würde Prolog für die Beschreibung der Regeln vorschlagen.
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
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.
Haben Sie keine Kunden in mehreren Sprachen. Wähle eins. Java zum Beispiel und bleibe dabei.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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:
Wenn all das in Ordnung ist, sollte der Server den Umzug als legal akzeptieren ...
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.
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.
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.
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:
Wenn all das in Ordnung ist, sollte der Server den Umzug als legal akzeptieren ...
Tags und Links python java c# chess dataformat