Beispiel #1
0
        /// <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)
        {
            if (/*!trägtNahrung //rauskommentiert, damit feindliche Ameisen den Apfel nicht wegtragen können &&*/ !greiftAn)
            {
                if (FuzzyInferenceSystem.Superdecision5x5x2(character.wut, character.energie, character.angreifen, memory.GetDecisionValue(DecisionType.AngreifenAmeise)))
                {
                    //Hilfe rufen
                    SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.HilfeAmeise, ameise)), MarkierungGrößeHilfeLokal);

                    //evtl. Nahrung fallen lassen
                    if (trägtNahrung)
                    {
                        LasseNahrungFallen();
                        trägtNahrung = false;
                    }

                    //Angreifen
                    GreifeAn(ameise);
                    greiftAn = true;
                    memory.ActionDone(DecisionType.AngreifenAmeise);
                    setActionBreak();
                }
                else
                {
                    Weitermachen();
                }
            }
            else
            {
                Weitermachen();
            }
        }
Beispiel #2
0
        /// <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)
        {
            if (!trägtNahrung && !greiftAn)
            {
                if (FuzzyInferenceSystem.CorrelateDecisionfunctions(FuzzyInferenceSystem.Superdecision5x5x2_Double(character.wut, character.energie, character.angreifen, memory.GetDecisionValue(DecisionType.AngreifenWanze)), FuzzyInferenceSystem.Superdecision5x5x2_Double(character.teamfaehigkeit, character.ameisenFreundeInNaehe, character.angreifen, memory.GetDecisionValue(DecisionType.AngreifenWanze))))
                {
                    //hilfe rufen
                    SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.HilfeWanze, wanze)), MarkierungGrößeHilfe);

                    //angreifen
                    GreifeAn(wanze);
                    greiftAn = true;
                    memory.ActionDone(DecisionType.AngreifenWanze);
                    setActionBreak();
                }
                else
                {
                    //Entscheidung wegrennen
                    GeheWegVon(wanze);
                    memory.ActionDone(DecisionType.Wegrennen);
                    setActionBreak();
                }
            }
            else
            {
                Weitermachen();
            }
        }
Beispiel #3
0
        /// <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)
        {
            if (!trägtNahrung)
            {
                if (FuzzyInferenceSystem.CorrelateDecisionfunctions(FuzzyInferenceSystem.Superdecision5x5x2_Double(character.faulheit, character.energie, character.sammelnobst, memory.GetDecisionValue(DecisionType.SammelnObst)), FuzzyInferenceSystem.Superdecision5x5x2_Double(character.teamfaehigkeit, character.ameisenFreundeInNaehe, character.sammelnobst, memory.GetDecisionValue(DecisionType.Gruppieren))))
                {
                    GeheZuZiel(obst);
                    memory.ActionDone(DecisionType.SammelnObst);
                    memory.ActionDone(DecisionType.Gruppieren);
                    setActionBreak();

                    //SprüheMarkierung
                    SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.HilfeObst, obst)), MarkierungGrößeHilfeLokal);
                }
                else
                {
                    //kein Bock
                    Weitermachen();
                }
            }
            else
            {
                //trägt Nahrung
                //Weitermachen();
                GeheZuBau();
            }
        }
