/// <summary>
        /// Инициализация списка объектов
        /// </summary>
        public virtual List<IAquariumObject> Init(AquariumInitializationParameters parameters, IAquariumPositionContext positionContext, AquariumObjectFactory factory)
        {
            List<IAquariumObject> aquariumObjects = new List<IAquariumObject>();

            GenerateFishes(parameters, aquariumObjects, positionContext, factory);
            GenerateSeaweeds(parameters, aquariumObjects, positionContext, factory);

            return aquariumObjects;
        }
 /// <summary>
 /// Генерация рыбок
 /// </summary>
 protected virtual void GenerateFishes(AquariumInitializationParameters parameters, List<IAquariumObject> aquariumObjects, IAquariumPositionContext positionContext, AquariumObjectFactory factory)
 {
     for (int fishNumber = 0; fishNumber < parameters.FishCount; fishNumber++)
     {
         // выбираем все параметры рыбок случайным образом
         FishParameters fishParameters = GetFishParameters(parameters, aquariumObjects, positionContext);
         IAquariumObject fish = factory.Create(AquariumObjectType.Fish, fishParameters);
         aquariumObjects.Add(fish);
     }
 }
 /// <summary>
 /// Подвинуть объект
 /// </summary>
 public void Move(IAquariumPositionContext aquarium, IAquariumMovableObjectEditable obj)
 {
     if (aquarium.IsPositionOutsideBorders(obj.X, obj.Y))
     {
         MoveBackToAquarium(aquarium, obj);
     }
     else
     {
         MoveAsUsual(aquarium, obj);
     }
 }
 /// <summary>
 /// Генерация водорослей
 /// </summary>
 protected virtual void GenerateSeaweeds(AquariumInitializationParameters parameters, List<IAquariumObject> aquariumObjects, IAquariumPositionContext positionContext, AquariumObjectFactory factory)
 {
     Random random = new Random();
     for (int seaweedNumber = 0; seaweedNumber < parameters.SeaweedCount; seaweedNumber++)
     {
         // выбираем все параметры водорослей случайным образом
         SeaweedParameters seaweedParameters = GetSeaweedParameters(parameters, aquariumObjects, positionContext);
         IAquariumObject seaweed = factory.Create(AquariumObjectType.Seaweed, seaweedParameters);
         aquariumObjects.Add(seaweed);
     }
 }
 /// <summary>
 /// Генерация параметров рыбок
 /// </summary>
 protected virtual FishParameters GetFishParameters(AquariumInitializationParameters parameters, List<IAquariumObject> aquariumObjects, IAquariumPositionContext positionContext)
 {
     return new FishParameters()
     {
         X = positionContext.GetRandomPosX(),
         Y = positionContext.GetRandomPosY(),
         SizeX = _random.Next(parameters.FishMinSizeX, parameters.FishMaxSizeX + 1),
         SizeY = _random.Next(parameters.FishMinSizeY, parameters.FishMaxSizeY + 1),
         Speed = _random.Next(parameters.FishMinSpeed, parameters.FishMaxSpeed + 1),
         MovementDirection = (Direction)_random.Next(DirectionHelper.DirectionCount),
         MovementStrategy = new SimpleMovementStrategy()
     };
 }
        /// <summary>
        /// Генерация параметров рыбок
        /// </summary>
        protected override FishParameters GetFishParameters(AquariumInitializationParameters parameters, List<IAquariumObject> aquariumObjects, IAquariumPositionContext positionContext)
        {
            FishParameters fishParameters = base.GetFishParameters(parameters, aquariumObjects, positionContext);

            AquariumInitializationParametersSinFishes aquariumParameters = parameters as AquariumInitializationParametersSinFishes;
            if (aquariumParameters != null)
            {
                if (_sinFishCount < aquariumParameters.SinFishCount)
                {
                    fishParameters.MovementStrategy = new SinMovementStrategyAdapter();

                    _sinFishCount++;
                }
            }

            return fishParameters;
        }
        /// <summary>
        /// Обычный алгоритм движения
        /// </summary>
        private void MoveAsUsual(IAquariumPositionContext aquarium, IAquariumMovableObjectEditable obj)
        {
            int nextX = GetNextPosX(obj);

            // Можно ли передвинуться в текущем направлении движения
            bool canMove = aquarium.IsValidPosition(nextX, obj.Y);
            if (!canMove)
            {
                // Пробуем поменять направление движения
                Direction oppositeDirection = obj.MovementDirection.GetOpposite();
                obj.MovementDirection = oppositeDirection;

                nextX = GetNextPosX(obj);

                canMove = aquarium.IsValidPosition(nextX, obj.Y);
            }

            // Повторно проверяем, что можем передвинуться
            if (canMove)
            {
                obj.X = nextX;
            }
        }
        /// <summary>
        /// Подвинуть объект
        /// </summary>
        public void MoveBySin(IAquariumPositionContext aquarium, IAquariumMovableObjectEditable obj)
        {
            if (aquarium.IsPositionOutsideBorders(obj.X, obj.Y))
            {
                aquarium.FixPosition(obj);
            }
            else
            {
                int shiftX = obj.MovementDirection == Direction.Right ? 1 : -1;
                int nextX = obj.X + shiftX * (obj.Speed / 10 + obj.SizeX / 2);

                int shiftY = Convert.ToInt32(Math.Sin(DateTime.Now.Second) * 10);
                int nextY = obj.Y + shiftY;

                // Можно ли передвинуться в текущем направлении движения
                bool canMove = aquarium.IsValidPosition(nextX, nextY);
                if (!canMove)
                {
                    // Пробуем поменять направление движения
                    Direction oppositeDirection = obj.MovementDirection.GetOpposite();
                    obj.MovementDirection = oppositeDirection;

                    shiftX = obj.MovementDirection == Direction.Right ? 1 : -1;
                    nextX = nextX = obj.X + shiftX * (obj.Speed / 10 + obj.SizeX / 2);

                    canMove = aquarium.IsValidPosition(nextX, nextY);
                }

                // Повторно проверяем, что можем передвинуться
                if (canMove)
                {
                    obj.X = nextX;
                    obj.Y = nextY;
                }
            }
        }
