Inspiriert von diesem kürzlich erschienenen Artikel eines französischen Programmierers, der in Assembly ein 487-Byte-2-Spieler-Schachprogramm (Mensch gegen Mensch) schrieb, fragte ich mich, wie kleine Schachprogramme in anderen Sprachen sein könnten.
Einzelheiten
- Das Programm darf nur legale Schachzüge akzeptieren.
- Scheckerklärung / Schachmatterklärung ist nicht erforderlich (nur wünschenswert), obwohl die erste Regel in Scheckfällen gilt.
- Nach dem Artikel ist das Rochieren keine notwendige Implementierung.
- Außerdem müssen Sie en passant nicht implementieren.
- Sie müssen jedoch eine Bauernbeförderung erlauben, sobald Sie den achten Rang erreicht haben (Sie können sich dafür entscheiden, einfach die Umwandlung in eine Dame zu erzwingen).
- Es liegt an Ihnen, wie die Karte angezeigt wird - Terminal-ASCII, GUI usw.
- Sie müssen anzeigen, wer an der Reihe ist.
Die Schachregeln finden Sie hier - Ignorieren Sie bestimmte Turnierregeln (z. B. Timing, Berühren) und denken Sie daran, dass Rochade und En-Passant keine notwendigen Implementierungen sind.
a1 h8
einen Turm diagonal zur gegenüberliegenden Ecke zu bewegen und über die Bauern zu springenAntworten:
C
650600Um den Code für die Initialisierung der Karte zu reduzieren, wird auf dem Display Weiß (Großbuchstaben) von links nach rechts und Schwarz (Kleinbuchstaben) von rechts nach links angezeigt. Die Eingabe erfolgt in Form von zwei zweistelligen Dezimalzahlen (Startposition und Endposition), wobei die Datei (0-7) und der Rang (0-7) angegeben werden. Für ein bisschen zusätzlichen Code (11 von jeder Eingabe abziehen) könnte die Eingabe gemäß http://en.wikipedia.org/wiki/ICCF_numeric_notation (Ziffern 1-8) erfolgen.
Hier ist ein Beispiel-Screenshot, in dem Schwarz gerade seinen Turmbauern weiterentwickelt hat. Weiß versucht verschiedene illegale Züge mit seiner Königin, bevor er schließlich den Bauern fängt. Blinker sind
a
für Schwarz undA
für Weiß.Ein interessantes Merkmal meiner Validierung ist die Verwendung des Quadrats der euklidischen Distanz. Für den Ritter ist das immer 1 ^ 2 + 2 ^ 2 = 5, aber ich benutze es auch für den König und den Bauern.
Der Check-Test wird durchgeführt, indem das Spielbrett gesichert, der Zug des Spielers ausgeführt und alle 64 möglichen Züge des Gegners gescannt werden.
Das Programm muss mit Strg-C beendet werden. Ich kann mir keine freundlichere Art vorstellen, es zu tun, als einen besonderen Schritt zu unternehmen, um das Programm zu beenden. Eine Schachpartie endet tatsächlich, wenn ein Spieler nicht in der Lage ist, sich in seinem Zug zu bewegen (Schachmatt oder Patt), und dies erfordert viele Tests, die von der Spezifikation nicht verlangt werden.
Kommentierter Code
quelle
s,f
initialisiert werden? Leerzeichen auf leeren Feldern sind imo großartig.s
war eine Übertragung aus einer früheren Phase. Ich habe es jetzt entfernt.e=y*y+x*x=f-s-u*y=f/u-s/u;
.=
dies die einzige Interpretation zu sein scheint. In Bezuge=y*y+x*(x=..
auf die Ausführungsreihenfolge bin ich etwas vorsichtig, da ich die falsche Antwort von einem Argument erhalten habe, das in einerprintf
Anweisung geändert wurde , aber in diesem Fall scheint es auf GCC / Cygwin gut zu funktionieren. Ich werde auf weitere Änderungen warten, bevor ich sie in den Code übernehme. Eine Sache, die noch fehlt, ist eine Überprüfung auf Zahlen außerhalb des Bereichs 0..77 (was ich nicht als von der Spezifikation gefordert sehe, aber trotzdem ..)t^=32
zut^=w
unda[95],b[95]
zua[z],b[z]
. Der Code ist überraschend gut lesbar. Wahrscheinlich wegen der ausführlichen Kommentare!Python 3,
11661071993 BytesMir war erst klar, dass ich Könige davon abhalten musste, in Schach zu gehen, nachdem ich es anders beendet hatte, aber hier ist trotzdem meine Vorlage
Geben Sie zum Spielen vier durch Leerzeichen getrennte Zahlen ein, wobei die ersten beiden die Koordinaten des Teils sind, zu dem Sie sich bewegen möchten, und die zweiten beiden die Koordinaten, zu denen Sie sich bewegen möchten.
quelle
a=o*8;j=[list(s) for s in ["RNBKQBNR","P"*8,a,a,a,a,"p"*8,"rnbkqbnr"]]
.spilt()
bei Leerzeichen standardmäßig Splitting, verwenden Sie können soinput().split()
stattinput().split(" ")
2and
,1or
usw.)False
kann sein0!=0
.False
kann einfach sein0
-not 0
sollte gut funktionieren ...Entschuldigung für die Verspätung.
Das Programm heißt ChesSkelet. Derzeit werden 352 Byte für Code und Daten verwendet. Es wurde in Z80 Assembly geschrieben und speziell für das ZX Xpectrum.
Wenn Sie keine Lust haben, es zu kompilieren und in einen Emulator zu laden, können Sie es auf der ChesSkelet-Website ( http://chesskelet.x10host.com ) online spielen .
Das Programm ist ziemlich einfach, eine große Schleife, in der: - alternativ (1) Weiß seinen Zug eingibt oder (2) Schwarz seine Mikro-KI laufen lässt, um sich zu bewegen. - Die Karte wird auf dem Bildschirm aktualisiert. Auch hier gibt es eine umfangreiche Anleitung, die das Programm und die Techniken auf der Website beschreibt.
quelle
> <> 1467 Bytes
Nun, es bricht den 487-Byte-Rekord nicht ganz…
Probieren Sie es am Fischspielplatz ! (Es werden einige Fehler in diesem Interpreter verwendet, daher kann ich nicht versprechen, dass es irgendwo anders funktioniert. Wahrscheinlich möchten Sie es mit maximaler Geschwindigkeit ausführen - die Ausführung einer Bewegung kann über eine Minute dauern.)
Wenn Sie den Code ausführen, wird er gedruckt
Großbuchstaben stehen für Weiß, Kleinbuchstaben für Schwarz. Sie können dann Ihren Zug als Eingabe in das Formular eingeben
[a-h][1-8][a-h][1-8]
, z. B.e2e4
"Stück verschiebene2
nache4
". Das Programm druckt dann beispielsweiseDie Hauptform des Speichers in> <> ist der Stapel; Dies ist jedoch nicht sehr praktisch, um ein Schachbrett aufzubewahren. Stattdessen benutzte ich die selbstmodifizierende Funktion von> <>, um das Schachbrett als Teil des Quellcodes selbst zu speichern
g
und mit und darauf zuzugreifenp
.Der Großteil des Codes dient dazu, zu überprüfen, ob Ihr Umzug legal ist. Hier gibt es einige Dinge zu überprüfen:
Wenn eine dieser Fragen falsch beantwortet wurde, gibt das Programm einen Fehler aus und hält an. Andernfalls wird das Schachbrett im Quellcode bearbeitet, erneut gedruckt und auf den nächsten Zug gewartet.
Für die Königs- und Ritterzüge habe ich mir Level River Sts Trick geliehen, die euklidische Entfernung im Quadrat zu überprüfen: Für einen König sind es weniger als 3 und für einen Ritter genau 5.
quelle