/// <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; } } }
/// <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; }