/// <summary> /// Entfernt Zucker und gibt die Zelle wieder frei. /// </summary> /// <param name="nahrung">Den zu entfernenden Zucker</param> public void EntferneZucker(CoreSugar sugar) { SugarHills.Remove(sugar); Cell cell = CellSpawnList.Find((x) => x.SpawnedFood == sugar); cell.SpawnedFood = null; }
/// <summary> /// Removes all empty sugar-hills from list. /// </summary> private void removeSugar() { // TODO: speedup //List<CoreSugar> gemerkterZucker = new List<CoreSugar>(); for (int i = 0; i < Playground.SugarHills.Count; i++) { CoreSugar zucker = Playground.SugarHills[i]; if (zucker != null) { if (zucker.Menge == 0) { //gemerkterZucker.Add(zucker); //Löschen Playground.EntferneZucker(zucker); i--; } } } //for(int i = 0; i < gemerkterZucker.Count; i++) { // CoreSugar zucker = gemerkterZucker[i]; // if(zucker != null) { // Playground.SugarHills.Remove(zucker); // } //} //gemerkterZucker.Clear(); }
/// <summary> /// Erzeugt einen neuen Zuckerhaufen. /// </summary> public void NeuerZucker() { Cell cell = findeRohstoffZelle(); int wert = mapRandom.Next(SimulationSettings.Custom.SugarAmountMinimum, SimulationSettings.Custom.SugarAmountMaximum); Vector2D punkt = cell.Position + new Vector2D(mapRandom.Next(cell.Width), mapRandom.Next(cell.Height)); CoreSugar zucker = new CoreSugar(punkt.X, punkt.Y, wert); SugarHills.Add(zucker); cell.SpawnedFood = zucker; }
/// <summary> /// Prüft ob eine Ameise einen Zuckerhaufen sieht. /// </summary> /// <param name="ant">betroffene Ameise</param> private void ameiseUndZucker(CoreAnt ant) { for (int i = 0; i < Playground.SugarHills.Count; i++) { CoreSugar sugar = Playground.SugarHills[i]; int entfernung = CoreCoordinate.BestimmeEntfernungI(ant.CoordinateBase, sugar.CoordinateBase); if (ant.ZielBase != sugar && entfernung <= ant.SichtweiteI) { PlayerCall.Spots(ant, sugar); } } }
/// <summary> /// Prüft ob eine Ameise an ihrem Ziel angekommen ist. /// </summary> /// <param name="ant">betroffene Ameise</param> private static void ameiseUndZiel(CoreAnt ant) { // Ameisenbau. if (ant.ZielBase is CoreAnthill) { if (ant.GetragenesObstBase == null) { ant.ZurückgelegteStreckeI = 0; ant.ZielBase = null; ant.SmelledMarker.Clear(); ant.colony.Statistik.CollectedFood += ant.AktuelleLastBase; ant.AktuelleLastBase = 0; ant.AktuelleEnergieBase = ant.MaximaleEnergieBase; ant.IstMüdeBase = false; } } // Zuckerhaufen. else if (ant.ZielBase is CoreSugar) { CoreSugar zucker = (CoreSugar)ant.ZielBase; ant.ZielBase = null; if (zucker.Menge > 0) { PlayerCall.TargetReached(ant, zucker); } } // Obststück. else if (ant.ZielBase is CoreFruit) { CoreFruit obst = (CoreFruit)ant.ZielBase; ant.ZielBase = null; if (obst.Menge > 0) { PlayerCall.TargetReached(ant, obst); } } // Insekt. else if (ant.ZielBase is CoreInsect) { } // Anderes Ziel. else { ant.ZielBase = null; } }
/// <summary> /// Perform call to "Spots(Sugar)" on given ant. /// </summary> /// <param name="ant">ant</param> /// <param name="sugar">sugar</param> public static void Spots(CoreAnt ant, CoreSugar sugar) { AreaChanged( null, new AreaChangeEventArgs(ant.colony.Player, Area.SpotsSugar)); playerRights.PermitOnly(); ant.NimmBefehleEntgegen = true; try { ant.SiehtBase(sugar); } catch (Exception ex) { throw new AiException("KI-Fehler in der Sieht(Zucker)-Methode", ex); } ant.NimmBefehleEntgegen = false; AreaChanged( null, new AreaChangeEventArgs(null, Area.Unknown)); }
/// <summary> /// Lässt das Insekt Zucker von einem Zuckerhaufen nehmen. /// </summary> /// <param name="zucker">Zuckerhaufen</param> internal void NimmBase(CoreSugar zucker) { if (!NimmBefehleEntgegen) { return; } int entfernung = CoreCoordinate.BestimmeEntfernungI(CoordinateBase, zucker.CoordinateBase); if (entfernung <= SimulationEnvironment.PLAYGROUND_UNIT) { int menge = Math.Min(MaximaleLastBase - aktuelleLast, zucker.Menge); AktuelleLastBase += menge; zucker.Menge -= menge; } else { Thread.Sleep(0); } }
/// <summary> /// Perform call to "TargetReached(Sugar)" on given ant. /// </summary> /// <param name="ant">ant</param> /// <param name="sugar">sugar</param> public static void TargetReached(CoreAnt ant, CoreSugar sugar) { AreaChanged( null, new AreaChangeEventArgs(ant.colony.Player, Area.ReachedSugar)); playerRights.PermitOnly(); ant.NimmBefehleEntgegen = true; try { ant.ZielErreichtBase(sugar); } catch (Exception ex) { throw new AiException(string.Format("{0}: KI-Fehler in der ZielErreicht(Zucker)-Methode", ant.colony.Player.Guid), ex); } ant.NimmBefehleEntgegen = false; AreaChanged( null, new AreaChangeEventArgs(null, Area.Unknown)); }
/// <summary> /// Wird einmal aufgerufen, wenn die Ameise einen Zuckerhaufen als Ziel /// hat und bei diesem ankommt. /// </summary> /// <param name="zucker">Der Zuckerhaufen.</param> internal virtual void ZielErreichtBase(CoreSugar zucker) { }
/// <summary> /// Wird wiederholt aufgerufen, wenn die Ameise mindestens einen /// Zuckerhaufen sieht. /// </summary> /// <param name="zucker">Der nächstgelegene Zuckerhaufen.</param> internal virtual void SiehtBase(CoreSugar zucker) { }