Schönen guten Tag Community!
Ich freue mich dass sich (aus meine Ansicht heraus) genug Interessenten gefunden haben, sodass der Wettbewerb „AI Fight“ starten kann. Was wäre aber ein fairer Wettbewerb wenn nicht vorab einige Spielregeln festgelegt werden?
Wichtig: Bitte benutzt immer die aktuellste AutoIt Stable.
Ziel des AI Fight
Es geht darum für verschiedene Spiele (wofür entsprechende Umgebungen bereit gestellt werden) sog. künstliche Intelligenzen (eng.: Artificial Intelligence) zu schreiben. Die einzelnen AI's treten gegeneinander an um die beste AI zu ermitteln und zu krönen. Im Vordergrund steht natürlich der Spaß am Programmieren. Dadurch versteht es sich natürlich von selber dass Fairness groß geschrieben wird. Zu Gewinnen gibt es nichts, außer die neuen Erkenntnisse die aus dem Wettbewerb gewonnen werden können.
Die Spiele
Die einzelnen Spiele gehen in die verschiedensten Richtungen. Ich bin sicher dass für jeden was dabei sein wird. Grundsätzlich variiert die Schwierigkeit und Aufwendigkeit zum schreiben einer AI pro Spiel. Das hängt stark mit zusammen ob es sich eher um ein Strategie oder ein Würfel-/Kartenspiel handelt. Manche Spiele werden euch vielleicht bekannt vorkommen, ich kann leider unmöglich alles neu erfinden, jedoch bemühe ich mich auch Spiele zu entwerfen die es in dieser Form noch nicht gibt. Vielleicht klau ich hier und da mal eine Idee die ich mal im Netz gefunden habe.
Die Spielumgebung
Eine Spielumgebung wird (und muss logischerweise) von mir bereit gestellt werden. Zu der Spielumgebung gehört das eigentliche Spiel und ggf. die grafische Ausgabe der einzelnen Spielrunden. Beides werden als getrennte Skripte geliefert. Zu jedem bestrittenen Spiel wird eine Log-Datei geschrieben, die jede Entscheidung, Bewegung und jede Spielrunde dokumentiert. So dauert später das Testen sowie auswerten der einzelnen AI's nicht ganz so lange, da die grafische Ausgabe vom eigentlichen Spiel getrennt wurde. Die Log-Dateien können nämlich im 2ten mitgelieferten Skript abgerufen und abgespielt werden. So können die einzelnen Spielrunden Schritt für Schritt beobachtet werden. Später werden auch sämtliche Spielrunden die bei der Auswertung gespielt wurden mitgeliefert. Das hat den Sinn, dass jeder von euch nachprüfen kann dass ich keine Spieler bevorzuge und alles mit rechten Dingen zuläuft.
Aufbau der AI
Die komplette AI muss aus Funktionen bestehen. Ob ihr mir 10 *.au3 Files oder nur eine einzige liefert ist mir egal. Wichtig ist nur, dass kein Code selbständig ausgeführt wird. Einzige Ausnahme bildet hier das Registrieren eurer AI. Alle relevanten Spieldaten erhaltet ihr über die Parameter. Diese Werte könnt ihr beliebig auswerten. Alle möglichen Rückgabewerte (also die Aktionen eurer AI) werden als globale Konstanten definiert. Ich bitte darum die Konstanten zu nutzen für den Fall, dass ich Änderungen an der Spielumgebung vornehmen muss. Es könnte vorkommen dass sich Rückgabewerte verändern, damit ihr eure AI's nicht umschreiben müsst ist es einfacher die Konstanten zu nutzen. Die genauen Rückgabewerte sowie Parameter werden in den einzelnen Spielen beschrieben.
Die zu registrierende Funktion könnt ihr euch selber aussuchen, wichtig ist dabei nur, dass die Anzahl der Parameter später stimmen. Die Funktion _AIFight_Register($hFunc, $sName, $bDB) welche die einzelnen AI's registriert wird in jedem Spiel gleich sein. In dem ersten Parameter übergibt ihr das Handle eurer Funktion (nicht als String, sondern wirklich als Funktionshandle), mit dem zweiten euer Benutzername hier im Forum. Mit dem dritten Parameter gibt ihr an ob eine Datenbank verwendet wird. Setzt den Aufruf einfach so ziemlich am Anfang eurer *.au3 Datei, sodass ich später nur noch die AI's inkludieren muss. Ein Beispiel:
[autoit]_AIFight_Register(_MG_AI, 'Make-Grafik', True)
[/autoit][autoit][/autoit][autoit]Func _MG_AI($vParam1, $vParam2, $vParam3)
; Irgendwelcher Code in der AI
EndFunc
Funktionsnamen, globale Variablen und deren Präfix
Damit es später nicht zu Doppelverlegungen einzelner Funktionsnamen oder globalen Variablen gibt, ist das Präfix $AIFight_[...] für Variablen sowie _AIFight_[...]() für Funktionen reserviert. Alle die an dem Wettbewerb teilnehmen wollen (egal ob jetzt oder in naher Zukunft) haben ihren eigenen Präfix zu reservieren. Eine Liste mit allen reservierten Präfixen wird am Ende der Spielregeln ausgehängt. Wer einen Präfix reservieren möchte (oder ändern) schreibt mir bitte eine private Nachricht. Was Ihr danach für Bezeichnungen (also nach euren Präfix) wählt, ist mir so ziemlich egal. Es dient nur dazu um zu verhindern, dass meine SciTE einen Error nach dem anderen anzeigt.
Allgemeine Spielregeln
Sofern in den Beschreibungen der einzelnen Spiele nichts anderes festgelegt wird, sind folgende Regeln gültig:
> Programmiert wird ausschließlich in AutoIt. Jede eingereichte AI muss selber verfasst sein, darf jedoch externe UDF's mitliefern und auch nutzen. Was nicht gewünscht ist sind DLL's in der die eigentliche AI ausgelagert wurde. Genauso verhält es sich mit Assembler. Bleibt fair und schreibt die eigentliche Logik eurer AI in AutoIt.
> Jede AI hat nur eine begrenzte Ausführungszeit zur Verfügung. Dabei werden alle Runden gemessen und der Durchschnittswert berechnet. Sollte dieser über 3 Sekunden liegen (was schon ein großer Spielraum ist) so wird der User disqualifiziert. Er hat jedoch die Möglichkeit seine AI innerhalb von 3 Tagen nachzubessern. Testet eure AI also regelmäßig vorab.
> Manipulation der Spielereignisse außerhalb der vorgesehen Schnittstelle (also der registrierten Funktion und dessen Rückgabewert) ist ausdrücklich unerwünscht. Dies zeigt mir nur dass ihr keinen Sinn für Fairness und Sportsgeist habt.
> Nach der Veröffentlichung der Spielregeln + Spielumgebung habt ihr 28 Tage Zeit (also 4 Wochen) um eure AI zu schreiben. Ich denke der Zeitraum ist hier groß genug gewählt. Je nach Spiel kann sich dieser auch noch vergrößern oder verlängern (sofern dies mehrere Teilnehmer wünschen).
> Jede AI die in irgendeiner Weise einen Fehler enthält (wenn mir die SciTE ein Error entgegen spuckt oder ein falscher Wert zurück gegeben wird) wird disqualifiziert. Auch hier habt ihr die Möglichkeit innerhalb von 3 Tagen eure AI nachzubessern.
> Ihr könnt gerne mehrere AI's einsenden, jedoch nimmt nur die zuletzt eingesendete AI am Wettbewerb teil. Eure AI könnt ihr mir als private Nachricht zukommen lassen. Bitte nutzt als Betreff „AI Fight – Einsendung“ damit ich auch weiß dass es sich um eine Einsendung handelt.
Wie man sieht gibt es nicht viele Spielregeln, das wichtigste ist einfach nur dass ihr Spaß habt und Fair bleibt. Wer sich dies beherzigt wird keine Probleme haben. Bitte testet eure AI's vor der eigentlichen Abgabe selber ausgiebig. Alle Einsendungen werden natürlich von mir auch nochmal getestet. Falls irgendwas nicht stimmen sollte schicke ich euch für's Debuggen die Log-Datei sowie die Fehlermeldung zu. Ihr könnt eure AI dann bis zum Abgabetermin natürlich dann verbessern.
Datenbanken
Grundsätzlich sind Datenbanken welche vorausberechnete Spielzüge enthalten erlaubt. Nach gründlichen Überlegungen bin ich zu dem Schluss gekommen dass eine Größe der Datenbanken von 1'048'576 Byte (1 MB) mehr als ausreichend ist. Wer ein wenig platzsparend ist und sich was einfallen lässt wird damit keine Probleme haben. Dies gilt als Maximalgrenze und darf nicht mal um einen einzigen Byte überschritten werden. Außerdem darf die Datenbank auch nur aus einer einzigen Datei bestehen (damit ich die einzelnen Dateigrößen später nicht zusammenrechnen muss). Die Datenbank direkt im Skript zu hinterlegen ist unerwünscht. Als Dateiname ist der Präfix DB_ zu wählen und danach euren AutoIt Username. Beispiel: DB_ShitDown (Ohne Dateiendung)
Hinweis: Wer temporär Daten abspeichern möchte (während der Laufzeit) kann dies gerne tun. Hinterher müssen diese Daten aber wieder von eurer KI selbständig gelöscht werden. Dafür erinnere ich einfach mal an die Funktion OnAutoItExitRegister(). Hier liegt kein Limit für die Dateigröße vor, da es ja eure 3 Sekunden sind die Ihr euch einteilen müsst. Alle temporären Daten müssen als Präfix euren Variablenpräfix nutzen. Welche Dateiendung Ihr hierfür nimmt ist mir in diesem Fall wurscht. Beispiel: $MG_TempFile.txt
Wer die vorgegebene Datenbankgröße überschreitet (auch während der Laufzeit) wird disqualifiziert und hat 3 Tage Zeit zur Nachbesserung.
Teilnehmerzahl
Die Anzahl der AI's die gegeneinander antreten ist in jedem Spiel unterschiedlich. Es ist auch möglich dass AI's für eine einzelne Runde im Team spielen. Bitte beachtet dies bei der Programmierung. Folgende Kombinationen sind möglich:
2 Spieler:
1 vs 1 → Hier treten die AI's einfach nur gegeneinander an.
4 Spieler:
All vs All → Alle gegen Alle, der Beste gewinnt.
2 vs 2 → 2 Spieler jeweils in einem Team.
3 vs 1 → 1 Spieler muss sich gleich gegen 3 AI's behaupten.
Ich persönlich werde am Wettbewerb nur teilnehmen falls dass von der Teilnehmerzahl nicht ganz passt. Wie nachher der eigentliche Wettbewerb abläuft (also wer gegen wen spielt) kann ich vorher schlecht vorhersagen. Es hängt ja immer von der Teilnehmerzahl ab, aus diesem Grund kann ich mich da nur nach allen Einsendungen festlegen. Jedoch sollte es aus den Spielregeln erkennbar sein welche der oberen genannten Kombinationen Verwendung finden könnten. Aus diesem Grund müsst ihr eure AI schon etwas flexibel gestalten.
Newcomer Angebot
Da ich weiß dass nicht jeder in der Lage ist eben mal so eine AI zu schreiben, gibt es von mir ein spezielles Angebot. Jeder der es einfach nicht schafft (egal ob jetzt Ansatzpunkte fehlen oder eben die nötigen Sprachkenntnisse) kann sich bei mir per PN melden. Ich helfe dann jeden in einen angemessenen Rahmen. Meine Hilfestellung könnte z.B. so aussehen, dass ich auf bestimmte Internetadressen verweise die das Thema behandeln oder euch Ansatzpunkte liefere. Die eigentliche AI müsst ihr natürlich selber schreiben. Ich möchte euch lediglich dabei beim Lernen unterstützen. Da ich natürlich nicht in euren Kopf rein gucken kann, setze ich einfach auf die Ehrlichkeit der User. Nutzt dieses Angebot bitte nicht aus, versucht es erst einmal selber!
Ich denke die Spielregeln sind sehr human gehalten. Natürlich freue ich mich wenn gleich beim ersten Spiel viele Teilnehmer mitmachen. Unabhängig davon wie viele Teilnehmer mitmachen wird es definitiv 3 Wettbewerbsspiele geben. Danach schaue ich ob es Sinn macht es fortzuführen oder eben nicht. Natürlich hoffe ich auf Ersteres. Falls noch Fragen da sind oder Punkte ungeklärt, so hinterlasst mir einfach eine Antwort hier im Thread. Ansonsten findet ihr hier die Liste mit allen reservierten Präfixen:
User | Präfix |
ShitDown | $MG_[...] & _MG_[...]() |
Lottich | $Lo_[...] & _Lo_[...]() |
General Kaboom | $Shelbot_[...] & _Shelbot_[...]() |
Kanashius | $KanAI_[...] & _KanAI_[...]() |
draien | $Drabot_[...] & _Drabot_[...]() |
chip | $chip_[...] & _chip_[...]() |
Mars | $M_[...] & _M_[...]() |
GtaSpider | $spider[...] & _spider[...]() |
teamnoobPDB | $pdb_[...] & _pdb_[...]() |
Der erste Wettbewerb wird voraussichtlich Mitte Februar starten. Vielleicht auch schon früher, mal schauen. In der Zwischenzeit könnt ihr euch mit mir über die Spielregeln diskutieren.
LG. Make