Dynamic Link Fighters Documentation 1.0

Eine KI programmieren



Wie und Womit programmiere ich eine KI ?
Der besondere "Witz" bei DLF ist dass man die KI nicht mit irgendeinem Pseudo-Code schreibt sondern direkt in Delphi.
Das alles funktioniert über eine DLL die man selber schreibt, die Methoden in ihr werden vom Hauptprogramm aufgerufen, in den Paramern stehen Infos zum aktuellen Spielgeschehen, der Rückgabetyp ist was die Figur tun soll.
Jeder Spieler wird somit durch eien KI repräsentiert die er selbst geschrieben hat

Das Template
Das vollständige KI-Template finden sie im Hilfe-Programm unter "Template".
Im folgenden wird hier auf die verschiedenen Methoden in der DLL eingegangen

ki_Name, ki_Author, ki_VerNmr und ki_PersonalFlag,
Diese 4 Funktionen dienen nur dem übermitteln von Informationen.
Bei ki_Name setzt man als Rückgabetyp den Namen des Teams, bei ki_Author den Autor (oder dessen Nickname) und bei ki_VerNmr die VersionsNummer der KI.
Zu beachetn ist hierbei die im Template als Kommentar ersichtliche Maximale Zeichenlänge - wird diese überschritten ist es möglcih dass Teile des Strings im fertigen Programm abgeschnitten werden.
Bei ki_PersonalFlag wird die "Flagge" der Manschaft zurückgegeben. Optimalerweise liegt das Bitmap dieser in der Resource der Dll.
Das zurückgegebene Bitmap muss eien Größe von 100x75 pixel haben und mit einem standrd Bildbearbeitungsprogramm wie Paint.Net erstellt worden sein.
Falls sie sich in diesem Punkt unsicher sind können sie auch einfach die Standard-Flagge aus dem Ordner data/images/sFlag.bmp laden und sie verändern.
Eine Flagge könnte so ausehen:

Weitere Anregungen können sie aus den Standard-KIs gewinnen die mitgeliefert werden.

Die Start Methode
Die Methode ki_StartMatch wird beim Starten des Spieles ausgeführt. In ihr erfährt man wieviele Spielfiguren man besitzt. Sie ist auch bestens dazu geeignet Variablen zu intialisieren oder Randomize auszuführen.

Die Commader Methode
Die Methode ki_Commander wird am Anfang jeder neuen Runde ausgeführt (also immer nachdem alle gegnerischen Figuren gezogen haben aber bevor die erste eigene Figur zieht). Sie ist sehr nützlich da sie viele Informationen liefert wie die Anzahl der noch spielenden Figuren und den Status der Flaggen. Besonders hilfreich ist es wenn man diese Werte in globalen Variablen für den späteren Gebrauch sichert.

Die Haupt-Methode
Das Herz jeder KI ist die Methode ki_FigurMove. In jeder Runde wird sie für jede Figur einmal aufgerufen. In ihr erhält man Informationen wie die eindeutige ID der Figur, das Sichtfeld der Figur und ob die Figur die (gegnerishche) Flagge hält.
als Rückgabetyp wird eine der folgenden Variablen verlangt:
R_DoNothing
R_MoveForward
R_MoveLeft
R_MoveRight
R_MoveBack
R_TurnLeft
R_TurnRight
R_TurnBack

Mit diesen gibt man an was für eine Aktion die Figur ausführen soll, die Namen der Variablen sollten selbsterklärend sein.
Das Viewfield beschreibt das Blickfeld des Käfers, ein Käfer kann immernur ein kleines Feld um sich herum wahrnehmen, näheres dazu im Unterpunkt Viewfield.

Das Viewfield - Der Blickbereich eines Käfers
Das TViewfield bekommt man in ki_FigurMove, es besteht hauptsächlich aus einem 2 Dimensionalen Array. Dieses Array entspricht den X und Y Koordinaten der Felder.
Das Viewf ield ist relative zu der Position des Käfers und seiner Richtung ausgerichtet:



Die Felder die hier mit einem Fragezeichen versehen sind kann der Käfer nicht sehen - im Programm geben diese viUnknow zurück.
Der 2 Dimensionale Array enthält ein record mit 2 Werten:
Der erste ist der Identifier er gibt zurück was für ein Feld das ist, ob leer, eigene Figur, Geegner, Flagge etc. Genauer kann er folgende Werte annehmen:
viUnknow
viEmpty
viOwnFigur
viOwnFigurWithFlag,
viEnemyFigur,
viEnemyFigurWithFlag,
viOwnFlag,
viEnemyFlag,
viOverBorder,
viSelf

Ein paar Hinweise an dieser Stelle:
1. Man kann durch Abfrage auf viOverBorder verhindern dass die Figur aus dem Feld läuft (und stirbt).
2. Man sollte beachtren dass man mit viEnemy nicht pauschal alle gegtnerischen Figuren erkennt. Man muss auf viEnemy OR viEnemyWithFlag überprüfen
3. vieSelf ist man selbst - und man selbst ist immer auf (0|0)
4. viUnknow wird dort zurückgeliefert wo auf der Übersicuht ein Fragezeichen ist - diese Felder liegen auserhalb des Sichtbereiches unseres Käfers.

Das Viewfield gibt uns auch noch eien 2. Variable die TeammadeID, wenn auf dem Feld eine Figur der eigenen Mannschaft ist steht in dieser Variable ihre ID, wenn es keine eigene Figur ist setht -1 darin.

Das Ende
Die letzte Methode die aufgerufen wird ist ki_EndMatch. In ihr erfährt man ob man gewonnen oder verloren hat. Auch ist sie gut um evtl Objekte freizugeben.

Testen der KI
Die beste Methode die eigene KI zu testen ist mit Debug_KI.exe.
Über viele (selbsterklärende) Buttons an der linken Seite kann in das handeln der KI's eingegriffen werden. Der obere Kasten steuert dabei KI_1 der untere KI_2. In die ComboBox muss die FigurID eingegeben werden.
Im Kasten darunter kann man allegemeien Ereignisse auslösen und sich anzeigen lassen welche Figuren noch leben.
Noch eins darunter kann das Sichtfeld einer Figur angezeigt werden.
Um ein Spiel in Debug_Ki.exe zu starten muss man rechts unten die gewünschten Werte eingeben und auf TDLMatch.Create(); klicken
Um ein neues zu starten zuerst auf TDLMatch.Free(); und dann auf TDLMatch.Create();

Zusätzliche Informationen bekommt man durch die Kommandozeile in der alle wichtigen Ereignisse / Procedureeinstige von DLF eingertargen werden.

Hinzufügen der KI
Damit die KI im Programm auftaucht musst du sie einfach in den Ordner KIs kopieren

Hinweise
Bisher wurden folgende Delphi Versionen erfolgreich zum erstellen einer solchen Dll getestet:
Delphi 2009
Turbo Delphi