using System.Collections.Generic; namespace MorgSimulator.Framework { public abstract class Simulator where T : Entity { protected readonly List _entities = []; protected const double FEEDING_DISTANCE = 1.0; public void AddEntity(T entity) { _entities.Add(entity); } public IEnumerable GetAllEntities() { return _entities; } public IEntityIterator CreateIterator() { return new EntityIterator(_entities); } public void Run(int runTime) { for (int timeStep = 0; timeStep < runTime; timeStep++) ProcessTimeStep(); } protected virtual void ProcessTimeStep() { foreach (var entity in _entities) if (entity.IsAlive) { FindPreyIfNeeded(entity); entity.Move(); CheckAndFeed(entity); } } protected virtual void FindPreyIfNeeded(T entity) { if (entity.Prey == null || !entity.Prey.IsAlive) { var nearestPrey = FindNearestPrey(entity); if (nearestPrey != null) { nearestPrey.Attach(entity); entity.Prey = nearestPrey as T; entity.Direction = entity.CalculateDirectionToTarget(nearestPrey.Location); } } } protected virtual void CheckAndFeed(T entity) { if (entity.Prey != null && entity.Prey.IsAlive && entity.DistanceTo(entity.Prey.Location) <= FEEDING_DISTANCE) entity.Feed(); } #nullable enable protected abstract Entity? FindNearestPrey(T predator); #nullable disable } }