Ameisenentwicklung

Aus AntMe! Wiki
Wechseln zu: Navigation, Suche

Das Kernkonzept von AntMe! ist die Entwicklung von Ameisenvölkern. Das geschieht mit Hilfe von C# und den üblichen Standard-Komponenten von Microsofts .NET Framework. Dieser Artikel soll dir etwas genauer beschreiben was im Hintergrund passiert, worauf es ankommt und wie man damit umgehen kann.

Entwicklung

Neue Ameisen sind Klassen, die bestimmte Bedingungen erfüllen. Üblicherweise werden die Klassen in einer eigenen Klassenbibliothek einer beliebigen .NET Sprache erstellt und als kompilierte Datei im Simulator geladen.

Projekt Vorbereitungen

Das Projekt aus dem die Ameisen-Bibliothek erstellt wird muss ein paar Grundbedingungen erfüllen. Je nach Entwicklungsumgebung werden folgende Punkte unterschiedlich gehandhabt, weshalb hier nur allgemeine Punkte aufgelistet sind.

  • Projekttyp Klassenbibliothek (Class Library) mit dem Format .dll als Ausgabeformat
  • Das Ziel-Framework muss .NET Framework 4.0 (oder älter) sein.
  • Ziel-Architektur muss 32 Bit sein. (Dank einer Abhängigkeit zur 32 Bit basierten XNA Bibliothek)
  • Referenzen auf folgende Assemblies (zu finden im Installationsverzeichnis von AntMe!)
    • AntMe.SharedComponents.dll
    • AntMe.Simulation.dll

Für eine komfortable Nutzung des Projektes und der Möglichkeit die Ameise richtig zu debuggen gibt es weitere Dinge zu erledigen.

  • Der Standard-Namespace für Ameisen sollte AntMe.Player.[Username] sein.
  • Passend dazu sollte der Name der ausgegebenen Datei AntMe.Player.[Username].dll sein.
  • Build-Parameter für eine bequemeres Debugging
    • Start-Applikation auf die AntMe-Anwendung legen (AntMe.exe, zu finden im Installationsverzeichnis)
    • Start-Parameter anpassen. Der Aufruf muss den Parameter "/file=[Dateinamen]" übergeben

Im Normalfall lässt sich ein passendes Projekt mit Hilfe des Code Generators (Beschrieben in Lektion 2: Die erste Ameise) automatisch generieren. Die manuelle Erstellung (am Beispiel Visual Studio) wird in Projekt erstellen detailliert beschrieben.

Die Ameisen-Klasse

Das erstellte Projekt kann beliebige Dateien enthalten. Es ist aber wichtig, dass es für jedes enthaltene Ameisenvolk auch eine Klasse gibt, die die folgenden Bedingungen erfüllt:

  • Die Klasse muss public sein.
  • Sie muss von einer der lokalisierten Basisklassen erben
    • AntMe.Deutsch.Basisameise (für eine deutsche Ameise)
    • AntMe.English.BaseAnt (für eine englische Ameise)
  • Es muss ein passendes Spieler-Attribut auf der Klasse sein
    • AntMe.Deutsch.Spieler (für eine deutsche Ameise)
    • AntMe.English.Player (für eine englische Ameise)
  • Mindestens ein Kasten-Attribut das die Ameisen Kasten beschreibt
    • AntMe.Deutsch.Kaste (für deutsche Ameisen)
    • AntMe.English.Caste (für englische Ameisen)

Nach der Implementierung der Klassenstruktur lässt sich die Funktionalität mit Hilfe überschriebener Methoden hinzufügen. Hier eine vollständige Liste der überschreibbaren Methoden und verfügaren Methoden und Eigenschaften.

Im Normalfall lässt sich ein passendes Projekt mit Hilfe des Code Generators (Beschrieben in Lektion 2: Die erste Ameise) automatisch generieren. Die manuelle Erstellung (am Beispiel Visual Studio) wird in Projekt erstellen detailliert beschrieben.

Laufzeit

Ameisen werden beim Start (oder zum Zeitpunkt des Ladens) vom Spiel in einen gesicherten Bereich (AppDomain) geladen und untersucht. Das Spiel speichert dann verschiedene Meta-Informationen (Hauptsächlich die Daten aus den Spieler- und Kasten-Attributen) die im Spiel zur KI-Auswahl angezeigt werden. Dazu werden die KI-Dateien auf öffentliche Klassen untersucht, die einerseits von einer der lokalisierten Basis-Klassen erben und außerdem über ein Spieler-Attribut verfügt.

