/// <summary> /// Prüft ob die Ameise eine Markierung bemerkt. /// </summary> /// <param name="ameise">betroffene Ameise</param> private static void ameiseUndMarkierungen(CoreAnt ameise) { CoreMarker marker = ameise.colony.Marker.FindMarker(ameise); if (marker != null) { PlayerCall.SmellsFriend(ameise, marker); ameise.SmelledMarker.Add(marker); } }
/// <summary> /// Findet die Markierung, die die gegebene Ameise noch nicht gerochen hat /// und die der Ameise am nächsten liegt. /// </summary> /// <remarks> /// Die Simulation legt ein Gitter mit dem maximalen Radius einer Markierung als /// Seitenlänge an und benutzt diese Methode auf dieser Instanz zum Finden von /// Markierungen. In dieses Gitter werden nur Markierungen einsortiert. /// </remarks> /// <param name="ant">Die Referenzameise.</param> /// <returns>Eine Markierung.</returns> public CoreMarker FindMarker(CoreAnt ant) { CoreMarker nearestMarker = null; int nearestMarkerDistance = int.MaxValue; // Bestimme die Zelle in der die übergebene Ameise sich befindet. int col = ant.CoordinateBase.X / sideLength; int row = ant.CoordinateBase.Y / sideLength; // Betrachte die Zelle und die acht Zellen daneben. for (int c = -1; c <= 1; c++) { if (col + c >= 0 && col + c < columns) { for (int r = -1; r <= 1; r++) { if (row + r >= 0 && row + r < rows) { List <T> cell = cells[col + c, row + r]; // Betrachte alle Markierungen in der aktuellen Zelle. for (int i = 0; i < cell.Count; i++) { CoreMarker marker = cell[i] as CoreMarker; Debug.Assert(marker != null); // Bestimme die Entfernung der Mittelpunkte und der Kreise. int distance = CoreCoordinate.BestimmeEntfernungDerMittelpunkteI(ant.CoordinateBase, marker.CoordinateBase); int circleDistance = distance - ant.CoordinateBase.Radius - marker.CoordinateBase.Radius; // Die neue Markierung wurde noch nicht gerochen und // liegt näher als die gemerkte. if (circleDistance <= 0 && distance < nearestMarkerDistance && !ant.SmelledMarker.Contains(marker)) { nearestMarkerDistance = distance; nearestMarker = marker; } } } } } } return(nearestMarker); }
/// <summary> /// Perform call to "SmellsFriend()" on given ant. /// </summary> /// <param name="ant">ant</param> /// <param name="marker">marker</param> public static void SmellsFriend(CoreAnt ant, CoreMarker marker) { AreaChanged( null, new AreaChangeEventArgs(ant.colony.Player, Area.SmellsFriend)); playerRights.PermitOnly(); ant.NimmBefehleEntgegen = true; try { ant.RiechtFreundBase(marker); } catch (Exception ex) { throw new AiException("KI-Fehler in der RiechtFreund(Markierung)-Methode", ex); } ant.NimmBefehleEntgegen = false; AreaChanged( null, new AreaChangeEventArgs(null, Area.Unknown)); }
/// <summary> /// Lässt die Ameise eine Markierung sprühen. Die Markierung enthält die /// angegebene Information und breitet sich um die angegebene Anzahl an /// Schritten weiter aus. Je weiter sich eine Markierung ausbreitet, desto /// kürzer bleibt sie aktiv. /// </summary> /// <param name="information">Die Information.</param> /// <param name="ausbreitung">Die Ausbreitung in Schritten.</param> internal void SprüheMarkierungBase(int information, int ausbreitung) { if (!NimmBefehleEntgegen) { return; } // Check for unsupported markersize if (ausbreitung < 0) { throw new AiException(Resource.SimulationCoreNegativeMarkerSize); } CoreMarker markierung = new CoreMarker(koordinate, ausbreitung, colony.Id); markierung.Information = information; colony.NewMarker.Add(markierung); SmelledMarker.Add(markierung); }
/// <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> internal virtual void RiechtFreundBase(CoreMarker markierung) { }