Koordinatenspeicher

    • Koordinatenspeicher

      Hallo
      ich
      habe ein Problem beim anlegen von Koordinatenlisten die den Ameisen
      zeigen sollen wo was interessantes liegt. Es gibt dabei 2 Kasten
      (Zuckersammler, Obstsammler) und 3 Arraylists (Zucker Koordinaten, Obst
      Koordinaten, Gelöschte Koordinaten). Mein problem ist, dass alle
      Obstsammler zum ersten angepeilten Apfel laufen, diesen nicht nehmen und
      dann nurnoch über die map schleudern bis ich das debugging beende.
      Meinen Code kopier ich hierhin:
      Vorlage.cs:

      using System;
      using System.Collections.Generic;

      using AntMe.Deutsch;

      // Füge hier hinter AntMe.Spieler einen Punkt und deinen Namen ohne Leerzeichen
      // ein! Zum Beispiel "AntMe.Spieler.WolfgangGallo".
      namespace AntMe.Spieler
      {

      // Das Spieler-Attribut erlaubt das Festlegen des Volk-Names und von Vor-
      // und Nachname des Spielers. Der Volk-Name muß zugewiesen werden, sonst wird
      // das Volk nicht gefunden.
      [Spieler(
      Volkname = "Gedächtnisameisen",
      Vorname = "Hachel",
      Nachname = "Schlach"
      )]

      // Das Typ-Attribut erlaubt das Ändern der Ameisen-Eigenschaften. Um den Typ
      // zu aktivieren muß ein Name zugewiesen und dieser Name in der Methode
      // BestimmeTyp zurückgegeben werden. Das Attribut kann kopiert und mit
      // verschiedenen Namen mehrfach verwendet werden.
      // Eine genauere Beschreibung gibts in Lektion 6 des Ameisen-Tutorials.
      [Kaste(
      Name = "Zuckerameise",
      GeschwindigkeitModifikator = 0,
      DrehgeschwindigkeitModifikator = 0,
      LastModifikator = 2,
      ReichweiteModifikator = 0,
      SichtweiteModifikator = 0,
      EnergieModifikator = -1,
      AngriffModifikator = -1
      )]

      [Kaste(
      Name = "Apfelameise",
      GeschwindigkeitModifikator = 0,
      DrehgeschwindigkeitModifikator = 0,
      LastModifikator = 2,
      ReichweiteModifikator = 0,
      SichtweiteModifikator = 0,
      EnergieModifikator = -1,
      AngriffModifikator = -1
      )]

      public class MeineAmeise : Basisameise
      {

      #region Kaste

      /// <summary>
      /// Bestimmt die Kaste einer neuen Ameise.
      /// </summary>
      /// <param name="anzahl">Die Anzahl der von jeder Kaste bereits vorhandenen
      /// Ameisen.</param>
      /// <returns>Der Name der Kaste der Ameise.</returns>
      public override string BestimmeKaste(Dictionary<string, int> anzahl)
      {
      if (anzahl["Apfelameise"] < 50)
      {
      return "Apfelameise";
      }
      else
      {
      return "Zuckerameise";
      }
      }

      #endregion

      #region Fortbewegung

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn der die Ameise nicht weiss wo sie
      /// hingehen soll.
      /// </summary>
      public override void Wartet()
      {
      GeheGeradeaus();
      }

      /// <summary>
      /// Wird einmal aufgerufen, wenn die Ameise ein Drittel ihrer maximalen
      /// Reichweite überschritten hat.
      /// </summary>
      public override void WirdMüde()
      {
      GeheZuBau();
      }

      #endregion

      #region Nahrung

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindestens einen
      /// Zuckerhaufen sieht.
      /// </summary>
      /// <param name="zucker">Der nächstgelegene Zuckerhaufen.</param>
      public override void Sieht(Zucker zucker)
      {
      KoordinatenSpeicher.KoordinateSpeichern(zucker);
      }

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindstens ein
      /// Obststück sieht.
      /// </summary>
      /// <param name="obst">Das nächstgelegene Obststück.</param>
      public override void Sieht(Obst obst)
      {
      KoordinatenSpeicher.KoordinateSpeichern(obst);
      }

      /// <summary>
      /// Wird einmal aufgerufen, wenn di e Ameise einen Zuckerhaufen als Ziel
      /// hat und bei diesem ankommt.
      /// </summary>
      /// <param name="zucker">Der Zuckerhaufen.</param>
      public override void ZielErreicht(Zucker zucker)
      {
      Nimm(zucker);
      GeheZuBau();
      }

      /// <summary>
      /// Wird einmal aufgerufen, wenn die Ameise ein Obststück als Ziel hat und
      /// bei diesem ankommt.
      /// </summary>
      /// <param name="obst">Das Obstück.</param>
      public override void ZielErreicht(Obst obst)
      {
      Nimm(obst);
      GeheZuBau();
      }

      #endregion

      #region Kommunikation

      /// <summary>
      /// Wird einmal aufgerufen, wenn die Ameise eine Markierung des selben
      /// Volkes riecht. Einmal gerochene Markierungen werden nicht erneut
      /// gerochen.
      /// </summary>
      /// <param name="markierung">Die nächste neue Markierung.</param>
      public override void RiechtFreund(Markierung markierung)
      {
      }

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindstens eine Ameise des
      /// selben Volkes sieht.
      /// </summary>
      /// <param name="ameise">Die nächstgelegene befreundete Ameise.</param>
      public override void SiehtFreund(Ameise ameise)
      {
      }

      /// <summary>
      /// Wird aufgerufen, wenn die Ameise eine befreundete Ameise eines anderen Teams trifft.
      /// </summary>
      /// <param name="ameise"></param>
      public override void SiehtVerbündeten(Ameise ameise)
      {
      }

      #endregion

      #region Kampf

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindestens eine Wanze
      /// sieht.
      /// </summary>
      /// <param name="wanze">Die nächstgelegene Wanze.</param>
      public override void SiehtFeind(Wanze wanze)
      {
      }

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindestens eine Ameise eines
      /// anderen Volkes sieht.
      /// </summary>
      /// <param name="ameise">Die nächstgelegen feindliche Ameise.</param>
      public override void SiehtFeind(Ameise ameise)
      {
      }

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise von einer Wanze angegriffen
      /// wird.
      /// </summary>
      /// <param name="wanze">Die angreifende Wanze.</param>
      public override void WirdAngegriffen(Wanze wanze)
      {
      }

      /// <summary>
      /// Wird wiederholt aufgerufen in der die Ameise von einer Ameise eines
      /// anderen Volkes Ameise angegriffen wird.
      /// </summary>
      /// <param name="ameise">Die angreifende feindliche Ameise.</param>
      public override void WirdAngegriffen(Ameise ameise)
      {
      }

      #endregion

      #region Sonstiges

      /// <summary>
      /// Wird einmal aufgerufen, wenn die Ameise gestorben ist.
      /// </summary>
      /// <param name="todesart">Die Todesart der Ameise</param>
      public override void IstGestorben(Todesart todesart)
      {
      }

      /// <summary>
      /// Wird unabhängig von äußeren Umständen in jeder Runde aufgerufen.
      /// </summary>
      public override void Tick()
      {
      if (Ziel == null)
      {
      if (Kaste == "Zuckerameise")
      {
      Zucker zucker = KoordinatenSpeicher.GibZucker();

      if (zucker != null)
      {
      if(zucker.Menge <= 10)
      {
      KoordinatenSpeicher.KoordinateLoeschen(zucker);
      GeheZuZiel(zucker);
      }
      else
      {
      GeheGeradeaus();
      }
      }
      }
      if (Kaste == "Obstameise")
      {
      Obst obst = KoordinatenSpeicher.GibObst();
      if (obst != null)
      {
      if (!BrauchtNochTräger(obst))
      {
      KoordinatenSpeicher.KoordinateLoeschen(obst);
      GeheGeradeaus();
      }
      GeheZuZiel(obst);
      }
      }
      }
      else
      {
      GeheGeradeaus();
      }
      }

      #endregion

      }
      }



      Und hier der Koordinatenspeicher:


      using System;
      using System.Collections.Generic;
      using System.Text;
      using System.Collections;
      using AntMe.Deutsch;

      namespace AntMe.Spieler
      {
      class KoordinatenSpeicher
      {
      private static ArrayList zuckerKoordinaten = new ArrayList();
      private static ArrayList obstKoordinaten = new ArrayList();
      private static ArrayList geloeschteKoordinaten = new ArrayList();

      public static ArrayList ZuckerKoordinaten
      {
      get { return zuckerKoordinaten; }
      }

      public static ArrayList ObstKoordinaten
      {
      get { return obstKoordinaten; }
      }

      public static ArrayList GeloeschteKoordinaten
      {
      get { return geloeschteKoordinaten;}
      }

      public static void KoordinateSpeichern(Spielobjekt koordinate)
      {
      if (koordinate != null)
      {
      if (koordinate is Zucker)
      {
      if (!zuckerKoordinaten.Contains(koordinate) && !geloeschteKoordinaten.Contains(koordinate))
      {
      zuckerKoordinaten.Add(koordinate);
      }
      }
      if (koordinate is Obst)
      {
      if (!obstKoordinaten.Contains(koordinate) && !geloeschteKoordinaten.Contains(koordinate))
      {
      obstKoordinaten.Add(koordinate);
      }
      }
      }
      }

      public static void KoordinateLoeschen(Spielobjekt koordinate)
      {
      zuckerKoordinaten.Remove(koordinate);
      obstKoordinaten.Remove(koordinate);
      geloeschteKoordinaten.Add(koordinate);
      }

      public static Zucker GibZucker()
      {
      if(zuckerKoordinaten.Count > 0)
      {
      foreach (Spielobjekt koordinate in zuckerKoordinaten)
      {
      return (koordinate as Zucker);
      }
      }
      return null;
      }

      public static Obst GibObst()
      {
      if (obstKoordinaten.Count > 0)
      {
      foreach (Spielobjekt koordinate in obstKoordinaten)
      { return (koordinate as Obst); }
      }
      return null;
      }

      }
      }

    • Das Problem, das ich so im ersten Moment erkenne ist, dass deine Ameisen auch noch das Ziel Zucker oser Obst haben, wenn sie es schon tragen... Schreib mal in die Tick Prozedur so was wie

      If(this.AktuelleLast>0)
      GeheZuBau();
      else
      //den Rest

      VG
      Neitsch
    • [cs]
      if (zucker.Menge <= 10)
      {
      KoordinatenSpeicher.KoordinateLoeschen(zucker);
      GeheZuZiel(zucker);
      }
      else
      {
      GeheGeradeaus();
      }
      [/cs]
      Deine Ameisen gehen momentan nur zu einem Zuckerhaufen, wenn die Zuckermenge kleiner als 10 ist.
      Mach statt dem "GeheGeradeaus()" bei "else" einfach ein "GeheZuZiel(zucker)".
      MUH!
    • Ja hab ich auch gedacht, dann auch gemacht, aber es hat sich nichts geändert. Die ameisen laufen einfach nur geradeaus. Ich habe das gefühl als bekämen sie gar keine Koordinaten und als würden sie dauerhaft irgendein Ziel haben. Denn in Tick steht ja if(Ziel == null). Ich verstehe das einfach nicht... Man kann ja nichtmal erkennen ob die ArrayLists nicht funktionieren oder ob es an Tick liegt. Trotzdem Danke schonmal :)
    • Ok, gut ich habe es jetzt geschafft. Es lag daran, dass in Tick stand, dass die Ameisen if(Ziel == null) sie nach Koordinaten gucken sollen und else (also wenn sie ein Ziel haben) sie geradeaus gehen sollen. Das heißt sie bekommenb ein Ziel und gehen dann nurnoch geradeaus. :P Jetzt funktioniert alles wie es soll :))) Danke euch die ihr mir geholfen habt, hier nochmal mein fertiger Code:

      Vorlage.cs

      using System;
      using System.Collections.Generic;

      using AntMe.Deutsch;

      // Füge hier hinter AntMe.Spieler einen Punkt und deinen Namen ohne Leerzeichen
      // ein! Zum Beispiel "AntMe.Spieler.WolfgangGallo".
      namespace AntMe.Spieler
      {

      // Das Spieler-Attribut erlaubt das Festlegen des Volk-Names und von Vor-
      // und Nachname des Spielers. Der Volk-Name muß zugewiesen werden, sonst wird
      // das Volk nicht gefunden.
      [Spieler(
      Volkname = "Gedächtnisameisen",
      Vorname = "Hachel",
      Nachname = "Schlach"
      )]

      // Das Typ-Attribut erlaubt das Ändern der Ameisen-Eigenschaften. Um den Typ
      // zu aktivieren muß ein Name zugewiesen und dieser Name in der Methode
      // BestimmeTyp zurückgegeben werden. Das Attribut kann kopiert und mit
      // verschiedenen Namen mehrfach verwendet werden.
      // Eine genauere Beschreibung gibts in Lektion 6 des Ameisen-Tutorials.
      [Kaste(
      Name = "Zuckerameise",
      GeschwindigkeitModifikator = 0,
      DrehgeschwindigkeitModifikator = -1,
      LastModifikator = 1,
      ReichweiteModifikator = 1,
      SichtweiteModifikator = -1,
      EnergieModifikator = 1,
      AngriffModifikator = -1
      )]

      [Kaste(
      Name = "Apfelameise",
      GeschwindigkeitModifikator = -1,
      DrehgeschwindigkeitModifikator = -1,
      LastModifikator = 2,
      ReichweiteModifikator = 1,
      SichtweiteModifikator = -1,
      EnergieModifikator = 1,
      AngriffModifikator = -1
      )]

      public class MeineAmeise : Basisameise
      {

      #region Kaste

      /// <summary>
      /// Bestimmt die Kaste einer neuen Ameise.
      /// </summary>
      /// <param name="anzahl">Die Anzahl der von jeder Kaste bereits vorhandenen
      /// Ameisen.</param>
      /// <returns>Der Name der Kaste der Ameise.</returns>
      public override string BestimmeKaste(Dictionary<string, int> anzahl)
      {
      if (anzahl["Apfelameise"] < 25)
      {
      return "Apfelameise";
      }
      else
      {
      return "Zuckerameise";
      }
      }


      #endregion

      #region Fortbewegung

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn der die Ameise nicht weiss wo sie
      /// hingehen soll.
      /// </summary>
      public override void Wartet()
      {
      GeheGeradeaus();
      }

      /// <summary>
      /// Wird einmal aufgerufen, wenn die Ameise ein Drittel ihrer maximalen
      /// Reichweite überschritten hat.
      /// </summary>
      public override void WirdMüde()
      {
      GeheZuBau();
      }

      #endregion

      #region Nahrung

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindestens einen
      /// Zuckerhaufen sieht.
      /// </summary>
      /// <param name="zucker">Der nächstgelegene Zuckerhaufen.</param>
      public override void Sieht(Zucker zucker)
      {
      KoordinatenSpeicher.KoordinateSpeichern(zucker);
      }

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindstens ein
      /// Obststück sieht.
      /// </summary>
      /// <param name="obst">Das nächstgelegene Obststück.</param>
      public override void Sieht(Obst obst)
      {
      KoordinatenSpeicher.KoordinateSpeichern(obst);
      }

      /// <summary>
      /// Wird einmal aufgerufen, wenn di e Ameise einen Zuckerhaufen als Ziel
      /// hat und bei diesem ankommt.
      /// </summary>
      /// <param name="zucker">Der Zuckerhaufen.</param>
      public override void ZielErreicht(Zucker zucker)
      {
      Nimm(zucker);
      GeheZuBau();
      }

      /// <summary>
      /// Wird einmal aufgerufen, wenn die Ameise ein Obststück als Ziel hat und
      /// bei diesem ankommt.
      /// </summary>
      /// <param name="obst">Das Obstück.</param>
      public override void ZielErreicht(Obst obst)
      {
      Nimm(obst);
      GeheZuBau();
      }

      #endregion

      #region Kommunikation

      /// <summary>
      /// Wird einmal aufgerufen, wenn die Ameise eine Markierung des selben
      /// Volkes riecht. Einmal gerochene Markierungen werden nicht erneut
      /// gerochen.
      /// </summary>
      /// <param name="markierung">Die nächste neue Markierung.</param>
      public override void RiechtFreund(Markierung markierung)
      {
      }

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindstens eine Ameise des
      /// selben Volkes sieht.
      /// </summary>
      /// <param name="ameise">Die nächstgelegene befreundete Ameise.</param>
      public override void SiehtFreund(Ameise ameise)
      {
      }

      /// <summary>
      /// Wird aufgerufen, wenn die Ameise eine befreundete Ameise eines anderen Teams trifft.
      /// </summary>
      /// <param name="ameise"></param>
      public override void SiehtVerbündeten(Ameise ameise)
      {
      }

      #endregion

      #region Kampf

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindestens eine Wanze
      /// sieht.
      /// </summary>
      /// <param name="wanze">Die nächstgelegene Wanze.</param>
      public override void SiehtFeind(Wanze wanze)
      {
      }

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise mindestens eine Ameise eines
      /// anderen Volkes sieht.
      /// </summary>
      /// <param name="ameise">Die nächstgelegen feindliche Ameise.</param>
      public override void SiehtFeind(Ameise ameise)
      {
      }

      /// <summary>
      /// Wird wiederholt aufgerufen, wenn die Ameise von einer Wanze angegriffen
      /// wird.
      /// </summary>
      /// <param name="wanze">Die angreifende Wanze.</param>
      public override void WirdAngegriffen(Wanze wanze)
      {
      }

      /// <summary>
      /// Wird wiederholt aufgerufen in der die Ameise von einer Ameise eines
      /// anderen Volkes Ameise angegriffen wird.
      /// </summary>
      /// <param name="ameise">Die angreifende feindliche Ameise.</param>
      public override void WirdAngegriffen(Ameise ameise)
      {
      }

      #endregion

      #region Sonstiges

      /// <summary>
      /// Wird einmal aufgerufen, wenn die Ameise gestorben ist.
      /// </summary>
      /// <param name="todesart">Die Todesart der Ameise</param>
      public override void IstGestorben(Todesart todesart)
      {
      }

      /// <summary>
      /// Wird unabhängig von äußeren Umständen in jeder Runde aufgerufen.
      /// </summary>
      public override void Tick()
      {
      if (Ziel == null)
      {
      if (Kaste == "Zuckerameise")
      {
      Zucker zucker = KoordinatenSpeicher.GibZucker();

      if (zucker != null)
      {
      if(zucker.Menge <= 10)
      {
      KoordinatenSpeicher.KoordinateLoeschen(zucker);
      GeheZuZiel(zucker);
      }
      else
      {
      GeheZuZiel(zucker);
      }
      }
      }
      if (Kaste == "Apfelameise")
      {
      Obst obst = KoordinatenSpeicher.GibObst();

      if (obst != null)
      {
      if (BrauchtNochTräger(obst))
      {
      GeheZuZiel(obst);
      }
      else
      {
      KoordinatenSpeicher.KoordinateLoeschen(obst);
      }
      }
      }
      }
      }

      #endregion

      }
      }

      Und der Koordinatenspeicher


      using System;
      using System.Collections.Generic;
      using System.Text;
      using System.Collections;
      using AntMe.Deutsch;

      namespace AntMe.Spieler
      {
      class KoordinatenSpeicher
      {
      private static ArrayList zuckerKoordinaten = new ArrayList();
      private static ArrayList obstKoordinaten = new ArrayList();
      private static ArrayList geloeschteKoordinaten = new ArrayList();

      public static ArrayList ZuckerKoordinaten
      {
      get { return zuckerKoordinaten; }
      }

      public static ArrayList ObstKoordinaten
      {
      get { return obstKoordinaten; }
      }

      public static ArrayList GeloeschteKoordinaten
      {
      get { return geloeschteKoordinaten;}
      }

      public static void KoordinateSpeichern(Spielobjekt koordinate)
      {
      if (koordinate != null)
      {
      if (koordinate is Zucker)
      {
      if (!zuckerKoordinaten.Contains(koordinate) && !geloeschteKoordinaten.Contains(koordinate))
      {
      zuckerKoordinaten.Add(koordinate);
      }
      }
      if (koordinate is Obst)
      {
      if (!obstKoordinaten.Contains(koordinate) && !geloeschteKoordinaten.Contains(koordinate))
      {
      obstKoordinaten.Add(koordinate);
      }
      }
      }
      }

      public static void KoordinateLoeschen(Spielobjekt koordinate)
      {
      zuckerKoordinaten.Remove(koordinate);
      obstKoordinaten.Remove(koordinate);
      geloeschteKoordinaten.Add(koordinate);
      }

      public static Zucker GibZucker()
      {
      if(zuckerKoordinaten.Count > 0)
      {
      foreach (Spielobjekt koordinate in zuckerKoordinaten)
      {
      return (koordinate as Zucker);
      }
      }
      return null;
      }

      public static Obst GibObst()
      {
      if (obstKoordinaten.Count > 0)
      {
      foreach (Spielobjekt koordinate in obstKoordinaten)
      { return (koordinate as Obst); }
      }
      return null;
      }

      }
      }