Wird eine KI dann tatsächlich in eine Simulation geschickt, wird wieder eine gesicherte AppDomain als Raum für die Simulation erstellt und die Ameisen-Klasse in vollem Umfang geladen. Danach beginnt die Simulation nach folgenden Regeln.

Phase 1 (Initialisierung)

  • Rahmenparameter für die Simulation wird ermittelt (Siehe Einstellungen)
  • Spielfeldgröße wird ermittelt (Abhängig von Spieleranzahl)
  • Für jeden Spieler wird die Position des Ameisenhügels per Zufall bestimmt.

Phase 2 (Rundenberechnung)

Die AntMe! Simulation ist rundenbasiert. Das bedeutet, das die Bewegungen und Interaktionen der Elemente einmal pro Runde berechnet werden. Eine normale Spielrunde dauert 5000 Runden, wobei eine Simulationsrunde bei normaler Geschwidigkeit 15 mal pro Sekunde durchläuft und eine Simulation somit etwa 4,5 Minuten dauert.

Für jede Simulationsrunde gibt es eine feste Reihenfolge wie Dinge berechnet werden.

  • Verarbeitung der Nahrungsmittel
    • Leere Zuckerhügel wegräumen: Bedingung ist hier, dass die Menge des Zuckers 0 ist.
    • Neue Zuckerhügel erzeugen: Es wird geprüft ob die Gesamtanzahl der Zuckerberge groß genug ist und die Respawn-Wartezeit abgewartet wurde. Wird ein neuer Berg erstellt, wird die Position per Zufall bestimmt und der und seine Menge durch den Standardwert in den Einstellungen bestimmt.
    • Neue Äpfel erzeugen: Ähnlich wie beim Zucker muss geprüft werden, ob zu wenig Äpfel auf dem Spielfeld sind und ob die Respawn-Zeit vorbei ist. Dann wird ein Apfel zufällig auf dem Spielfeld platziert.
  • Wanzenbewegung
    • Falls Wanze im Kampf verwickelt: Angriffspunkte auf die beteiligten Gegner verteilen. Betroffene Ameisen erhalten einen Aufruf auf WirdAngegriffen(Wanze)
    • Kein Kampf: Wanzen bewegen sich zufällig auf dem Spielfeld
  • Ameisen (Berechnungen werden Teamweise durchgeführt. Erst Team 1, Team 2,..., Team 8)
    • Ermittlung der ganzen Umgebungsinformationen (Variablen wie AnzahlAmeisenInSichtweite)
    • Ameisenbewegung (Verarbeitung der Fortbewegung wie Reststrecke und Restdrehung)
    • Prüfung der zurückgelegten Strecke
      • Ameisen verhungern, wenn die maximale Reichweite überschritten wurde. Es wird IstGestorben aufgerufen.
      • WirdMüde wird aufgerufen, wenn ein drittel der Reichweite erreicht wurde. Es wird WirdMüde aufgerufen.
    • Sichtungen (Ameisen und Wanzen)
      • Ist eine Wanze in der Nähe die nicht bereits Ziel der Ameise ist, dann wird SiehtFeind(Wanze) aufgerufen.
      • Wird eine gegnerische Ameise gesichtet die noch nicht das Ziel der Ameise ist, wird SiehtFeind(Ameise) aufgerufen.
      • Wird eine befreundete Ameise gesichtet die noch nicht das Ziel der Ameise ist, wird SiehtFreund(Ameise) aufgerufen.
      • Wird eine Ameise aus einem befreundeten Volk gesichtet, wird SiehtVerbündeten(Ameise) aufgerufen.
    • Kampfabwicklung
      • Im Falle eines Kampfes mit der Wanze werden die Angriffspunkte der Ameise auf die Wanzen-Lebenspunkte verrechnet.
      • Im Kampf mit anderen Ameisen werden die Angriffspunkte angewendet. Außerdem erhält die Ameise einen Aufruf auf WirdAngegriffen(Ameise).
    • Zielprüfung (Ameise prüft, ob sie das angestrebte Ziel erreicht hat)
      • Prüfen, ob das erreichte Ziel der Ameisenhügel ist. Dadurch werden ein paar wichtige Dinge zurück gesetzt:
        • Ziel wird zurück gesetzt.
        • Zurückgelegte Strecke wird auf 0 gesetzt.
        • Damit verbunden wird auch der IstMüde-Flag zurückgesetzt.
        • Getragene Nahrungsmittel (Obst und Zucker) werden entfernt und dem Punktestand hinzu addiert (Punktewerte gemäß Einstellungen).
        • Liste der bekannten Markierungen wird geleert.
        • Energie der Ameise wird regeneriert.
      • Prüfen, ob das erreichte Ziel Zucker ist. Dadurch wird das Ziel zurück gesetzt und ZielErreicht(Zucker) aufgerufen.
      • Prüfen, ob es sich um einen Apfel handelt. Dadurch wird das Ziel zurück gesetzt und ZielErreicht(Obst) aufgerufen.
      • Prüfen, ob es sich um einen Gegner handelt. Hier wird das Ziel explizit NICHT zurück gesetzt, damit das Ziel weiterhin angegriffen wird.
    • Sichtungen (Nahrung und Markierungen)
      • Prüfen, ob die Ameise einen Zuckerberg sehen kann. Aufruf auf Sieht(Zucker).
      • Prüfen, ob die Ameise einen Apfel sehen kann. Aufruf auf Sieht(Obst).
      • Prüfen, ob die Ameise eine neue Markierung erschnüffelt hat. Aufruf auf RiechtFreund(Markierung)
    • Untätigkeit. Sollte die Ameise weder Ziel noch Reststrecke haben, wird Wartet aufgerufen.
    • In jeder Runde wird zum Schluss bedingungslos Tick aufgerufen.
    • Tote Ameisen werden vom Spielfeld entfernt.
    • Neue Ameisen werden erstellt, sollte die Maximalanzahl noch nicht erreicht worden sein und der Respawn-Zeit vorbei ist. Es wird eine neue Instanz der Ameise erzeugt und anschließend BestimmeKaste um die Kaste für die neue Ameise zu bestimmen.
    • Markierungen werden aktualisiert (Ausdehnungsgröße berechnen und abgelaufene Markierungen entfernen).
    • Früchte vom Spielfeld entfernen die nahe genug am Ameisenhügel liegen.
  • Wanzen Lebenszyklus
    • Tote Wanzen entfernen
    • Wanzen, die nicht angegriffen werden, erholen sich nach einiger Zeit (Siehe Einstellungen).
    • Neue Wanzen erstellen, sollte die Maximalanzahl Wanzen nicht erreicht sein.
  • Obst/Ameisen-Cluster bewegen.

