예제 #1
0
 public void setParentAnt(SmartassAnt parent)
 {
     parentAnt             = parent;
     ameisenFeindeInNaehe  = new AmeisenFeindeInNaehe(CircumstanceType.AmeisenFeindeInNähe, parentAnt);
     ameisenFreundeInNaehe = new AmeisenFreundeInNaehe(CircumstanceType.AmeisenFreundeInNähe, parentAnt);
     energie = new Energie(CircumstanceType.Energie, parentAnt);
 }
예제 #2
0
 public AmeisenFreundeInNaehe(CircumstanceType circumstanceType, Basisameise parentAnt) : base(circumstanceType, parentAnt)
 {
     characterParts = new DotFuzzy.LinguisticVariable("AmeisenFreundeInNaehe");
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Keine", FuzzyValues[0][0], FuzzyValues[0][1], FuzzyValues[0][2], FuzzyValues[0][3]));
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Kaum", FuzzyValues[1][0], FuzzyValues[1][1], FuzzyValues[1][2], FuzzyValues[1][3]));
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Wenige", FuzzyValues[2][0], FuzzyValues[2][1], FuzzyValues[2][2], FuzzyValues[2][3]));
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Genug", FuzzyValues[3][0], FuzzyValues[3][1], FuzzyValues[3][2], FuzzyValues[3][3]));
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Viele", FuzzyValues[4][0], FuzzyValues[4][1], FuzzyValues[4][2], FuzzyValues[4][3]));
 }
예제 #3
0
 public Energie(CircumstanceType circumstanceType, Basisameise parentAnt) : base(circumstanceType, parentAnt)
 {
     characterParts = new DotFuzzy.LinguisticVariable("Energie");
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Sehr_Schwach", FuzzyValues[0][0], FuzzyValues[0][1], FuzzyValues[0][2], FuzzyValues[0][3]));
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Schwach", FuzzyValues[1][0], FuzzyValues[1][1], FuzzyValues[1][2], FuzzyValues[1][3]));
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Normal", FuzzyValues[2][0], FuzzyValues[2][1], FuzzyValues[2][2], FuzzyValues[2][3]));
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Ausgeruht", FuzzyValues[3][0], FuzzyValues[3][1], FuzzyValues[3][2], FuzzyValues[3][3]));
     characterParts.MembershipFunctionCollection.Add(new DotFuzzy.MembershipFunction("Sehr_Ausgeruht", FuzzyValues[4][0], FuzzyValues[4][1], FuzzyValues[4][2], FuzzyValues[4][3]));
 }
        public static IAmeisenActionHandler create(string kaste, Basisameise ameise)
        {
            if (kaste == KastenHandler.COLLECTOR) return new CollectorAmeisenActionHandler(ameise);
            if (kaste == KastenHandler.DEFENDER) return new DefenderAmeisenActionHandler(ameise);
            if (kaste == KastenHandler.KILLER) return new KillerAmeisenActionHandler(ameise);
            if (kaste == KastenHandler.SCOUTER) return new ScouterAmeisenActionHandler(ameise);

            throw new Exception("Could not find a matching Kaste");
        }
