private static void PositionForLineFightInternal(
            [NotNull] GamePositionEventArgs eventArgs,
            GameTeam team,
            Point lineStart,
            Size lineDirection,
            int lineSize,
            Size rankDirection)
        {
            if (team == GameTeam.None)
            {
                throw new ArgumentException("Invalid value.", "team");
            }

            if (lineSize <= 0)
            {
                throw new ArgumentOutOfRangeException("lineSize", lineSize, @"The value must be positive.");
            }

            var rankStart = lineStart;
            var beakAngle = Vector2D.UnitX.GetAngle(new Vector2D(rankDirection));

            var remainingUnitStates = eventArgs.UnitStates.Where(obj => obj.Team == team).ToArray();

            while (remainingUnitStates.Length > 0)
            {
                var count      = Math.Min(remainingUnitStates.Length, lineSize);
                var unitStates = remainingUnitStates.Take(count).ToArray();
                remainingUnitStates = remainingUnitStates.Skip(count).ToArray();

                var step = (float)lineSize / unitStates.Length;

                for (var index = 0; index < unitStates.Length; index++)
                {
                    var unitState    = unitStates[index];
                    var position     = rankStart + lineDirection.MultiplyTruncated(step * index);
                    var realPosition = GameHelper.NominalToReal(position);
                    eventArgs.SetPosition(unitState, new DirectionalPosition(realPosition, beakAngle));
                }

                rankStart += rankDirection;
            }
        }
        public static void PositionRandomly(
            [NotNull] GamePositionEventArgs eventArgs,
            [CanBeNull] Random randomGenerator)
        {
            #region Argument Check

            if (eventArgs == null)
            {
                throw new ArgumentNullException("eventArgs");
            }

            #endregion

            var actualRandomGenerator = randomGenerator ?? DefaultRandomGenerator;

            for (var index = 0; index < eventArgs.UnitStates.Count; index++)
            {
                var unitState = eventArgs.UnitStates[index];

                Point2D position;
                do
                {
                    var nominalPosition = new Point(
                        actualRandomGenerator.Next(eventArgs.Data.NominalSize.Width),
                        actualRandomGenerator.Next(eventArgs.Data.NominalSize.Height));
                    position = GameHelper.NominalToReal(nominalPosition);
                }while (eventArgs.UnitStates.Take(index).Any(
                            item =>
                            eventArgs.GetPosition(item).Position.GetDistance(position) < GameConstants.NominalCellSize));

                var plainAngle = (float)Math.Floor(
                    MathHelper.HalfRevolutionDegrees
                    - actualRandomGenerator.NextDouble() * MathHelper.RevolutionDegrees);
                var angle = GameAngle.FromDegrees(plainAngle);

                eventArgs.SetPosition(unitState, new DirectionalPosition(position, angle));
            }
        }