Funktionsweise

In den folgenden Kapiteln wird die logische Funktionsweise des Spiels beschrieben. Dabei werden unterschiedliche Aspekte des Spiels beleuchtet.

Fortbewegung

Einer der wichtigen Bereiche ist sicher die Fortbewegung und dessen Funktionsweise.

State Maschine

Ameisenstates
Bei Ameisen handelt es sich um klassische State Machines. Das bedeutet, dass sich die Ameise in unterschiedlichen Stati befinden kann und durch Spieler-Befehle oder äußere Ereignisse wechseln kann. Das ist eines der wichtigsten Konzepte beim Steuern der Ameise und führt oft zu Verwirrung. Zwar gibt es noch einige andere Einflüsse, aber grundsätzlich wird die Bewegung der Ameise durch 3 Eigenschaften beeinflusst:


Wartet: Die Ameise beginnt mit einem leeren Ziel und 0 Reststrecke und Restwinkel und befindet sich damit im State "Wartet". Solange die Ameise sich in diesem State befindet, wird in jeder Runde das Wartet-Ereignis aufgerufen. Der Aufruf einer beliebigen Dreh-Methode sorgt für eine Veränderung des Restwinkels. Aufrufe auf Geh-Methoden verändert den Wert der Reststrecke. In diesem State wird in jeder Runde die folgende Bedingungsliste abgearbeitet und dadurch State-Wechsel verursacht:

  1. Ist Restwinkel != 0? Dann wechselt die Ameise in den Drehen-State
  2. Ist Reststrecke > 0? Dann wechselt die Ameise in den Gehen-State
  3. Ist das Ziel != null? Dann wird ein neuer Kurs ermittelt und die ermittelten Werte in die Rest-Felder gefüttert. Dadurch wechselt die Ameise promt in einen der anderen States.

Drehen:

Gehen:

Ziel verfolgen:

Apfel Cluster

Wahrnehmung

Kampfsystem