[close] AI Fight #1 - Snake

  • Soa ihr Lieben! :)
    Nachdem ich euch nun solange warten gelassen habe, kann ich nun (endlich) verkünden dass der erste AI Fight starten kann. Vorab: Das Allgemeine Regelwerk findet ihr in diesem Thread. Das erste Spiel ist ein Klassiker und eine etwas einfachere Aufgabe. Ihr sollt für ein Multiplayer Snake Game eine AI schreiben welche eure Schlange solange wie Möglich wachsen lässt. Für alle die Snake nicht kennen, hier eine kurze Erklärung:

    Snake ist ein Singleplayer Spiel. Ihr steuert eine Schlange die immer weiter wächst. Jedes mal wenn Ihr ein Futterstück auf der Karte einsammelt, wächst eure Schlange um ein Feld und ihr erhaltet Punkte. Ziel ist es seine Schlange so lang wie möglich zu füttern. Das Spiel endet sobald sich die Schlange selber beißt. Je nach Variation könnt ihr am Spielfeldrand hinaus und kommt auf der gegenüberliegenden Seite wieder hinein.

    In der hier angebotenen Multiplayer Variante spielen 2 AI's gegeneinander. Das Ziel bleibt das Gleiche, eure Schlange soll so lang werden wie nur möglich. Jedoch endet das Spiel sobald ihr gegen die Wand am Spielfeldrand steuert oder ihr in den eigenen oder fremden Schlangenkörper beißt. Beide Schlangen bewegen sich zeitgleich, dadurch ist es möglich dass auch beide Schlangen verlieren. Dies wird als unentschieden gewertet.

    Die AI's treten in einen Punkte basierenden KO System an. Das bedeutet, 2 AI's spielen mehrere Runden gegeneinander und sammeln Punkte, jene AI welche die meisten Punkte sammeln konnte, rückt in die nächste Runde vor. Dies wird solange wiederholt bis wir einen endgültigen Sieger haben. Die Punkte werden je nach Spielfeldgröße vergeben. Dabei erhaltet ihr 1% multipliziert mit der Anzahl der Felder an Punkten für jedes gefressene Futterstück. Und 25% an Punkten für jede gewonnene (kein unentschieden) Runde. Ein Beispiel: Bei einer Spielfeldgröße von 20x20 (also 400 Felder) erhaltet ihr für jedes Futterstück 4 Punkte und für jeden Sieg 100 Punkte.

    Die Interaktion zur AI habe ich euch so angenehm wie möglich gestaltet. Ihr registriert eure AI einfach mit der Funktion _AIFight_Register ( $sUser, $hFunction [, $sDatabase = Null ]). In dem ersten Parameter übergebt ihr einfach euren AutoIt Benutzernamen. In dem zweiten Parameter wird der Funktionshandle zu eurer AI entgegen genommen. Im dritten Parameter (falls benötigt) könnt ihr den Dateinamen zu eurer Datenbank angeben. Achtung! Bitte keine Pfadangaben, diese wird selbständig in der Ordnerstruktur gesucht. Tatsächlich nur den Namen mit der entsprechenden Dateiendung. Im angehängten ZIP Archiv findet ihr die gesamten Wettbewerbsdateien. Darunter auch einen Ordner namens User. Dort habt ihr eine Beispiel AI wie ihr eure AI registriert. Ihr könnt die Dateien einfach umbenennen und dies als Vorlage nutzen.

    Eure AI nimmt 4 Parameter entgegen: User_AI ( $aMap, $aSnakeMe, $aSnakeRival, $hTime ). Im ersten Parameter erhaltet ihr ein 2 dimensionales Array mit der kompletten Map. Damit ihr wisst was was ist, habe ich euch schon Konstanten vordefiniert, dazu komme ich aber gleich erst. Im zweiten Parameter erhaltet ihr ein 2 Dimensionales Array zu eurer eigenen Schlange. Das Array ist folgendermaßen aufgebaut:

    Code
    $aSnakeMe[0][0] = Anzahl der Elemente
    $aSnakeMe[0][1] = Blickrichtung der Schlange
    $aSnakeMe[1][0] = Schlangenkopf x-Koordinate
    $aSnakeMe[1][1] = Schlangenkopf y-Koordinate
    $aSnakeMe[i][0] = Körperteil x-Koordinate
    $aSnakeMe[i][1] = Körperteil y-Koordinate

    Über den dritten Parameter erhaltet ihr die Position das Array der gegnerischen Schlange. Dieses Array ist genauso aufgebaut wie der euren Schlange. Im vierten und letzten Parameter erhaltet ihr ein Timerhandle. Mithilfe der Built-in Funktion TimerDiff ( handle ) könnt ihr immer nachmessen wie viel Zeit seit dem Funktionsaufruf vergangen ist. Zum testen eurer AI registriert eure Funktion bitte 2 mal da ich keine eigene AI als Testgegner integriert habe.

    In der AIFight.au3 findet ihr das eigentliche Spiel. Dieses erstellt lediglich eine Log Datei. Dies hat spielt später für die Auswertung und das Debuggen eurer AI eine Rolle. Einmal soll das die Auswertung fix gehen und zum anderen könnt ihr so jede Aktion nachlesen. Auch später nach der Auswertung erhaltet ihr alle Log Dateien damit ihr sehen könnt, wie die anderen AI's (sowie eure eigene) agiert haben. In Zeile 12 braucht ihr nur eure eigene au3 Datei inkludieren, damit ihr eure eigene AI testen könnt. In der AIFight_GUI.au3 könnt ihr euch die Bewegungen ansehen. Einfach mal ausprobieren.

    Soa, nun steht euch aber auch noch eine andere Funktionen zur Verfügung. Mithilfe der Funktion _AIFight_LogFile ( $sData ) könnt ihr in der Log Datei eigene Einträge verfassen. Wichtig ist nur, dass ihr nicht das Zeichen größer als („>“) nutzen dürft. Ansonsten steht euch frei was ihr da rein schreibt. Um nicht ständig zwischen eurer au3 und der AIFight.au3 wechseln zu müssen, könnt ihr in eure AI die Funktion _AIFight_Run( $sWorkingDir ) benutzen. Ihr müsst lediglich einen relativen Pfad zu der AIFight.au3 angeben. Danach wird diese bei jedem ausführen selbständig gestartet. So könnt ihr euch ganz auf eure AI konzentrieren.

    Zu guter Letzt kommen wir noch zu den Konstanten. Ihr habt einmal allgemeine Informationen zu den Spielbedingungen.

    [autoit]

    Global Const $AIFight_DBSize = 0x00100000
    Global Const $AIFight_Time = 3000
    Global Const $AIFight_MapX = 10
    Global Const $AIFight_MapY = 10
    Global Const $AIFight_Rounds = 1

    [/autoit][autoit][/autoit][autoit]

    Global Const $AIFight_PointsFeed = Ceiling($AIFight_MapX * $AIFight_MapY * 0.01)
    Global Const $AIFight_PointsWin = Ceiling($AIFight_MapX * $AIFight_MapY * 0.25)

    [/autoit]

    Die erste Konstante gibt an welche Dateigröße (in diesem Fall 1MB) eure Datenbank (falls vorhanden) in Byte nicht überschreiten darf. Die zweite Variable steht für die Anzahl der Millisekunden die ihr für einen Funktionsaufruf zur Verfügung habt. Später wird der Durchschnitt berechnet, im Grunde könnt ihr auch einmal 5 Sekunden und einmal 1 Sekunde nutzen, bleibt ja bei 3 Sekunden im Durchschnitt. Die nächsten Beiden geben die Spielfeldgröße an, und die letzte die Anzahl der Runden die 2 AI's gegeneinander spielen.

    Die nächsten 4 Konstanten $AIFight_Top, $AIFight_Right, $AIFight_Bottom und $AIFight_Left geben die Blickrichtung der Schlange an. Einer dieser Werte ist in dem Array des 2ten bzw. 3ten Parameters gespeichert ($aSnake[0][1]).

    Nun kommen wir zum Rückgabewert eurer AI, ihr müsst einen der 3 Konstanten zurückgeben:

    [autoit]

    Global Const $AIFight_MoveStraight = 0
    Global Const $AIFight_MoveRight = 1
    Global Const $AIFight_MoveLeft = 3

    [/autoit]

    Ihr gebt also an in welche Richtung (ausgehend von der Blickrichtung) sich eure Schlange bewegen soll. Entweder gerade aus, nach rechts oder nach links.

    Die nächsten 4 Konstanten sind die allgemeinen Werte. Mithilfe einer BitAND Abfrage könnt ihr im Array (welches ihr im 1. Parameter übergeben bekommt) ermitteln ob ein Feld besetzt ist oder nicht.

    [autoit]

    Global Const $AIFight_MapFree = 0
    Global Const $AIFight_MapFeed = 1
    Global Const $AIFight_MapSolid = 2
    Global Const $AIFight_MapWall = 6 ; 4 or MapSolid

    [/autoit]

    MapFree und MapFeed kommen lediglich alleine vor. Ist ein Feld frei, so ist es mit MapFree (0) gekennzeichnet, liegt auf dem Feld ein Futterstück, so ist es mit MapFeed (1) belegt. Mit MapSolid (2) sind alle Felder gekennzeichnet die durch eine Schlange oder durch eine Mauer verdeckt sind. Dafür benötigt ihr die BitAND Funktion. Im Grunde relativ einfach zu benutzen: If BitAND($aMap[x][y], $AIFight_MapSolid) Then .... Die MapWall (6) kennzeichnen die Wände. Diese sollten nach Möglichkeit vermieden werden. ^^

    Ansonsten stehen euch noch die Körperteil spezifischen Konstanten zur Verfügung. Ich denke dass weitere Erklärungen nicht notwendig sind. Alles was also in der AIFightConst.au3 enthalten ist, dürft ihr nach Herzenslust einsetzen. Falls Fragen auftauchen, immer nachfragen.

    Die Spielfeldgröße sowie Anzahl der Runden lege ich nach dem Abgabetermin fest. Lediglich die erlaubte Datenbankgröße sowie die 3 Sekunden Ausführungszeit stehen schon fest. Abgabetermin ist der 18. März 2015 um 23:59 Uhr. Wer mir später seine Einsendung schickt nimmt nicht am Wettbewerb teil. Ich wünsche viel Spaß und gutes gelingen! :)

    PS: Dies ist mein erster Wettbewerb in dieser Form. Daher brauchte ich diese lange Vorbereitungszeit um erst mal alles zu planen. Die kommenden Wettbewerbe werden auch in dieser Form ablaufen. Jedoch werde ich immer versuchen euch alles so angenehmer wie möglich zu machen. Falls Bugs auftreten bitte sofort melden damit ich's schnellstmöglich fixen kann. Und denkt daran eure reservierten Präfixe zu nutzen bzw. noch einen zu registrieren! ^^

    2 Mal editiert, zuletzt von Yjuq (18. Februar 2015 um 22:27)

  • Irgendwas stimmt da nicht. Nach dem ersten Zug springt das Futterstück an eine andere Position, zumindest in der GUI-Anzeige. Im Anhang mal ein ganz simples Logfile.

    Edit: Ist wirklich nur ein Anzeigefehler in der GUI-Ausgabe, also halb so schlimm.

    Von welcher Ecke gehen den die Map-Koordinaten aus? Links oben?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    4 Mal editiert, zuletzt von chip (19. Februar 2015 um 10:00)

  • Das bedeutet, 2 AI's spielen mehrere Runden gegeneinander und sammeln Punkte, jene AI welche die meisten Punkte sammeln konnte, rückt in die nächste Runde vor. Dies wird solange wiederholt bis wir einen endgültigen Sieger haben


    Bin etwas verwirrt. Ist die Anzahl der Runden nun vorerst fix und wird nur bei Gleichstand erweitert bis es einen Sieger gibt oder wann tritt der "endgültige Sieg" ein? Und wenn die Anzahl fix ist, wieviele Runden sind es bis es zur "Verlängerung" kommt? Speziell der Satz "rückt in die nächste Runde vor"... Ist das eine andere Runde als die genannten "Runden"?

    Edit:
    Desweiteren steht im Regelthread:_AIFight_Register($hFunc, $sName, $bDB)
    während hier geschrieben ist: _AIFight_Register ( $sUser, $hFunction [, $sDatabase = Null ])

    Also ist Func und Name vertauscht. Sollte man vielleicht anpassen oder im Regelthread auf das jeweilige Spiel verweisen :)

    Einmal editiert, zuletzt von draien (19. Februar 2015 um 11:53)

  • Soa :)

    chip:
    Danke für dein Bug Report. Die meisten Bugs die noch enthalten waren habe ich auf der Heimfahrt von Berlin gestern gemacht. Meine Woche war sowieso bisschen anstrengend und bin doch froh dass ich zumindest den Wettbewerb noch gestern starten konnte (so wie ich's in der Shotbox angekündigt habe). Den Bug fixe ich auch schnellstmöglich.

    Zitat

    Von welcher Ecke gehen den die Map-Koordinaten aus? Links oben?


    Ja, es wird von der linken oberen Ecke ausgegangen. Falls du _ArrayDisplay() benutzen solltest, setz davor noch ein _ArrayTranspose() damit dieses richtig dargestellt wird.

    draien:
    Entschuldige bitte meine unklare Formulierungen. War sowieso gestern schon müde als ich den Text verfasst habe. Ich versuch's einmal zu erklären, dafür benutze ich aber mal die etwas eindeutigeren Begriffe „Wettbewerbsrunde“, „Spielrunde“ und „Runde“.

    Nehmen wir mal an 10 Teilnehmer würden mitspielen. Der Einfachheitshalber tragen die Spieler die Namen von A bis J. Zuerst lose ich auch welche Spieler (also deren AI logischerweise) gegeneinander spielen:

    Nun spielen Spieler B und A eine vordefinierte Anzahl an Runden. Sagen wir mal 50 Runden. Diese 50 Runden zusammengepackt sind die Spielrunden. Wer von den beiden nach den 50 Runden die meisten Punkte erzielen konnte, gewinnt diese Spielrunde. Gleiches wird nun für Spieler G und H wiederholt. Damit wäre auch schon eine Wettbewerbsrunde abgeschlossen. Die Spieler D, I, E, C, G und J haben eben Glück gehabt, dass sie (aufgrund der Teilnehmerzahl) eine Wettbewerbsrunde weniger haben. Die Gewinner der vorherigen Wettbewerbsrunde treten gegeneinander an und eine neue Spielrunde wird gestartet. Dies wird solange fortgeführt (dh. Auch punkte basierendes KO System) bis ein Gesamtsieger feststeht.

    Den Thread mit den allgemeinen Regeln werde ich sowieso nochmals überarbeiten. Zwar wird sich sinngemäß nicht viel verändern, aber es soll anschaulicher werden. Zudem werden auch diese kleinen Sachen geändert wie der plötzliche Wechsel der $sUser und $hFunc Parameter. Da ich für dieses (ich sag mal so:) vorläufige Regelwerk alles planen musste, wusste ich noch nicht ganz in wie fern sich das umsetzen ließe. Außerdem musste ich ja auch selber ein wenig herum experimentieren. Ich versuche mich bei jedem Wettbewerb zu bessern. Außerdem habt ihr nach jedem Wettbewerb 2 Wochen Zeit über Umsetzung und Handhabung zu diskutieren bevor der nächste Wettbewerb startet. Da versuche ich dann Vorschläge etc. für den übernächsten (ich fange ja jetzt schon an den nächsten Wettbewerb zu planen ^^) umzusetzen.

    Es ist schwierig alles vorab festzulegen, aber ich denke dass ich es soweit ziemlich gut hinbekommen habe mich an meine eigenen Richtlinien zu halten. Natürlich gibt es hier und da mal eine Abweichung, aber das liegt eben daran dass dies mein erster Wettbewerb dieser Art ist. Ich hoffe dass die Beteiligung so groß ist, dass ich im Laufe der Zeit alles verbessern kann. :)

  • chip:
    Okey, ich habe mir gerade erst die Log Datei mal angesehen. Du meinst bestimmt dass das Futterstück direkt nach dem Start irgendwo zufällig hin springt, sich dann aber auf Position (2 | 5) begibt. Das liegt daran dass ich (aufgrund von Faulheit ^^) alles in Objekten gepackt habe und das Objekt bei jedem Neustart resettet wird. Ich könnte dies zwar noch umschreiben, hat aber letztendlich keinerlei Bedeutung da die Log Datei ansonsten originalgetreu wiedergegeben wird. Ist ja soweit auch nicht schlimm. Wenn ich die Zeit finde mache ich das noch, aber hat jetzt keine hohe Priorität da ansonsten ja alles dargestellt wird.

    draien:
    Kein Problem, da ich ja den Wettbewerb gestartet habe, muss ich mich auch darum kümmern. Darunter fallen auch Verständnisprobleme der Teilnehmer bzw. Interessierten... ^^

  • Joa, hatte ja rein editiert, das es nur ein "Anzeigefehler" ist hehe.

    So, meine AI, ist glaube ich soweit fertig.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ein kleiner Push von meiner Seite aus, in 9 Tagen sollte auch der letzte (der mitmachen möchte) was eingesendet haben.
    Bisher gibt es nur eine Einsendung, nimmt überhaupt irgendjemand noch daran teil? ^^

  • Hab eine simple AI gebastelt. Allerdings hab ich ein Problem, manchmal wird einfach kein Futter auf der Karte gefunden.

    [autoit]

    Func _M_X(ByRef $aMap) ; Schauen wo sich das Futter befindet
    For $x = 1 To $AIFight_MapX Step 1
    For $y = 1 To $AIFight_MapY Step 1
    If $aMap[$x][$y] = $AIFight_MapFeed Then Return _M_A($x, $y)
    Next
    Next
    Return _M_A(-1, -1) ; Keins gefunden. Ohje !
    EndFunc
    Func _M_A($a, $b) ; Ziemlich verzwickte Methode um ein Array zu erzeugen
    Local $c[2] = [$a, $b]
    Return $c
    EndFunc

    [/autoit]

    Meistens bei der Generierung eines neuen Futterstücks. Dann ist teilweise ein bis zwei Runden kein Futter auf dem Feld. Ist das Absicht ?

    Edit: Einsendung ist raus, die Ausnahme wird intern behandelt.

    lg
    M

  • Soa ihr lieben, der Abgabetermin ist vorüber, insgesamt sind 3 Einsendungen angekommen! Sind 2 mehr als wie ich erwartet hatte. ^^

    Aufgrund der geringen Teilnehmerzahl habe ich letztendlich jede AI gegeneinander spielen lassen. Der Bug den Mars einen Post über mir angesprochen hat wurde vor der Bewertung natürlich noch gefixt. Bei 1000 Runden auf ein 10x10 Feld wurden folgende Punktzahlen erzielt:

    Spieler 1

    Punkte

    vs

    Punkte

    Spieler 2

    chip

    20'357

    -

    2'531

    Kanashius

    Kanashius

    133

    -

    25'158

    Mars

    chip

    7'599

    -

    16'879

    Mars


    Zuerst dachte ich, dass ich irgendwo einen schwerwiegenden Fehler im Programm hätte, daraufhin habe ich einzelne Log Files (Stichprobenartig ein paar Runden) mit den jeweiligen AI's überprüft und verglichen. Dies sind also die tatsächlichen Leistungen der einzelnen AI's. Dadurch ergibt sich folgende Platzierungen:

    Platz #1 -> Mars
    Platz #2 -> chip
    Platz #3 -> Kanashius

    Dies war mein erster Wettbewerb in dieser Form. Nun bin ich auf Rückmeldungen gespannt! Wie war der Wettbewerb für euch? Zu schwierig, zu leicht oder nur langweilig? Wie fandet ihr die Umsetzung und die Organisation? Schreibt einfach eure Meinung, ich möchte dies für die Zukunft besser machen!

    Ansonsten: Woran lag es dass es nur so wenige Teilnehmer waren? Keine Lust gehabt oder sagte euch einfach der Wettbewerb nicht zu? Was kann ich besser machen? Vor allem: Besteht weiterhin Interesse?

    PS: Im Anhang findet ihr die Log Files. :)

  • Mich würde mal interessieren, wieviele Runden die KIs jeweils gegeneinander angetreten sind.

    Zum Grund warum so wenig teilgenommen haben ist vermute ich mal die Spielauswahl. Snake ist für einen AI-Wettbewerb eine ziemlich schlechte Wahl da es reine glückssache ist wo die Futterstücke entstehen. Dadurch ist es eigentlich nicht möglich wirklich zu sagen welche AI besser ist. Da wären andere Spiele bei denen es wirklich darum geht berechenbare Entscheidungen zu treffen und kein Glücksspiel besser.

    Des weitern würde ich dich bitten solche Änderungen wie das Futter NICHT erst zur Auswertung rein zu machen. Das hatte ich nämlich in meinem AI gepuffert gehabt und durch deinen Änderung ist sie nun öffters einfach einen Schritt zuviel gelaufen. Sprich deine Änderung hat meine AI verbuggt ;).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    Einmal editiert, zuletzt von chip (19. März 2015 um 09:32)

  • chip: Naja das hätte man seine KI eigentlich Tron-mässig aufziehen lassen können sodass die vorallem versucht den Gegner rauszuhauen anstatt Punkte zu sammeln. Das war eigentlich auch mein Plan, allerdings habe ich diesmal wirklich einfach keine Zeit gefunden. Zudem muss ich sagen, dass mein Autoit vielleicht etwas eingerostet ist (habe ja schon lange nichts mehr damit angestellt).

    Bild1: Ich beim debuggen

  • General Kaboom, das wäre auch sinniger gewesen und das Futter ganz weg lassen. Weil dann wäre ein eindeutiger vergleich möglich gewesen. So wie es jetzt, halt schlicht Glücksspiel.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ich hatte irgendwo nen Fehler drin... wegen Klausuren konnte ich mich dann nicht mehr weiter damit auseinandersetzen. Das Problem war dabei glaub ich, dass ich X und Y an irgendner Stelle vertauscht hatte :D. Dann bin ich immer zum falschen "imaginären" Futter gelaufen ;). Den Spielfeldaufbau in dem Array einmal angeben hätte vllt geholfen.

    Naja. Nächstes mal hab ich hoffentlich mehr Zeit :)

  • Ich glaub da müssen noch einige Tausend Runden gefochten werden.
    Meine KI hab ich fast genauso geschrieben wie sie jetzt ist: vollkommen verwirrend, unleserlich und im Kern sehr einfach. Ich kann mir irgendwie gerade nicht vorstellen dass sie die anderen beiden so fies abziehen konnte^^

    Edit: Ooops. Dachte die Source wäre irgendwo veröffentlicht worden^^
    Da dem nicht so ist verrät dieser Post das meine KI eine grauenhafte Formatierung besitzt :D

    Edit2: Hab mir die Logs mal angesehen. Die beiden anderen laufen andauernd gegen Wände. Kein Wunder das die verlieren...
    Das lässt sich doch leicht ausbügeln -> mehr Elan beim Arbeiten bitte :P

  • @Mars sag ja dadurch, dass vor dem Auswerten das mit dem Futter geändert wurde, ist meine KI verbuggt. Das hat nix mit Elan zu tun sondern schlicht mit gravierenden Änderungen seitens Shutdown. Wenn man davon ausgehen kann das das immer so läuft, dann verzichte ich auf weitere Teilnahme.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Erst einmal vielen Dank für eure Kommentare. Mag sein dass es nicht ganz so gelaufen ist wie ich es mir vorgestellt habe, aber liegt wahrscheinlich doch an der Spielwahl, Spielumgebung und das Interface welches ich euch quasi vorgegeben habe. Man bedenke aber dass ich dies tatsächlich zum ersten mal in dieser Form gemacht habe. Da kann man nicht alles auf Anhieb perfekt machen, aber ich versuche die Fehler die ich gemacht habe für den nächsten Wettbewerb zu degradieren. Da ich aber auch bei jeder Änderungen Backups mache, habe ich nochmal chip und Mars seine AIs zu der Version laufen gelassen, wie diese auch hier veröffentlicht wurde (also mit dem Futterbug). Kommt von der Größenordnung der Punkte auf's selbe Ergebnis hinaus.


    Zitat von chip

    Mich würde mal interessieren, wieviele Runden die KIs jeweils gegeneinander angetreten sind.

    1000 Runden auf einem 10x10 Spielfeld.


    Zitat von chip

    Da wären andere Spiele bei denen es wirklich darum geht berechenbare Entscheidungen zu treffen und kein Glücksspiel besser.

    Stimmt, vielleicht nicht so optimal dass ich den Zufallsfaktor so groß war. Prinzipiell würde ich aber sagen dass in gewisser Weise manchmal eben etwas Zufall notwendig ist. Ich hatte zwar bereits schon ein Spiel angefangen zu programmieren, aber aufgrund der Kommentare alles in den virtuellen Papierkorb verschoben. Das nächste Spiel wird ausschließlich ein Strategiespiel sein (ohne Zufallsfaktoren). Es ist von der AI Programmierung her genauso aufwendig (vielleicht sogar mehr) wie Schach, aber die Regeln sind deutlich weniger. Im nächsten Spiel müssen also viele Züge vorausberechnet und verglichen werden.


    Zitat von chip

    Des weitern würde ich dich bitten solche Änderungen wie das Futter NICHT erst zur Auswertung rein zu machen.

    Okey, war nicht fair von meiner Seite aus. Ich hätte euch zumindest die Dateien im Startpost aktualisieren können. Besonders du und Mars hätten die Möglichkeit gehabt eure AI dementsprechend anzupassen.


    Zitat von chip

    Wenn man davon ausgehen kann das das immer so läuft, dann verzichte ich auf weitere Teilnahme.

    Definitiv soll das nicht so weiter laufen. Weshalb sonst frage ich euch nach eurer Meinung? Ich habe den Wunsch bzw. das Ziel mich zu verbessern und nicht die gleichen Fehler immer wieder zu machen. Da ich ja auch zwischendurch schon mal den einen oder anderen Kommentar (in der Shoutbox) gelesen habe, weiß ich auch wo ich was verbessern kann und auch sollte. Damit solche Situationen nicht nochmal entstehen, werde ich mir bis zum nächsten Wettbewerb mehr Zeit zum Programmieren der Spielumgebung nehmen. Vor allem werde ich diese auch schärfer auf Fehler überprüfen und eine AI als Gegner zur Verfügung stellen. Da diese Prozedur doch etwas länger dauert kann ich zmd. jetzt noch nicht abschätzen wann der nächste Wettbewerb startet.


    Folgendes werde ich für die zukünftigen Wettbewerbe verbessern:
    - Einmal muss ich die eigentliche Spiellogik besser und intensiver auf Bugs überprüfen. Solch ein fataler Bug wie in diesem Wettbewerb darf nicht nochmal vorkommen.
    - Zum anderen wird das Interface zwischen AI und Spiellogik verbessert. Wie ich das genau anstelle muss ich mir noch überlegen. Wahrscheinlich werde ich teilweise Funktionen zur Verfügung stellen, die euch wichtige Informationen aus einem Gesamtpaket extrahieren kann. Um das mal auf diesen Wettbewerb zu beziehen: Alle Hindernisse konnten via If BitAND($aMap[x][y], $AIFight_MapSolid Then abgefragt werden. Schien aber nicht so offensichtlich, für das nächste mal wird es dann eben Funktionen geben welche eben diese Information extrahiert.
    - Eine bessere Beschreibung der Aufgabenstellung, Spielregeln sowie die Möglichkeiten des Interfaces als PDF Datei.
    - Die GUI (welche die LogFiles wiedergeben) werde ich von Grund auf anders aufbauen. Es soll zwischen einzelne Runden gewechselt werden sowie auch Züge zurückgespult werden können. Auch soll es möglich sein gegen seine eigene AI zu spielen, also Mensch gegen AI. Damit soll die Möglichkeit gegeben werden, seine AI auf spezielle Situationen zu überprüfen und ggf. anzupassen. Es wird also eine GUI geben die euch mehr in der Entwicklung der AI unterstützt, auch grafisch (und von der Geschwindigkeit her) soll diese aufgewertet werden. Ich überlege mir mal noch, ob ich ggf. die Spiellogik in eine DLL packe und die GUI in C# oder FreeBASIC programmiere. Natürlich alles dann kompatible zu AutoIt damit die eigentliche AI auch wirklich nur in AutoIt verfasst werden muss.
    - Der Zufallsfaktor in zukünftigen Spielen werden nicht ein zu großes Gewicht auf die Auswertung haben. Aber komplett den Zufallsfaktor zu entfernen wird für einige Spiele nicht ganz möglich sein. Es gibt Spiele die brauchen eben einen gewissen Grad an Zufall, ich werde das besser abwägen und fairer gestalten.


    Soa, habe ich was vergessen? Ich bin gespannt ob ich so vielleicht mehr motivieren kann an dem Wettbewerb teilzunehmen. Betrachtet diesen Durchgang einfach mal als Testlauf, letztendlich lag es doch mehr an mir als an eure AI's, dass die Auswertung so ausgefallen ist. LG. :)

  • Hy,
    als Spiel würde sich Tron wirklich anbieten! Es ist schnell programmiert und auch einfach gehalten. Oder auch ein Panzerspiel im Stile von den ollen Atari 2600 Spielen würde einfach zu schreiben sein. Was ich dir nicht empfehle sind im Spiel integrierte "Gegner" wie z.B. bei PacMan die Geister - da wäre der Zufallsfaktor viel zu hoch und es würde als "Unfair" eingestuft werden...

    Zu dem Punkt mit dem Strategiespiel würden mich weitere Infos interessieren, an welcher Art von Strategie-Spiel denkst du?? In Richtung Aufbau-Strategie hatte ich einen einfachen 600-Zeiligen "Prototyp" in tiefer Vergangenheit angefertigt mit Einheiten, Sichtweiten, Gebäuden, Ressourcen und Untergrund. Auf einer grafischen Anzeige hatte ich komplett verzichtet und alles mit einfachen Labels dagestellt, mir ging es nur um die Umsetzung der benötigtigten Basisfunktionen. Wenn man sowas im "Multiplayer" Modus schreiben möchte, hat man sogar die Möglichkeit mehr als 2 Gegner zeitgleich antreten zu lassen - ist im Sinnes eines AI-Fightes total unnütz, hätte aber trotzdem den Vorteil das man in der Entwicklung seiner eigenen AI auch gleich mehrere Konfigurationen oder unterschiedeleich AI´s gegeneinander anteten lassen könnte. Da geplant ist 2 AI´s antreten zu lassen ist der Untergrund seeehr wichtig und sollte als interaktiver Spiegel zu der Gegenseite erstellt werden - AI1 entdeckt ein neues Feld und das wird gespiegelt bei AI2 plaziert und eben andersrum. Dadurch stellst du sicher das beide Seiten auf die gleichen Untergrundwerte zugreifen können und dieser als "Unfair-Bug" ausgeschlossen wird... Auch kann man ein größeres Spielfeld verwenden und dadurch können sich die AI´s besser entwickeln und es kommt vielmehr auf dem Programmierer an wie seine AI sich verhalten soll da man nicht gleich nach einigen Zügen auf den Gegner trifft!

    Die Retrospiele sind in einem viel kürzeren Zeitraum zu realisieren und die AI´s müssen auch nicht so hoch entwickelt werden, das währe ein guter Einstieg. Aber das Strategiespiel ist in seiner eigenen Entwicklung im Verhältniss schon High-End, und die AI´s müssen auch sehr gut Ausgebaut sein damit diese überhaupt fähig sind den Umfang verarbeiten zu können!

    Ich finde dieses Thema sehr interessant und bin gespannt in welcher Richtung du das Weitertreibst!

    Grüsse!