Пример #1
0
        private static double GetUnitPositionBonus(
			Field field, Unit unit, ExecutionOptions options)
        {
            int minX = unit.GetMinX();
            int maxX = unit.GetMaxX();
            int minY = unit.GetMinY();
            int maxY = unit.GetMaxY();
            int depth = field.Height - minY;

            int width = maxX - maxY;

            int marginBottom = field.Height - maxY;

            int center = (maxX + minX) / 2;

            var attractor = GetBottomOpenPosition(field);

            double attractorDistance = Math.Abs(attractor.X - unit.Pivot.X); // attractor.DistanceTo(unit.Pivot);

            double depthPenalty = 0;
            foreach (var member in unit.Members)
            {
                depthPenalty += field.Height - 1 - member.Y;
            }

            int edgeBonus = 0;
            foreach (var position in unit.Members)
            {
                if (position.X == 0 || position.X == field.Width - 1)
                    edgeBonus += 1;
            }

            double adjacencyBonus = GetAdjacencyBonus(field, unit, options);

            return edgeBonus * options.EdgeRatio
                + adjacencyBonus
                - depthPenalty * options.DepthPenaltyRatio
                - attractorDistance * options.AttractorRatio;
        }