AntMe, Spass mit programmierbaren Ameisen

AntMe!Nachdem ich die Ameisen in meiner Wohnung mit ganz perfidem tragts-es-zu-euch-nach-Hause-und-vergiftet-eure-Nachkommen-Gift losgeworden bin, habe ich sehr viel sympathischere Zeitgenossen dieser Spezies getroffen: AntMe ist ein Programmierspiel, dass aus Microsofts Coding4Fun Initiative (nicht zu verwechseln mit dem Galileo Coding for Fun Buch. Das ist auch spassig, behandelt auch AntMe, aber zusätzlich noch viele Andere Dinge) hervorgegangen ist. Es hat einen eigenen Wikipedia Artikel und vorallem eine geniale Homepage.

Grundsätzlich geht es darum Ameisen zu implementieren die überleben, Äpfel und Zucker sammeln und unter Umständen auf Käfer und fremde Ameisen losgehen. Ein Markierungsmechanismus sorgt dafür, dass die Ameisen untereinander kommunizieren können. Fortgeschrittene Ameisenpapis und -mamis können spezialisierte Ameisen erstellen und RPG mässig Eigenschaften verbessern, wenn sie dafür andere verschlechtern.

Die Ameisen in Aktion

Die Ameisen können in C# oder in Visual Basic .net mit der notwendigen Intelligenz versehen werden. Bestimmte Methoden werden zu bestimmten Ereignissen aufgerufen; beispielsweise WirdMüde() (ja, mit „ü“ und deutsch) oder SiehtFeind(ByVal käfer As Käfer). Zur Steuerung steht fast der ganze .net Sprachumfang zur Verfügung, sowie Ameisenspezifische Hilfsmethoden wie etwa GeheZuBau() oder GreifeAn(käfer).

Quickstart

