/// <summary> /// Verfolgt das aktuelle Ziel weiter oder geht geradeaus, wenn kein Ziel vorhanden. /// </summary> private void Weitermachen() { if (Ziel != null) { if (Ziel.GetType() == typeof(Insekt)) { GreifeAn((Insekt)Ziel); greiftAn = true; } else { GeheZuZiel(Ziel); } } else { if (FuzzyInferenceSystem.Superdecision5x5x2(character.faulheit, character.energie, character.laufen, memory.GetDecisionValue(DecisionType.Laufen))) { GeheGeradeaus(); } else { //kein Bock BleibStehen(); WaitUntil(50); } } }
/// <summary> /// Verfolgt das aktuelle Ziel weiter oder geht geradeaus, wenn kein Ziel vorhanden. /// </summary> private void Weitermachen() { if (Ziel != null) { if (Ziel.GetType() == typeof(Insekt)) { GreifeAn((Insekt)Ziel); greiftAn = true; } else { GeheZuZiel(Ziel); } } else { if (FuzzyInferenceSystem.Superdecision5x5x2(character.faulheit, character.energie, character.laufen, memory.GetDecisionValue(DecisionType.Laufen))) { if (AltesZiel != null) { GeheZuZiel(AltesZiel); //Zucker kann immer als Ziel beibehalten werden if (AltesZiel.GetType() != typeof(Zucker)) { AltesZiel = null; } } else { //Kein Ziel gemerkt GeheGeradeaus(); setActionBreak(); if (memory.LastAction != DecisionType.Laufen) { memory.ActionDone(DecisionType.Laufen); } } } else { //kein Bock BleibStehen(); WaitUntil(50); if (memory.LastAction != DecisionType.Warten) { memory.ActionDone(DecisionType.Warten); } } } }
/// <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 angreift oder noch Nahrung sammelt 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) { if (Ziel.GetType() == typeof(Zucker)) { AltesZiel = Ziel; } 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 && !greiftAn && !hilftFreund) { 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)))) { 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.ameisenFreundeInNaehe, character.angreifen, memory.GetDecisionValue(DecisionType.AngreifenWanze))) { if (marker.markerInformation == Marker.MarkerInformationType.Insekt) { if (Ziel.GetType() == typeof(Zucker)) { AltesZiel = Ziel; } 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 && !greiftAn && !hilftFreund) { 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)))) { 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 && !greiftAn && !hilftFreund) { 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); memory.ActionDone(DecisionType.SammelnZucker); setActionBreak(); } else { if (marker.markerInformation == Marker.MarkerInformationType.Richtung) { if (Ziel.GetType() != typeof(Zucker)) { //wichtig, damit Ameisen, die zum Zucker gehen, nicht am Zucker vorbei gelenkt werden DreheInRichtung(marker.richtung); GeheGeradeaus(); memory.ActionDone(DecisionType.SammelnZucker); setActionBreak(); } else { Weitermachen(); } //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 } }