Beispiel #4
0
        /// <summary>
        /// Wird unabhängig von äußeren Umständen in jeder Runde aufgerufen.
        /// </summary>
        public override void Tick()
        {
            currentFrame++;

            //GeheGeradeaus() unterbrechen
            if (currentFrame % 50 == 0 && Ziel == null)
            {
                //BleibStehen(); //Nicht benötigt, ist in Weitermachen() enthalten
                //Weitermachen(); //nervt gerade, weil Ameisen ihr Ziel verlieren
            }

            //Erfolglose Aktionen abbrechen
            if (breakActionAtFrame != 0 && breakActionAtFrame < currentFrame)
            {
                breakActionAtFrame = 0;
                //LasseNahrungFallen(); //bringt nichts
                if (!trägtNahrung)
                {
                    BleibStehen();
                    DreheUmWinkel(90);
                    GeheGeradeaus();
                }
                memory.ActionUnsuccessful();
                return;
            }

            if (trägtNahrung)
            {
                //Richtung zum Bau beibehalten
                GeheZuBau();

                //Ameisenstraße
                //nur, wenn sie Zucker trägt
                if (GetragenesObst == null)
                {
                    if (EntfernungZuBau > 10)
                    {
                        if (currentFrame % 20 == 0) //nur alle x Frames ausführen
                        {
                            SprüheMarkierung(Markers.Add(new SmartassAnts.Marker(Marker.MarkerType.Zucker, (Richtung + 180) % 360)), MarkierungGrößeAmeisenstraße);
                        }
                    }
                }
                else
                {
                    //Apfelhelfer
                    if (BrauchtNochTräger(GetragenesObst))
                    {
                        SprüheMarkierung(Markers.Add(new SmartassAnts.Marker(Marker.MarkerType.HilfeObst, GetragenesObst)), MarkierungGrößeHilfeLokal);
                    }
                }
            }
            else
            {
                Weitermachen();
            }
        }
Beispiel #5
0
 /// <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);
      * trägtNahrung = true;
      * GeheZuBau();*/
     if (!trägtNahrung)
     {
         //Zucker nehmen
         Nimm(obst);
         trägtNahrung = true;
         SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.Obst, obst)), MarkierungGrößeInformation);
     }
     GeheZuBau();
 }
Beispiel #6
0
        /// <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)
        {
            if (!trägtNahrung && !greiftAn)
            {
                if (FuzzyInferenceSystem.Superdecision5x5x2(character.wut, character.energie, character.angreifen, memory.GetDecisionValue(DecisionType.AngreifenWanze)))
                {
                    if (FuzzyInferenceSystem.Superdecision5x5x2(character.wut, character.ameisenFreundeInNaehe, character.angreifen, memory.GetDecisionValue(DecisionType.AngreifenWanze)))
                    {
                        //hilfe rufen
                        SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.HilfeWanze, wanze)), MarkierungGrößeHilfe);

                        //angreifen
                        GreifeAn(wanze);
                        greiftAn = true;
                        memory.ActionDone(DecisionType.AngreifenWanze);
                        setActionBreak();
                    }
                    else
                    {
                        //wegrennen
                        //Entscheidung wegrennen
                        //GeheZuBau();
                        //memory.ActionDone(DecisionType.Wegrennen);
                        Weitermachen();
                    }
                }
            }
            else
            {
                //wegrennen
                //Entscheidung flüchten? -> Nahrung sofort fallen lassen

                /*if (EntfernungZuBau == 0)
                 * {
                 *  LasseNahrungFallen();
                 *  trägtNahrung = false;
                 *  GeheZuBau();
                 * }*/

                //speichern, dass Ameise bereits weggerannt ist?
                //memory.ActionDone(DecisionType.Wegrennen);

                Weitermachen();
            }
        }
Beispiel #7
0
        /// <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)
        {
            //Zucker näher ran als gemerkter Zucker der Kollonie?
            if (EntfernungZuBau < Memory.gemerkterZucker_EntfernungZuBau)
            {
                Memory.gemerkterZucker = zucker;
            }

            //if (!trägtNahrung)
            //{
            //Zucker nehmen
            Nimm(zucker);
            trägtNahrung = true;

            SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.Zucker, zucker)), MarkierungGrößeInformation);
            //}
            GeheZuBau();
        }
