/// <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(); } }
/// <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(); } }
/// <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(); } }
/// <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(); } }
/// <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(); }
/// <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(); } }
/// <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(); }
/// <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(); } }
/// <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(); } }
/// <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 } }