コード例 #1
0
        /// <summary>
        /// Метод размещения элементарной клетки на поле
        /// </summary>
        /// <param name="target"></param>
        private void PlaceNum(Cell target)
        {
            var zero = map.GetNum(0);

            target.Actual = true;
            target.CheckPlace();
            if (target.Placed)
            {
                target.Actual = false;
                return;
            }
            while (!target.Placed)               //двигаем пока не поставим на своё место
            {
                map.MoveToNeighbourhood(target); //пока не будем рядом с целью
                Cell.Direction destination_side = target.GetDirectionToMove();

                /*
                 * определяем, в каком направлении двигаться
                 * приоритет: лево-право, вверх-вниз.
                 * определяем кратчайший для передвижения с учётом уже размещённых
                 */
                switch (zero.GetDirection(target)) //определяем, с какой стороны граничит с целью 0
                {
                case Cell.Direction.Up:            //0 снизу
                    switch (destination_side)      //определяем в каком направлении мы хотели бы передвинуть целевую клетку
                    {
                    case Cell.Direction.Up:        //если надо вверх
                        map.MoveRight(zero);
                        map.MoveUp(zero);
                        break;

                    case Cell.Direction.Right:        //надо вправо
                        map.MoveRight(zero);
                        map.MoveUp(zero);
                        break;

                    case Cell.Direction.Down:        //надо вниз
                        map.MoveUp(zero);
                        break;

                    case Cell.Direction.Left:        //надо влево
                        if (zero.CanLeft())
                        {
                            map.MoveLeft(zero);
                            map.MoveUp(zero);
                        }
                        else
                        {
                            map.MoveRight(zero);
                            map.MoveUp(zero);
                        }
                        break;

                    default:
                        break;
                    }
                    break;

                case Cell.Direction.Right:    //0 слева
                    switch (destination_side) //определяем в каком направлении мы хотели бы передвинуть целевую клетку
                    {
                    case Cell.Direction.Up:   //если надо вверх
                        if (zero.CanUp())
                        {
                            map.MoveUp(zero);
                            map.MoveRight(zero);
                        }
                        else
                        {
                            map.MoveDown(zero);
                            map.MoveRight(zero);
                        }
                        break;

                    case Cell.Direction.Right:        //надо вправо
                        if (zero.CanUp())
                        {
                            map.MoveUp(zero);
                            map.MoveRight(zero);
                        }
                        else
                        {
                            map.MoveDown(zero);
                            map.MoveRight(zero);
                        }
                        break;

                    case Cell.Direction.Down:        //надо вниз
                        if (zero.CanDown())
                        {
                            map.MoveDown(zero);
                            map.MoveRight(zero);
                        }
                        else if (zero.CanUp())
                        {
                            map.MoveUp(zero);
                            map.MoveRight(zero);
                        }
                        break;

                    case Cell.Direction.Left:        //надо влево
                        map.MoveRight(zero);
                        break;

                    default:
                        break;
                    }
                    break;

                case Cell.Direction.Down:     //0 сверху
                    switch (destination_side) //определяем в каком направлении мы хотели бы передвинуть целевую клетку
                    {
                    case Cell.Direction.Up:   //если надо вверх
                        map.MoveDown(zero);
                        break;

                    case Cell.Direction.Right:        //надо вправо
                        map.MoveRight(zero);
                        map.MoveDown(zero);
                        break;

                    case Cell.Direction.Down:        //надо вниз
                        map.MoveRight(zero);
                        map.MoveDown(zero);
                        break;

                    case Cell.Direction.Left:                   //надо влево
                        if (zero.CanLeft() && target.CanLeft()) //и слева не установленная клетка и целевая может идти влево
                        {
                            map.MoveLeft(zero);
                            map.MoveDown(zero);
                        }
                        else
                        {
                            map.MoveRight(zero);
                            map.MoveDown(zero);
                        }
                        break;

                    default:
                        break;
                    }
                    break;

                case Cell.Direction.Left:     //0 справа
                    switch (destination_side) //определяем в каком направлении мы хотели бы передвинуть целевую клетку
                    {
                    case Cell.Direction.Up:   //если надо вверх
                        map.MoveUp(zero);
                        map.MoveLeft(zero);
                        break;

                    case Cell.Direction.Right:        //надо вправо
                        map.MoveLeft(zero);
                        break;

                    case Cell.Direction.Down:        //надо вниз
                        map.MoveDown(zero);
                        map.MoveLeft(zero);
                        break;

                    case Cell.Direction.Left:        //надо влево
                        if ((zero.CanDown() && zero.Previous != "up") || target.Row == 0)
                        {
                            map.MoveDown(zero);
                            map.MoveLeft(zero);
                        }
                        else
                        {
                            map.MoveUp(zero);
                            map.MoveLeft(zero);
                        }
                        break;

                    default:
                        break;
                    }
                    break;

                default:
                    break;
                }
                target.CheckPlace();
            }
            target.Actual = false;
        }