=== KI-Contest ===
Dauer:
Bis Ende April(!)
Wir haben nun tatsächlich verlängert, um zwei Teilnehmern noch eine Teilnahme zu ermöglichen (hoffentlich).
Schwierigkeit:
Sehr zeitaufwändig
Kurzbeschreibung:
Programmierung einer selbstständig spielenden
Schach-KI, die irgendwie durch eine Partie Schach nach normalen Regeln durchkommt (ggf. auch mit zufälligen Zügen oder beliebiger Taktik) und dann gegen die KIs der anderen Mitwirkenden im Contest im Turnier antritt (Details siehe weiter unten). Referenzumgebung: Einbindung in winboard/xboard (siehe dazu auch Langbeschreibung unten und Tutorial)
Wichtig: Detailliertes zu Regeln etc. unten im Text und unter Gewinnbedingungen!
Einreichung:
E-Mail an
(entfernt weil veraltet) oder im Zweifelsfall lieber an
(entfernt weil veraltet) wo ich ein großes Postfach habe für größere Anhänge, oder hier direkt im Thread mit Link.
Rechtliches zur Einreichung:
Wer etwas einsendet, erklärt sich damit bereit, dass es zum Abschluss an alle (d.h. hier öffentlich im Forum) veröffentlicht wird, damit jeder die Ergebnis-KIs im persönlichen Heimmatch gegeneinander antreten lassen kann. (es sei denn ihr schickt mir Source und schreibt explizit, dass ich ihn für euch zur Windows-exe kompilieren soll und
nicht mitveröffentlichen, siehe Linuxnutzer/crosskompilierung unten im Detail)
Die Veröffentlichung erfolgt, wenn man mirs per Mail sendet, natürlich erst zum Stichtag (1. Mai), insofern nicht anders gewünscht
=== NEWS ===
*
Wir haben verlängert
*
Kurzes Tutorial zur KI-Einbindung in winboard, welches jedoch
nur die grafischen Optionen von winboard erklärt, um eine eigene .exe als Engine einzubinden,
enthält keinen Beispielcode zur Kreierung einer Engine.
=== Ausführliche Beschreibung ===
(1) Einführung
<Rausgenommen.>
(2) Verwendetes Protokoll
Bei der Kommunikation mit XBoard/WinBoard gibt man seine Befehle über stdout ab (d.h. normal mit printf()/cout und muss nur dafür sorgen, dass sie auch ungebuffert rausgehen) und holt sich die Befehle von XBoard/WinBoard über stdin ab.
xboard/winboard sendet einem über stdin die Züge des Spielers und über stdout gibt man seine eigenen Zugbefehle zurück.
Beispiel (<< eingehend über stdin, >> ausgehend über stdout, Kommentare per // hinter den Zeilen):
|
Quellcode
|
1
2
3
4
5
6
7
8
|
<< xboard //xboard identifiziert sich selbst
<< protover 2 //Protokollversion zwei
>> feature time=0 usermove=1 done=1 //hier sendet man, was man unterstützt bzw. nicht unterstützt, wobei done=1 am Ende den Befehl abschließt
<< new //Ein neues Spiel soll begonnen werden
[.. zeugs das man ignorieren kann zur schwierigkeitsgradeinstellung etc ..]
<< force
<< usermove c2c4
[Und nun muss man mit einer eigenen Bewegung reagieren]
|
Protokoll im Detail:
CECP (Chess Engine Communication Protocoll)
(3) KI-Einbindung
Die KI kann über das CECP-Protokoll nun in
xboard/winboard (Download für Windows schwer auffindbar, findet sich
HIER) einbinden und z.b. gegen sich selbst, die GNU Chess KI oder gegen eine andere KI antreten lassen.
Das CECP-Protokoll ist auch von
anderen Schachprogrammen wie z.B.
Checkmate implementiert, falls einem ein solches besser gefällt. (oder z.b. Arena)
Einbindung
nun auch als Kurztutorial!
Linuxnutzer: PyChess ist deutlich hübscher als xboard und in den meisten repos (man muss die eigene Engine nur in .pychess/engines.xml eintragen)
(4) So, darum geht's also:
Ziel des Contests ist es also, eine simple Konsolenapplikation zu bauen, die über das CECP-Protokoll Schachzüge entgegennimmt und eigene ausführt (es ist dabei
nicht nötig, dass das CECP-Protokoll vollständig oder funktional implementiert wird, solange es gerade für ein lineares Spiel ohne Sonderfunktionen wie undo ausreicht) und so möglichst bis zum Ende eines Spiels ohne Abstürze oder ohne einen validen Zug zu finden durchkommt, sodass die verschiedenen Contestteilnehmer ihre Schach-Applikationen in xboard einbinden und gegeneinander antreten lassen können.
Programmiersprache ist egal,
Einreichungen der Programme sollten eine
.exe oder irgendwas möglichst einfach auf Windows lauffähiges sein (denkbar wäre auch Python), das man irgendwie per xboard/winboard eingebunden kriegt (müsste man für Python vmtl. die exe des Pythoninterpreters mit Kommandozeilenaufruf des Skripts angeben). .Net ist natürlich auch akzeptabel (wobei ich selbst als Testumgebung nur XP, d.h. .Net 2.0 oder sowas? dahabe)
Tipp für Linuxnutzer: Reine Konsolenprogramme in C/C++ sind ohne größere Schwierigkeiten mit Crosscompilern als Windows-exe von einem Linuxrechner aus kompilierbar, da sie kaum bis keine Abhängigkeiten abseits der normalen Clib haben. Wenn jemand einen C/C++-Beitrag hat, helfe ich auch gerne dabei (insofern er nicht zu exzessiv Unixspezifische Syscalls/libs einbindet, wobei mein eigener Beitrag in C aber fast komplett crossplatform/eingleisig ausfällt, wie ich als Linuxnutzer anmerken möchte).
=== GEWINNBEDINGUNGEN ===
Gewinner:
* Seine KI kommt durch ein ganzes Spiel winboards Schachengines
Fruit und Fairy-Max ohne Probleme. Sie stürzt nicht ab, und besteht nicht auf invalide Moves
* Sollte obiges auf mehrere zutreffen, findet ein Turnier statt. Ggf. Turnierplan. Wer hier mit invaliden Zügen oder Absturz patzt, hat automatisch die Partie verloren
* Nicht richtig erkanntes Spielende soll toleriert werden (falls das jemals vorkommt), xboard/winboard beendet das Spiel selbstständig, wenn es eine Endbedingung erkennt.
* Insofern genügend Leute eine KI zustande bringen, könnten auch
mehrere Turniere ausgetragen werden (Vorschläge oder was ihr darüber denkt sehr willkommen) - es gibt aber
ein verbindliches Hauptturnier: Regeln siehe spätere Sektion zum Hauptturnier (runterscrollen bzw. weiterlesen!)
Abgabe bis zu Beginn des 1. MAI.
Externe Schachbibliotheken sind IMHO insofern ok, sofern sie nur die Regeln beinhalten/valide Züge prüfen/ausspucken und nicht selbst Züge vorschlagen oder Stellungen für die KI bewerten. Auch die Einbindung eines Eröffnungsbuches, falls sich jemand tatsächlich so viel Mühe machen will, sollte ok sein. Jegliche externe Einbindungen dieser Art sollten jedoch
deutlich gekennzeichnet/erwähnt werden, sodass die Sache transparent für jeden bleibt.
=== Offizielle Turniergewinnregeln: ===
* Gespielt wird nach normalen Schachregeln. Das beinhaltet
Remis nach 3maliger Wiederholung und nach 50 Zügen ohne Schach (glaube ich... auf Wikipedia iim Detail nachzulesen) - Remis muss eine Engine jedoch nicht zwingend erkennen, das tut afaik winboard oder man kann das Spiel ja ebenso als Beobachter dann anhalten
* Zusätzlich gibt es Turnierbedenkzeit. 40 Züge in 5 Minuten (d.h. anfängl. 5 Minuten Denkzeit, nach 40 Zügen bekommt man neue 5 Minuten auf sein Zeitkonto). Wenn einer KI die Zeit ausgeht, hat sie verloren, insofern der Gegner sie
irgendwie noch hätte Matt schlagen können. Ist dies von der Figurenwahl überhaupt nicht mehr möglich, so gibt es ein Remis.
* Turnierplan:
fehlt. aaa
=== Ein kleines Programmiertechnisches Detail ===
Wie das Protokolldokument oben beschreibt, hat stdin/stdout, das ja eigentlich mit printf/gets bedienbar ist, den Nachteil, das es in beide Richtungen buffert (d.h. Eingaben nur verzögert ankommen können und ebenso die Ausgaben nur verzögert bei xboard/winboard).
Als Tipp möchte ich erklären, wie ich dies in C umgehe (aber das Protokolldokument oben zum CECP-Protokoll geht darauf auch ein): Ich wrappe printf() mit einer Funktion, die immer fflush(stdin); ausführt zur Umgehung des stdout-Bufferings; auf stdin benutze ich einfach read() statt gets() (d.h. eine Socketfunktion) und prüfe mit select(), ob Output da ist (wobei das sicher auch etwas simpler geht).
Abgesehen davon ist nur die Implementation eines funktionierenden Schachframeworks die programmiertechnische Herausforderung.
(Als Tipp dazu: Rochade & En passant beachten (am Besten die genauen Regeln dazu auf Wikipedia mal nachgucken), es hilft dabei sehr, wenn man in der internen Schachbrettrepräsentation ein flag für jedes Spielfeld hat, ob sich die Figur darauf schonmal bewegt hat)