Anleitung 2: Die Ameise lernt, mit Wanzen und anderen Ameisen zu kämpfen

    • Anleitung 2: Die Ameise lernt, mit Wanzen und anderen Ameisen zu kämpfen

      In Anleitung 1 wurde erklärt, wie man den Ameisen das Laufen und Sammeln von Nahrung beibringt. Soweit, so gut, aber es gibt da ja noch die Wanzen, die ab und zu schon mal eine von unseren Ameisen verschlingen. Die Ameisen können aber auch Wanzen angreifen und mit etwas Glück diese fressen. Dabei gibt es sogar noch Punkte.

      Neue Kaste "Kämpfer"

      Anfang:
      Falls ihr das noch nicht wisst: Um gegen andere Ameisen antreten zu können, einfach zwei Völker in die rechte Spalte des Fensters "Teamzusammenstellung" ziehen.

      Zuerst müssen wir eine neue Kaste mit dem Namen "Kämfer" erstellen. Dazu kopieren wir einfach den Code von der Kaste "Sammler" und fügen ihn darunter nochmal ein. Die Kämpferameisen sollen dem Gegner möglichst viele Lebenspunkte rauben, müssen aber keine Lasten tragen.

      [cs]
      [Kaste(
      Name = "Kämpfer",
      GeschwindigkeitModifikator = 0,
      DrehgeschwindigkeitModifikator = 0,
      LastModifikator = -1, // "Kämpfer" müssen keine Last tragen
      ReichweiteModifikator = 0,
      SichtweiteModifikator = -1, // Um insgesamt auf 0 zu kommen
      EnergieModifikator = 0,
      AngriffModifikator = 2 // 30 Lebenspunkte / Runde werden abgezogen
      )]
      [/cs]
      Hierbei angemerkt: Die Werte dürfen zwischen -1 und 2 liegen, müssen aber zusammen immer 0 ergeben.

      Um die Kaste zu aktivieren, muss die Methode BestimmeKaste angepasst werden. Nach folgender Einstellung werden zunächst 15 Sammler bestimmt und dann immer abwechselnd Sammler und Kämpfer.

      [cs]
      private string lastKaste; // Gibt an, welche Kaste zuletzt bestimmt wurde

      public override string BestimmeKaste(Dictionary<string, int> anzahl)
      {
      if (anzahl["Sammler"] < 15 || lastKaste == "Kämpfer")
      {
      lastKaste = "Sammler";
      return lastKaste;
      }
      else
      {
      lastKaste = "Kämpfer";
      return lastKaste;
      }
      }
      [/cs]
      Erklärung: Ganz wichtig ist hier die Variable lastKaste, die anzeigt, ob die letzte Kaste "Sammler" oder "Kämpfer" war. Natürlich kann man dieses Problem auch einfacher lösen, aber dann werden die Kasten nicht abwechselnd erzeugt.

      Angriff

      Um den Gegner anzugreifen, müssen wir folgende Methoden anpassen:
      • public override void SiehtFeind(Wanze wanze)
      • public override void SiehtFeind(Ameise ameise)
      • public override void WirdAngegriffen(Wanze wanze)
      • public override void WirdAngegriffen(Ameise ameise)
      Feind gesehen

      Erstmal die SiehtFeind-Methoden:

      [cs]
      public override void SiehtFeind(Wanze wanze)
      {
      LasseNahrungFallen();

      if (Kaste == "Kämpfer" && AnzahlAmeisenDerSelbenKasteInSichtweite >= 3)
      {
      GreifeAn(wanze);
      }
      else
      {
      GeheWegVon(wanze);
      }
      }
      [/cs]
      Erklärung: Wenn die Ameise eine Wanze sieht, lässt sie sofort ihre Nahrung fallen, um schneller reagieren zu können. Dann prüft sie, ob sie der Kaste "Kämpfer" angehört und die Anzahl der Ameisen der selben Kaste in Sichtweite gfößer als 3 ist, also genug Komplizen da sind. Wenn das erfüllt ist, greift sie die Wanze an, sonst geht sie weg.

      Da feindliche Ameisen nicht immer die eigene Ameise angreifen, müssen unsere Ameisen dabei anders reagieren:

      [cs]
      public override void SiehtFeind(Ameise ameise)
      {
      if (Kaste == "Kämpfer" && AktuelleLast == 0)
      {
      GreifeAn(ameise);
      }
      }
      [/cs]
      Erklärung: Wenn die Ameise eine feindliche (!) Ameise sieht, dann greift sie diese nur an, wenn sie der Kaste "Kämpfer" angehört und ihre aktuelle Last gleich null ist.

      Hilfe, ich werde angegriffen!!!

      Was machen die Ameisen, wenn sie angegriffen werden?
      Dabei reagieren sie zunächst bei Wanzen und feindlichen Ameisen gleich:

      [cs]
      public override void WirdAngegriffen(Wanze wanze)
      {
      LasseNahrungFallen();

      if (Kaste == "Kämpfer")
      {
      if (AnzahlAmeisenDerSelbenKasteInSichtweite >= 3)
      {
      GreifeAn(wanze);
      }
      }
      else
      {
      GeheWegVon(wanze);
      }
      }
      [/cs]

      [cs]

      public override void WirdAngegriffen(Ameise ameise)
      {
      LasseNahrungFallen();
      if (Kaste == "Kämpfer")
      {
      if (AnzahlAmeisenDerSelbenKasteInSichtweite >= 3)
      {
      GreifeAn(ameise);
      }
      }
      else
      {
      GeheWegVon(ameise);
      }
      }

      [/cs]
      Erklärung: Wenn die Ameise von einem Feind angegriffen wird, lässt sie wieder zunächst ihre Nahrung fallen, prüft dann, ob sie zur Kaste "Kämpfer" gehört, und greift dann, wenn genug Helfer in Sichtweite sind, den Feind (Wanze/Ameise) an.

      Das war es jetzt auch schon. Natürlich kann man die Verhaltesweisen der Ameisen noch optimieren, aber fürs erste sollte das mal genügen.
      Viel Spaß mit euren Kampfameisen! :)

      PS:
      Im Dateianhang findet ihr eine .cs-Datei. Um diese zu benutzen, müsst ihr sie im gleichen Verzeichnis wie z.B. die Vorlage.cs-Datei abspeichern. Dann könnt ihr sie benutzen.
      Dateien
      • Anleitung 2.zip

        (2,56 kB, 243 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 19 mal editiert, zuletzt von Bmeise ()

    • Irgendwas klappt nicht

      Hallo, erst einmal vielen Dank für diese Anleitungen, sind sehr informativ.
      Ich habe gerade erst mit AntMe und dem Programmieren an sich begonnen, bin also noch sehr unsicher.
      Den Code, den du erklärst, um die Anzahl der Kastenmitglieder zu regulieren, verstehe ich eigentlich (oder glaube es zumindest). Wenn ich ihn aber bei mir eingebe, gibt es in der Simulation überhaupt keine Ameisentypen mehr (also vermutlich alle "Standard"). Ich habe die Kasten "Sammler" und "Kämpfer" aber definiert. Was mache ich falsch?
      Hier mein Code für die Kastenbestimmung:

      Quellcode

      1. #region Kaste
      2. private string lastKaste;
      3. public override string BestimmeKaste(Dictionary<string, int> anzahl)
      4. {
      5. if (anzahl["Sammler"] < 15 || lastKaste == "Kämpfer")
      6. {
      7. lastKaste = "Sammler";
      8. return lastKaste;
      9. }
      10. else
      11. {
      12. lastKaste = "Kämpfer";
      13. return lastKaste;
      14. }
      15. }
      16. #endregion
      Alles anzeigen


      Ich hoffe, mir kann wer helfen, wahrscheinlich mach ich irgendwelche Anfängerfehler :)
    • Also der Code ist, soweit ich das beurteilen kann schon richtig.

      Das einzige was mir einfällt ist, dass du zwar in Visual Studio die richtige Datei (also das Ameisenvolk an dem du gerade arbeitest) ausgewählt hast, dort auf "Debugging starten" (kleiner grüner Pfeil) drückst und die Simulation sofort startet.
      Es kann passieren, dass AntMe die Simulation mit einem Volk startet, dass in Viusual Studio garnicht ausgewählt ist. Wenn das der Fall ist, drückst du einfach in AntMe (nicht in Visual Studio) auf den orangen Stopp-Knopf.
      Im Tab "Simulation vX.X" stellst du die Ameisenteams so ein, dass das Volk das du ausprobieren willst, dabei ist.

      Wenn das nicht funktioniert, bitte melden.
      MUH!
    • Vorab schonmal danke für die mühe dieses Tutorial zu schreiben.

      Bei der Sache mit "BestimmeKaste" gibt es jedoch ein Problem bei mir, immer wenn ich Debuggen möchte kommt die fehlermeldung "Fehler Der Name "lastKaste" ist im aktuellen Kontext nicht vorhanden."
      Ich hab keinen blassen Schimmer wieso der das Wort nicht kennt.
      Kann einer Helfen?