Auf der AntMe Homepage findet man verschiedene Versionen. Wir spielen hier mit der 1.5 Beta 2 (VB.net oder C#, je nach Gusto). Die Profiversion beinhaltet den gesamten Quellcode der Spielengine (!). Das ist so genial, dass es nochmals erwähnt werden darf: Die Profiversion beinhaltet den gesamten Quellcode der Spielengine. Will man sich nur mit den Ameisen beschäftigen, reicht die Einsteigerversion. Im Download enthalten ist ein gut dokumentiertes Ameisenskelett, bei dem sofort losgottgespielt werden kann.
Eine gute Doku über die Klassen und deren Methoden sowie ein Tutorial wird mitgeliefert. Zum Teil beziehen sich die Unterlagen noch auf Version 1.1, aber der Transfer zu 1.5 ist eigentlich kein Problem. Für Leute, die lieber kuckn statt lesen, gibt es gut gemachte Screencasts, die ebenfalls in die Thematik einführen.

Für eher haptisch veranlagte Menschen gibt es auch ein Buch: AntMe! – Programmieren und Spielen mit den Ameisen und Visual C#. Das kenne und besitze ich allerdings (noch) nicht.

Verfügt man noch über keine Programmierumgebung, so könn bei Microsoft gratis die Express Versionen verschiedener Sprachen downgeloaded werden. Für die 3D Visualisierung braucht man
noch DirectX. Mit der neusten Version (nicht mit der im Forum angegebenen) hat es wunderbar gefunzt.

Turniere

Ein Bisschen lebt das Ganze auch vom kompetitiven Element (um ehrlich zu sein, vielleicht ist ein Bisschen etwas untertrieben: ICH FRESS EUCH ALLE AUF!). In der Version 1.5 funktioniert das Importieren von anderen Ameisen leider nicht und es wird eine unbehandelte Ausnahme ausgespuckt:
Der Typ für Member AntMe.SpielKonfiguration.AntMe.Simulation, Version=1.5.0.0, Culture=neutral, PublicKeyToken=37d8e32ef3294969 wurde nicht aufgelöst.

Workaround für die VB-Version (C# ungetestet):

  1. Abgabe der Ameisen im Quellcode (ist eh besser, da man so Betrügermeisen (Siehe unten) erkennt).
  2. Drag and Drop des Quellcodes in das Projekt.
  3. Compilieren und das Massaker Messen der intellektuellen Kapazitäten kann starten.

Wenn einzelne Ameisen in C# gecoded sind, kann der Online-Konverter den Code in VB umwandeln (mit gemischtem Erfolg). Ist denn C# und VB dasselbe (*frech_grins*)?

Fragen und Antworten/Tipps und Tricks

Q: Warum verhungern meine Ameisen? Ich habe doch die folgenden Zeilen eingefügt:

Public Overrides Sub WirdMüde()
  Me.GeheZuBau()
End Sub

A: Wahrscheinlich wird die arme Ameise auf ihrem nach Hauseweg für andere Jobs eingespannt! Wird sie vielleicht auf Käfer oder feindliche Ameisen losgejagt wenn sie solche sieht? Oder muss das arme Insekt beim Apfeltragen helfen wenn sie an einer solchen Gruppe vorbeikommt? Man sollte sie jeweils in Ruhe lassen wenn sie in Richtung Bau dackelt und rund um Aktionen folgendes schreiben:

if Not TypeOf Me.Ziel Is Bau then
  ' Hier was stressiges machen
end if

Q: Wie finde ich die Koordinaten meines Baus?

A: Am besten eine shared/Static Variable vom typ Bau definieren. Die erste Ameise zum Bau schicken, dann werden die Koordinaten des Baus zu ihrem Ziel, von wo sie dann ausgelesen werden können:

[...]
Private Shared bau As IKoordinate
[...]
If bau Is Nothing Then
  Me.GeheZuBau()
  bau = Me.Ziel
End If

Q: Wie komme ich an die X und Y Koordinaten eines Objekts?

A: Gar nicht. Aber gewitzte Ameisenkönige können Polarkoordinaten verwenden. Man weiss ja wo der Bau ist, die Winkel sind absolut, …


Q: Meine Ameisen verhalten sich in der zweiten Runde ziemlich irr, woran kann das liegen?

A: Vielleicht sind sie irr? Es könnte aber auch am Umstand liegen, dass anscheinend statische Variablen zwischen den Durchgängen nicht neu initialisiert werden. Von Hand könnte man beispielsweise folgendes tun:

Public Overrides Function BestimmeTyp(ByVal anzahl As Dictionary(Of String, Integer)) As String
  ' Init for rounds > 1
  If anzahl("Kundschafterin") + anzahl("Kriegerin") < 2 Then
    ' Reset all static members
    lastphase = False
    bau = Nothing
    ObstSpeicher.Clear()
    ZuckerSpeicher.Clear()
    [...]
  End If
  [...]

Q: Ich bekomme eine Fehlermeldung, wenn ich auf den Freund in SiehtFreund(ByVal ameise As Ameise) zugreifen will, was geht da ab?

A: Das scheint ein Bug zu sein. Freunde scheinen halt ab und zu zu verschwinden 🙁 . Um das Turnier nicht gewaltsam zu beenden, sollte man checken, ob es sich um einen wahren Freund handelt:

if not ameise is nothing then
  ' Hier was funkyges tun mit dem Freund
end if

Q: Wenn ich in Visual Basic die Funktionen der Koordinaten Klasse benutzen möchte, wird es unterstrichen und folgendes gemeldet: Zugriff des freigegebenen Members, konstanten Members, Enumerationsmembers oder geschachtelten Typs über eine Instanz; Der qualifizierende Ausdruck wird nicht ausgewertet.. In was für einer Sprache ist diese Fehlermeldung?

A: In MS-Deutsch(tm) 🙂 . Um Koordinate ohne gemotze zu verwenden sollte man sie folgendermassen qualifizieren: Global.AntMe.Koordinate.


Q: Ich möchte mit der Markierung einen Punkt und nicht einen Winkel übergeben.

A: Entweder Polarkoordinaten verwenden oder ganz einfach: Me.GeheZuZiel(markierung) verwenden.


Q: Äpfel werden in einem Multiplayerspiel irgendwohin getragen, sind die Ameisen besoffen?

A: Nein, aber das kann passieren wenn Ameisen von verschiedenen Gruppen den Apfel in verschiedene Richtungen zerren.


Q: Psst! *flüster* Ich habe gehört man kann bescheissen?

A: Ja, kann man. Es ist möglich Ameisen zu beamen, fremde Ameisen „Zu übernehmen“, etc. Das ist Bugusing und nicht nett. Beim Judt AntMe Forum gibt es diese Entdeckungen nachzulesen.


Q: Was ist ein Globales Gedächtnis?

A: In der objektorientierten Programmierung kennt man eine bestimmte Art von Variablen, die statisch (shared in vb.net) sind. Diese werden dann nicht in den Objekten, sondern in den Klassen gespeichert. Das heisst, alle Objekte greifen auf dieselbe Variable zu. Wenn eine Ameise in einer Solchen etwas speichert, steht es allen Anderen auch zur Verfügung. Nicht gerade naturnah, aber sehr effizient :).


Q: Ich möchte eine Ameise mit verschiedenen Phasen. Wie finde ich heraus, bei welchem Tick wir sind?

A: Eigentlich gar nicht. Man kann in der Funktion Tick() zählen, aber das ist risikoreich, weil die Anzahl Ticks pro Spiel verändert werden kann, die Funktion unter Umständen mehrfach aufgerufen wird und eine neu erzeugte Ameise dann mitten im Spiel bei 0 beginnt. Eine Krücke ist folgender Code im Tick(), der darauf hofft, dass mindestens eine Ameise von Beginn weg überlebt und im globalen Gedächtnis eine Variable setzt sobald die Anzahl Ticks erreicht wird. Darauf sollten dann alle Ameisen reagieren. Für Verbesserungsvorschläge wäre ich sehr offen, aber bitte nur getestete und validierte.

Public Overrides Sub Tick()
  Me.ticks = Me.ticks + 1
  If Me.ticks >= lastphaseticks Then
    lastphase = True
  End If
  [...]

Beispiele

Die Aggros sind Ameisen mit globalem Gedächtnis. Kundschafterinnen finden Mapf und Feinde, Sammlerinnen wenden sich dem nächstgelegenen Mapf zu und Kriegerinnen nehmen sich den Feinden an. Läuft ganz ok.

Die Applekorns sind noch in Entwicklung. Die Idee war, alle Äpfel in die Nähe des eigenen Baus zu bringen um fremde Ameisen anzulocken, Zuckerhaufen zu besetzen und kurz vor Schluss alles einzuheimsen. Sie bieten noch sehr viel Optimierungspotential.

Ganz genial sind die Polarameisen. Sie kommen ohne globales Gedächtnis aus und sprühen kodierte Polarkoordinaten über das Spielfeld. Das führt dazu, dass die Ameisen wirklich wie am Schnürchen zur Futterquelle gehen. Ebenfalls integriert ist eine Berechnung der Zeit, die eine Ameise braucht, bis sie bei einem Ziel ankommt und noch viele weitere Schmankerl. Ein schönes Stück Software.

Fazit und Ausblick

Mit diesen Programmierspielen kann sehr viel gelehrt und gelernt werden: Sprachpraxis, Programmierroutine, Problemdekomposition und Konzepte wie statische Variablen und Überladungen. Es ist schön die Lichtlein zu sehen die aufgehen, wenn man später im Unterricht auf die Ameisen verweisen kann und sofort ein tieferes Verständnis da ist.

Es würde mich extrem reizen, diese Ameisen mit einem neuronalen Netz zu versehen oder sie mittels genetischen Algorithmen zu züchten. Hätte ich doch mal einfach etwas Zeit 🙂 .

5 Gedanken zu “AntMe, Spass mit programmierbaren Ameisen

  1. Huhu Udo,

    wow, da freut sich das AntMe-Team! Prima daß Dir das Spiel so gefällt – wir sind gerade hart am Arbeiten an der Version 1.6 (laßt Euch überraschen) und auch an der Online-Version, die aber echt ein harter Brocken ist – man wird echten AntMe!-eSport betreiben können (und wir hoffen wir haben alle Schummelmöglichkeiten gefunden, siehe oben!). Du hast recht das kompetitive Element ist sehr wichtig und mach viel vom Spielspaß aus, deshalb bauen wir es konsequent mehr und mehr aus. Z.B. enteht neben dem Onlinespiel gerade ein Plugin für Peer-to-Peer Spiele.

    Wir sind immer wieder überrascht, was sich die Leute einfallen lassen mit ihren Ameisen. Übrigens sind wir auf der Games Convention auf den Stand der Game-Codingschule „qantm“, ich selbst bin am Samstag da. Also wer uns besuchen will ist herzlich willkommen!

    Viele Grüße,
    Uwe vom Ameisenteam

  2. @Uwe
    WOW, auf das Onlineteil freue ich mich!!!
    Ihr leistet da echt geniale Arbeit und habt schon vielen Menschen Freude gemacht und das Programmieren näher gebracht…!

    Nur, hmm, warum Udo???

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.