Beispiel #8
0
        /// <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)
        {
            //Alle Ameisen sollen Zucker kennen
            if (Memory.gemerkterZucker == null)
            {
                Memory.gemerkterZucker = zucker;
            }
            else
            {
                //aktueller Zucker näher ran? -> in ZielErreicht(zucker) prüfen
                //aktueller Zucker voller?
                //-> neuen Zucker merken
                if (zucker.Menge > Memory.gemerkterZucker.Menge)
                {
                    Memory.gemerkterZucker = zucker;
                }
            }

            if (!trägtNahrung)
            {
                //if (FuzzyInferenceSystem.Superdecision5x5x2(character.faulheit, character.energie, character.sammelnzucker, memory.GetDecisionValue(DecisionType.SammelnZucker)))
                if (true)
                {
                    //SprüheMarkierung((int)Information.ZielNahrung, MarkierungGrößeSammler);
                    GeheZuZiel(zucker);
                    memory.ActionDone(DecisionType.SammelnZucker);
                    setActionBreak();

                    //SprüheMarkierung
                    SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.Zucker, zucker)), MarkierungGrößeInformation);
                }
                else
                {
                    Weitermachen();
                }
            }
            else
            {
                //traegt Nahrung
                //Weitermachen();
                GeheZuBau();
            }
        }
Beispiel #9
0
        /// <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)
        {
            //Zucker näher ran als gemerkter Zucker der Kollonie?
            if (EntfernungZuBau < Memory.gemerkterZucker_EntfernungZuBau)
            {
                Memory.gemerkterZucker = zucker;
                Memory.gemerkterZucker_EntfernungZuBau = EntfernungZuBau;
            }

            if (zucker.Menge > 0)
            {
                //Zucker nehmen
                Nimm(zucker);
                trägtNahrung = true;

                SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.Zucker, zucker)), MarkierungGrößeInformation);
                GeheZuBau();
            }
            else
            {
                Weitermachen();
            }
        }