예제 #5
0
        /// <summary>
        /// Diese Methode wird in jeder Simulationsrunde aufgerufen - ungeachtet von zusätzlichen
        /// Bedingungen. Dies eignet sich für Aktionen, die unter Bedingungen ausgeführt werden
        /// sollen, die von den anderen Methoden nicht behandelt werden.
        /// Weitere Infos unter http://wiki.antme.net/de/API1:Tick
        /// </summary>
        public override void Tick()
        {
            // Wenn 2 Gegner in der Nähe des Störers ist, ruft sie um Hilfe, damit die Gegner beseitigt werden und sie den Apfel wegziehen kann.
            if (Kaste == "Störer" && AktuelleLast > 0 && AnzahlFremderAmeisenInSichtweite > 2 && Hilferufe < 1)
            {
                Hilferuf.Add(this);
                Hilferufe++;
            }
            // Und wenn der Apfel weit genug weg ist, wird der Apfel wieder fallen gelassen.
            if (Kaste == "Störer" && AktuelleLast > 0 && (int)(Math.Sqrt(Math.Pow(GenaueBauKoordinaten.Item1 - HoleKoordinaten(this).Item1, 2) + Math.Pow(GenaueBauKoordinaten.Item2 - HoleKoordinaten(this).Item2, 2))) > 205)
            {
                LasseNahrungFallen();
                zielapfel = false;
                Hilferufe = 0;
            }
            // Krieger soll zu unserem Störer hingehen
            if (kriegerziel != null)
            {
                if (Koordinate.BestimmeEntfernung(this, kriegerziel) < 20 && AnzahlFremderAmeisenInSichtweite == 0)
                {
                    kriegerziel = null;
                }
            }
            // Sind Äpfel weg, werden sie auch aus der Liste entfernt
            for (int i = Äpfel.Count - 1; i >= 0; i--)
            {
                if (Äpfel.ElementAt(i).Item1.Menge == 0)
                {
                    Äpfel.Remove(Äpfel.ElementAt(i));
                }
            }

            // Positionsbestimmung von unserem Bau
            if (bau == null)
            {
                GeheZuBau();
                bau = Ziel;
                BleibStehen();
            }

            // Hat die feindliche Ameise ihre Last noch nicht abgelegt, soll sie solange verfolgt werden, bis sie es tut und in dem Moment werden ihre Koordinaten als gegnerischer Bau gespeichert
            if (ziel != null && GenaueBauKoordinaten == null)
            {
                if (ziel.AktuelleLast == 0)
                {
                    GenaueBauKoordinaten = HoleKoordinaten(ziel);
                }
                GeheZuKoordinate(HoleKoordinaten(ziel));
            }
        }
예제 #6
0
        /// <summary>
        /// Diese Methode ermittelt die Koordinaten für Ameisen auf dem Spielfeld.
        /// </summary>
        /// <param name="ameise"> Ameise </param>
        /// <returns> Koordinaten als Tuple </returns>
        public Tuple <int, int> HoleKoordinaten(Basisameise ameise)
        {
            if (bau != null)
            {
                double distanz  = Koordinate.BestimmeEntfernung(ameise, bau);
                double richtung = Koordinate.BestimmeRichtung(bau, ameise);

                double winkel = (richtung / 360) * (Math.PI * 2);

                int x = (int)(Math.Cos(winkel) * distanz);
                int y = (int)(Math.Sin(winkel) * distanz);

                return(new Tuple <int, int>(x, y));
            }
            GeheZuBau();
            bau = Ziel;
            BleibStehen();
            return(HoleKoordinaten(ameise));
        }
예제 #7
0
 internal Circumstance(CircumstanceType circumstanceType, Basisameise parentAnt)
 {
     this.circumstanceType = circumstanceType;
     this.parentAnt        = parentAnt;
     this.TypeOfCharacter  = CharacterTypes.Circumstance;
 }
 public ScouterAmeisenActionHandler(Basisameise ameise)
     : base(ameise)
 {
 }
