Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Elmaron

unregistriert

1

08.01.2010, 23:11

#13: "Komplexer KI-Contest", Spezial, 01.05.2010

=== 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)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Elmaron« (07.01.2020, 23:04)


C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

2

08.01.2010, 23:19

Oh, schön, ich werde es auf jeden Fall mal demnächst versuchen. ;)
Ob ich was zu Stande bringe, ist aber eine andere Frage. ;)

EDIT: .Net ist auch zugelassen :), ich glaub ich werd das dann Mal mit C# versuchen ;)
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

rootnode

Frischling

Beiträge: 92

Wohnort: Aachen, Pontstraße

Beruf: Student

  • Private Nachricht senden

Elmaron

unregistriert

4

08.01.2010, 23:32

Bezüglich des Contests: Dieser wird vermutlich auf einem XP-Rechner bei mir im Hause laufen. Die Maschine dort hat um die 2Ghz (muss nochmal nachgucken), also sollte man damit rechnen, dass die jeweilige KI dort langsamer läuft als auf dem hauseigenen Quad Core. Wenn also jemand zeitlich optimieren will (ich denke, wir werden wohl ein Turnier mit Zeitbegrenzung und eins ohne machen, oder vllt. 3 mit viel Zeit, weniger Zeit und unendlich viel Zeit), sollte er das im Auge behalten.

Heiji Hakoda

unregistriert

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

6

08.01.2010, 23:46

Zitat von »"Heiji Hakoda"«



Naja. Die Engine kämpft sich einigermaßen ohne Fehler durchs Spiel! :) Aber gut ist sie nicht!^^

Würd aber eh gerne hier auch mitmachen. Nur kenn ich mich nicht ganz aus. Wie ich anfangen muss.
Wie bekomm ich die Züge des Gegners, wie muss ich meine Züge bekannt geben?? Wie bringe ich das zum Laufen?
Sorry, dass ich mich so dumm anstelle. :roll:

Heiji Hakoda

unregistriert

7

08.01.2010, 23:52

wie wird eigentlich der spielverlauf verfolgt, die spiele müssten doch nach ca. 3 sekunden alle fertig sein

Elmaron

unregistriert

8

09.01.2010, 00:20

Heiji Hakoda: du unterschätzt den Rechenaufwand enorm! Z.b. die spielstarke Engine GNU Chess rechnet bis zu 5 Sekunden an einem Zug rum, und wenn du schlecht optimierst, kannst du gut und gerne deutlich länger rumrechnen. Abgesehen davon ermöglicht es einem xboard natürlich, den genauen Zugverlauf mitzuprotokollieren, den ich dann auch gerne für das Turnier veröffentliche.
(Das Ausrechnen eines guten Schachzuges braucht exponentiell mehr Zeit umso tiefer du dich einrechnest, von demher könnte man Stunden für die Berechnung eines Zuges zubringen, insofern man wollte)

Käsekönig: Siehe der Post oben. Dort ist ein Beispiel. Weißt du was stdin/stdout ist? Wenn nicht, lies es unbedingt im Tutorial deines Vertrauens nach. stdin/stdout unbuffered hinzukriegen ist nicht ganz trivial und wie du das anstellen musst, hängt auch ein wenig von der Programmiersprache ab.
@Beispiel: Dort siehst du, wie du die Züge bekommst. Du sendest sie im selben Format ab, aber siehe auch das verlinkte Protokolldokument. Die Startaufstellung, die nicht extra mit übertragen wird, ist wie immer im Schach üblich (starte einfach xboard/winboard und schau sie dir an), sollte also einfach fest in deine KI einprogrammiert sein.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

9

09.01.2010, 11:19

Och nöö...
Dafür habe ich leider zu wenig zeit :(
Schade, beim nächsten mal vielleicht...

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Atlan123

1x Contest-Sieger!

  • Private Nachricht senden

10

09.01.2010, 15:38

Super Contest! Ich hoffe ich werde die ein oder andere Stunde Zeit finden.
"I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." (Bjarne Stroustrup)

Werbeanzeige