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