예제 #9
0
        /// <summary>
        /// Wenn die Ameise keinerlei Aufträge hat, wartet sie auf neue Aufgaben. Um dir das
        /// mitzuteilen, wird diese Methode hier aufgerufen.
        /// Weitere Infos unter http://wiki.antme.net/de/API1:Wartet
        /// </summary>
        public override void Wartet()
        {
            // Wenn der Krieger nichts zutun hat, kein Störer Hilfe benötigt und der Gegnerische Bau bekannt ist
            if (Kaste == "Krieger")
            {
                if (GenaueBauKoordinaten != null && Hilferuf.Count == 0 && kriegerziel == null)
                {
                    // ...soll der Krieger sich zufälig um den Bau plazieren.
                    GeheZuKoordinate(AddiereTuple(GenaueBauKoordinaten, new Tuple <int, int>(Zufall.Zahl(-50, 50), Zufall.Zahl(-50, 50))));
                }
                if (Hilferuf.Count > 0 && kriegerziel == null)
                {
                    // hat eine Ameise ein Hilferuf getätigt, so wird es als neue Aufgabe hinzugefügt, um ihr zu helfen.
                    kriegerziel = Hilferuf.ElementAt(0);
                    Hilferuf.Remove(Hilferuf.ElementAt(0));
                }
                if (kriegerziel != null)
                {
                    // Dazu muss die Ameise den Bau verlassen und zu dieser Ameise hingehen.
                    GeheZuKoordinate(HoleKoordinaten(kriegerziel));
                }
                // Wenn der Späher wartet, soll er erstmal den gegnerischen Bau finden und ihn mitteilen
            }
            else if (Kaste == "Späher")
            {
                if (Kaste == "Späher" && GenaueBauKoordinaten != null)
                {
                    GeheZuKoordinate(AddiereTuple(GenaueBauKoordinaten, new Tuple <int, int>(Zufall.Zahl(-300, 300), Zufall.Zahl(-300, 300))));
                }
                else
                {
                    // ...und geht dazu zufällig über das ganze Feld.
                    GeheGeradeaus();
                }
                // Störer sollen Äpfel von der gegnerischen Basis wegziehen
            }
            else if (Kaste == "Störer")
            {
                for (int i = Äpfel.Count - 1; i >= 0; i--)
                {
                    if (GenaueBauKoordinaten != null)
                    {
                        // Wenn ein Apfel gefunden wurde, bestimmen wir wie weit dieser weg ist
                        int Bauentfernung = (int)(Math.Sqrt(Math.Pow(GenaueBauKoordinaten.Item1 - HoleKoordinaten(Äpfel.ElementAt(i).Item1).Item1, 2) + Math.Pow(GenaueBauKoordinaten.Item2 - HoleKoordinaten(Äpfel.ElementAt(i).Item1).Item2, 2)));
                        // Und nur wenn dieser im Radius von 200 um die Basis ist, gehen wir dort hin und ziehen daran.
                        if (Bauentfernung < 200 && Äpfel.ElementAt(i).Item2 < 3)
                        {
                            // Dazu müssen wir uns die Position des Apfels holen, um unsere Ameise dementsprechend auszurichten
                            zielapfel = true;
                            GeheZuZiel(Äpfel.ElementAt(i).Item1);
                            Nimm(Äpfel.ElementAt(i).Item1);

                            Tuple <int, int> position  = HoleKoordinaten(this);
                            Tuple <int, int> differenz = new Tuple <int, int>(GenaueBauKoordinaten.Item1 - position.Item1, GenaueBauKoordinaten.Item2 - position.Item2);

                            int    distanz  = (int)(Math.Sqrt(differenz.Item1 * differenz.Item1 + differenz.Item2 * differenz.Item2));
                            double radiant  = Math.Atan2(differenz.Item2, differenz.Item1);
                            int    richtung = (int)(radiant * 360 / (2 * Math.PI));

                            // und ziehen, sobald wir angekommen sind, den Apfel in 10er Schritten von der Basis weg
                            if (richtung >= 0)
                            {
                                richtung -= 180;
                            }
                            else
                            {
                                richtung += 180;
                            }
                            DreheInRichtung(richtung);
                            GeheGeradeaus(10);
                        }
                        // Sonst wartet sie mit den Kriegern am gegnerischen Bau
                        if (AktuelleLast == 0 && zielapfel == false)
                        {
                            GeheZuKoordinate(GenaueBauKoordinaten);
                        }
                    }
                }
            }
        }
 public DefenderAmeisenActionHandler(Basisameise ameise)
     : base(ameise)
 {
 }
 public CollectorAmeisenActionHandler(Basisameise ameise)
     : base(ameise)
 {
 }
예제 #12
0
 public KillerAmeisenActionHandler(Basisameise ameise)
     : base(ameise)
 {
 }