Пример #1
0
        /// <summary>
        ///  <para>Возвращает спискок клеток по горизонтале. Если значении isOneStep равняеться true,  список с одним  </para>
        ///  <para>доступным элементом, если значение равняеться false, все доступные элементы по диагонале.</para>
        /// </summary>
        /// <param name="figure"></param>
        /// <param name="isOneStep"></param>
        /// <returns></returns>
        public static List <PointV2> GetHorisontal(IMotionInterfaceFigure figure, bool isOneStep)
        {
            #region messy code
            //PointV2 bufferPoint = new PointV2(GameBoard.Instance.zero, thisPosition.y);
            //result.Add(bufferPoint);
            //while (GameBoard.Instance.isOnTheChessboard(bufferPoint))
            //{
            //    bufferPoint += PointV2.right;
            //    if (!GameBoard.Instance.isOnTheChessboard(bufferPoint))
            //        break;
            //    result.Add(bufferPoint);
            //}
            #endregion

            List <PointV2> result = new List <PointV2>();

            // Добавляет к результату, множества точек, относительно заданых параметров.
            if (!isOneStep)
            {
                result.AddRange(BustPoints(figure, PointV2.left));
                result.AddRange(BustPoints(figure, PointV2.right));
            }
            // Добавляет к результату один шаг, относительно заданых параметров.
            else
            {
                result.AddRange(BustPoints(figure, PointV2.left, isOneStep));
                result.AddRange(BustPoints(figure, PointV2.right, isOneStep));
            }
            return(result);
        }
Пример #2
0
        /// <summary>
        /// Возвращает список доступных клеток относительно текущей позиции фигуры, в указаном направлении.
        /// </summary>
        /// <param name="figure"></param>
        /// <param name="dir"></param>
        /// <returns></returns>
        static private List <PointV2> BustPoints(IMotionInterfaceFigure figure, PointV2 dir)
        {
            // Временно значение точки изменяемое каждую итерацию.
            PointV2 BufferPoint,
            // Позиция фигуры относительно которой вычисляються точки.
                    position = figure.position;

            List <PointV2> result = new List <PointV2>();

            // Вычисление начальной точки, с которой будет вестись последующие вычисления.
            // Позиция фигуры не учитываеться !!!
            BufferPoint = position + dir;

            // Все вычисление ведутся пока точка находиться в пределах игровой доски.
            while (GameBoard.Instance.isOnTheChessboard(BufferPoint))
            {
                // Еслм точка выходит за границу доски - выход из цыкла.
                if (!GameBoard.Instance.isOnTheChessboard(BufferPoint))
                {
                    break;
                }

                // Если фигуре доступен шаг на текушую точку 'BufferPoint', добавляем в список-результат.
                // Интерфейс IMotionInterfaceFigure предоставляет метод который содержит каждая фигура
                // и который определяет доступна ли точка для шага данной фигуры.
                if (figure.GetIsAvailableForActions(BufferPoint))
                {
                    result.Add(BufferPoint);
                    // Шаг в заданом направлении.
                    BufferPoint += dir;
                }
                // Если точка недоступна, все последующие так же не доступны по правилам шахмат.
                // выход из цыкла.
                // Данное правило обходит только фигуру'конь'.
                else
                {
                    break;
                }
            }

            return(result);
        }
Пример #3
0
        /// <summary>
        /// Возвращает список доступных клеток в один шаг, относительно текущей позиции фигуры, в указаном направлении.
        /// </summary>
        /// <param name="figure"></param>
        /// <param name="dir"></param>
        /// <param name="isOneStep"></param>
        /// <returns></returns>
        static private List <PointV2> BustPoints(IMotionInterfaceFigure figure, PointV2 dir, bool isOneStep)
        {
            // Временно значение точки изменяемое каждую итерацию.
            PointV2 BufferPoint,
            // Позиция фигуры относительно которой вычисляються точки.
                    position = figure.position;

            List <PointV2> result = new List <PointV2>();

            //Вычисление начальной точки, с которой будет вестись последующие вычисления.
            BufferPoint = position + dir;

            // Если фигуре доступен шаг на текушую точку 'BufferPoint', добавляем в список-результат.
            // Интерфейс IMotionInterfaceFigure предоставляет метод который содержит каждая фигура
            // и который определяет доступна ли точка для шага данной фигуры.
            if (figure.GetIsAvailableForActions(BufferPoint))
            {
                result.Add(BufferPoint);
            }
            // Данная функция возвращает по сути лишь одну точку, один шаг.
            // Поэтому возвращаем результат, после вычисления.

            return(result);
        }
Пример #4
0
        /// <summary>
        ///  Возвращает список  клеток по диагонале А - прямая линия относительно текущей позиции состоящая из множества клеток,
        /// соединющих углы (нижний левый - верхний парвый) условной матрицы , которой являеться игровое поле.
        /// </summary>
        /// <param name="figure"></param>
        /// <param name="isOneStep"></param>
        /// <returns></returns>
        public static List <PointV2> GetDiagonaleA(IMotionInterfaceFigure figure, bool isOneStep)
        {
            #region messy code
            //List<PointV2> result = new List<PointV2>();

            //PointV2 BufferPoint = new PointV2();
            //// Длинна диагонали
            //int diagonaleLenght = 0;


            //// Вычисление  diagonaleLenght
            //if (position.x < position.y)
            //    diagonaleLenght = GameBoard.Instance.height + position.x - position.y;
            //else if (position.x > position.y & position.x != position.y)
            //    diagonaleLenght = GameBoard.Instance.height + position.y - position.x;
            //else diagonaleLenght = GameBoard.Instance.height;


            //// Если х <=  у параметра position, начальная точка ( 1 по х, у   длинна диагонали).
            ////  if (position.x <= position.y)
            //BufferPoint = new PointV2(GameBoard.Instance.zero, diagonaleLenght);
            //// Иначе  начальная точка  ( ширина игровой доски - (длинна диагонали - 1), у 1).
            //// Тоесть, начальная точка что лежит на побочной диагонали, если! она ниже основной.
            ////                            НЕОБХОДИМО ТЕСТИРОВАТЬ.
            ////  else
            /////     BufferPoint = new PointV2(GameBoard.Instance.width - (diagonaleLenght - 1), GameBoard.Instance.zero);


            //while (GameBoard.Instance.isOnTheChessboard(BufferPoint))
            //{
            //    result.Add(BufferPoint);
            //    BufferPoint += PointV2.up + PointV2.right;
            //    if (!GameBoard.Instance.isOnTheChessboard(BufferPoint))
            //        break;
            //}


            //return result;
            #endregion

            // FIX
            // Направление вниз и влево.
            PointV2 dirDownAndLeft = (PointV2.down + PointV2.left),
            // Направление вверх и вправо
                    dirUpAndright = (PointV2.up + PointV2.right);

            List <PointV2> result = new List <PointV2>();
            // Добавляет к результату, множества точек, относительно заданых параметров.

            if (!isOneStep)
            {
                result.AddRange(BustPoints(figure, dirDownAndLeft));
                result.AddRange(BustPoints(figure, dirUpAndright));
            }
            // Добавляет к результату один шаг, относительно заданых параметров.
            else
            {
                result.AddRange(BustPoints(figure, dirDownAndLeft, isOneStep));
                result.AddRange(BustPoints(figure, dirUpAndright, isOneStep));
            }
            return(result);
        }