Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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));
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
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>
 internal virtual void RiechtFreundBase(CoreMarker markierung)
 {
 }