Beispiel #10
0
        /// <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)
        {
            Marker marker = Markers.Get(markierung.Information);

            try
            {
                switch (marker.markerType)
                {
                case Marker.MarkerType.HilfeAmeise:
                    //Hilfsbereitschaft, Teamfähigkeit prüfen
                    //Nahrung fallen lassen
                    //helfen

                    //wenn sie nicht schon beim angreifen ist
                    if (!greiftAn)
                    {
                        //dann über Angriff nachdenken
                        if (FuzzyInferenceSystem.Superdecision5x5x2(character.teamfaehigkeit, character.ameisenFreundeInNaehe, character.angreifen, memory.GetDecisionValue(DecisionType.AngreifenAmeise)))
                        {
                            if (marker.markerInformation == Marker.MarkerInformationType.Insekt)
                            {
                                LasseNahrungFallen();
                                trägtNahrung = false;
                                GreifeAn(marker.Insekt);
                                greiftAn    = true;
                                hilftFreund = true;
                                memory.ActionDone(DecisionType.AngreifenAmeise);
                                setActionBreak();
                            }
                            else
                            {
                                Weitermachen();
                            }
                        }
                        else
                        {
                            Weitermachen();
                        }
                    }
                    else
                    {
                        Weitermachen();
                    }
                    break;

                case Marker.MarkerType.HilfeObst:
                    //Hilfsbereitschaft, Teamfähigkeit prüfen
                    //nur wenn keine eigene Nahrung
                    //helfen
                    if (!trägtNahrung)
                    {
                        if (FuzzyInferenceSystem.Superdecision5x5x2(character.faulheit, character.energie, character.sammelnobst, memory.GetDecisionValue(DecisionType.SammelnObst)) && FuzzyInferenceSystem.Superdecision5x5x2(character.teamfaehigkeit, character.ameisenFreundeInNaehe, character.sammelnobst, memory.GetDecisionValue(DecisionType.Gruppieren)))
                        {
                            if (marker.markerInformation == Marker.MarkerInformationType.Object)
                            {
                                GeheZuZiel(marker.Objekt);
                                hilftFreund = true;
                                memory.ActionDone(DecisionType.SammelnObst);
                                memory.ActionDone(DecisionType.Gruppieren);
                                setActionBreak();
                                //SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.Obst, marker.Objekt)), MarkierungGrößeHilfeLokal);
                            }
                            else
                            {
                                Weitermachen();
                            }
                        }
                        else
                        {
                            Weitermachen();
                        }
                    }
                    else
                    {
                        Weitermachen();
                    }
                    break;

                case Marker.MarkerType.HilfeWanze:
                    //Hilfsbereitschaft, Teamfähigkeit prüfen
                    //Anzahl Freunde prüfen
                    //Nahrung fallen lassen
                    //helfen

                    //wenn sie nicht schon beim Angreifen ist
                    if (!greiftAn)
                    {
                        //dann über Angriff nachdenken
                        if (FuzzyInferenceSystem.Superdecision5x5x2(character.teamfaehigkeit, character.ameisenFeindeInNaehe, character.angreifen, memory.GetDecisionValue(DecisionType.AngreifenWanze)))
                        {
                            if (marker.markerInformation == Marker.MarkerInformationType.Insekt)
                            {
                                LasseNahrungFallen();
                                trägtNahrung = false;
                                GreifeAn(marker.Insekt);
                                greiftAn    = true;
                                hilftFreund = true;
                                memory.ActionDone(DecisionType.AngreifenWanze);
                                setActionBreak();
                                //SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.HilfeWanze, marker.Insekt)), MarkierungGrößeHilfeLokal);
                            }
                        }
                        else
                        {
                            Weitermachen();
                        }
                    }
                    else
                    {
                        Weitermachen();
                    }
                    break;

                case Marker.MarkerType.Obst:
                    //das gleiche wie bei siehtObst()
                    if (!trägtNahrung)
                    {
                        if (FuzzyInferenceSystem.Superdecision5x5x2(character.faulheit, character.energie, character.sammelnobst, memory.GetDecisionValue(DecisionType.SammelnObst)) && FuzzyInferenceSystem.Superdecision5x5x2(character.teamfaehigkeit, character.ameisenFreundeInNaehe, character.sammelnobst, memory.GetDecisionValue(DecisionType.Gruppieren)))
                        {
                            if (marker.markerInformation == Marker.MarkerInformationType.Object)
                            {
                                GeheZuZiel(marker.Objekt);
                                hilftFreund = true;
                                memory.ActionDone(DecisionType.SammelnObst);
                                memory.ActionDone(DecisionType.Gruppieren);
                                setActionBreak();

                                //SprüheMarkierung
                                //SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.HilfeObst, marker.Objekt)), MarkierungGrößeHilfeLokal);
                            }
                            else
                            {
                                Weitermachen();
                            }
                        }
                        else
                        {
                            //kein Bock, Obst aufzunehmen
                            Weitermachen();
                        }
                    }
                    else
                    {
                        Weitermachen();
                    }
                    break;

                case Marker.MarkerType.Zucker:
                    //das Gleiche wie bei siehtZucker()
                    if (!trägtNahrung)
                    {
                        if (FuzzyInferenceSystem.Superdecision5x5x2(character.faulheit, character.energie, character.sammelnzucker, memory.GetDecisionValue(DecisionType.SammelnZucker)))
                        {
                            //SprüheMarkierung((int)Information.ZielNahrung, MarkierungGrößeSammler);
                            if (marker.markerInformation == Marker.MarkerInformationType.Object)
                            {
                                GeheZuZiel(marker.Objekt);
                            }
                            else
                            {
                                if (marker.markerInformation == Marker.MarkerInformationType.Richtung)
                                {
                                    DreheInRichtung(marker.richtung);
                                    GeheGeradeaus();


                                    memory.ActionDone(DecisionType.SammelnZucker);
                                    setActionBreak();

                                    //SprüheMarkierung
                                    //SprüheMarkierung(Markers.Add(new Marker(Marker.MarkerType.Zucker, marker.Objekt)), MarkierungGrößeInformation);
                                }
                                else
                                {
                                    Weitermachen();
                                }
                            }
                        }
                        else
                        {
                            Weitermachen();
                        }
                    }
                    else
                    {
                        //traegt Nahrung
                        Weitermachen();
                    }
                    break;

                default:
                    Weitermachen();
                    break;
                }
            }
            catch (NullReferenceException)
            {
                //wahrscheinlich ungültige Markierung
            }
        }