Esempio n. 9
0
 /// <summary>
 /// Подвинуть рыбку
 /// </summary>
 public void Move(IAquariumPositionContext aquarium)
 {
     if (MovementStrategy != null)
     {
         MovementStrategy.Move(aquarium, this);
     }
 }
 /// <summary>
 /// Подвинуть объект
 /// </summary>
 public void Move(IAquariumPositionContext aquarium, IAquariumMovableObjectEditable obj)
 {
     _strategy.MoveBySin(aquarium, obj);
 }
        /// <summary>
        /// Обработчик движения
        /// </summary>
        public override void Move(IAquariumPositionContext aquarium)
        {
            base.Move(aquarium);

            Tick();
        }
 /// <summary>
 /// Подвинуть объект
 /// </summary>
 public virtual void Move(IAquariumPositionContext aquarium)
 {
     _aquariumObject.Move(aquarium);
 }
 /// <summary>
 /// Объект ушел за пределы акварима
 /// </summary>
 private void MoveBackToAquarium(IAquariumPositionContext aquarium, IAquariumMovableObjectEditable obj)
 {
     aquarium.FixPosition(obj);
 }
        /// <summary>
        /// Генерация параметров водорослей
        /// </summary>
        protected virtual SeaweedParameters GetSeaweedParameters(AquariumInitializationParameters parameters, List<IAquariumObject> aquariumObjects, IAquariumPositionContext positionContext)
        {
            SeaweedParameters seaweedParameters = new SeaweedParameters()
            {
                X = positionContext.GetRandomPosX(),
                SizeX = _random.Next(parameters.SeaweedMinSizeX, parameters.SeaweedMaxSizeX + 1),
                SizeY = _random.Next(parameters.SeaweedMinSizeY, parameters.SeaweedMaxSizeY + 1),
            };

            seaweedParameters.Y = seaweedParameters.SizeY / 2;

            return seaweedParameters;
        }