Example #1
0
        /// <summary>
        /// Проверить возможность сменить выбранный элемент с элементом выбранного направления.
        /// </summary>
        /// <param name="direction">Направление проверки</param>
        /// <returns>Смена возможна</returns>
        public bool CheckSwap(MovementDirection direction)
        {
            if (_field.SelectedCell == null || _field.SelectedCell.Element == null)
            {
                return(false);
            }

            CellModel swipeElement = null;

            switch (direction)
            {
            case MovementDirection.Up:
                if (_field.SelectedCell.Y + 1 < _field.Height)
                {
                    swipeElement = _field.GetCell(_field.SelectedCell.X, _field.SelectedCell.Y + 1);
                }
                break;

            case MovementDirection.Right:
                if (_field.SelectedCell.X + 1 < _field.Width)
                {
                    swipeElement = _field.GetCell(_field.SelectedCell.X + 1, _field.SelectedCell.Y);
                }
                break;

            case MovementDirection.Down:
                if (_field.SelectedCell.Y - 1 >= 0)
                {
                    swipeElement = _field.GetCell(_field.SelectedCell.X, _field.SelectedCell.Y - 1);
                }
                break;

            case MovementDirection.Left:
                if (_field.SelectedCell.X - 1 >= 0)
                {
                    swipeElement = _field.GetCell(_field.SelectedCell.X - 1, _field.SelectedCell.Y);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException("direction", direction, null);
            }
            if (swipeElement == null || swipeElement.Element == null)
            {
                return(false);
            }

            if (!AvailableSwap(_field.SelectedCell.X, _field.SelectedCell.Y,
                               swipeElement.Element.Type, direction) &&
                !AvailableSwap(swipeElement.X, swipeElement.Y,
                               _field.SelectedCell.Element.Type, direction.InvertDirection()))
            {
                return(false);
            }

            return(true);
        }
Example #2
0
        /// <summary>
        /// Поменять местами элементы.
        /// </summary>
        /// <param name="cell">Ячейка с элементом для замены</param>
        /// <param name="direction">Направление замены</param>
        public void SwapElements(CellModel cell, MovementDirection direction)
        {
            if (WaitFinishMovementElements > 0)
            {
                return;
            }
            ElementModel firstElement;
            ElementModel secondElement;

            switch (direction)
            {
            case MovementDirection.Up:
                if (!_exchange.CheckSwap(MovementDirection.Up))
                {
                    return;
                }
                if (cell.Y + 1 >= _field.Height)
                {
                    return;
                }
                firstElement  = cell.Element;
                secondElement = _field.GetCell(cell.X, cell.Y + 1).Element;
                cell.SetElement(secondElement);
                _field.GetCell(cell.X, cell.Y + 1).SetElement(firstElement);
                break;

            case MovementDirection.Right:
                if (!_exchange.CheckSwap(MovementDirection.Right))
                {
                    return;
                }
                if (cell.X + 1 >= _field.Width)
                {
                    return;
                }
                firstElement  = cell.Element;
                secondElement = _field.GetCell(cell.X + 1, cell.Y).Element;
                cell.SetElement(secondElement);
                _field.GetCell(cell.X + 1, cell.Y).SetElement(firstElement);
                break;

            case MovementDirection.Down:
                if (!_exchange.CheckSwap(MovementDirection.Down))
                {
                    return;
                }
                if (cell.Y - 1 < 0)
                {
                    return;
                }
                firstElement  = cell.Element;
                secondElement = _field.GetCell(cell.X, cell.Y - 1).Element;
                cell.SetElement(secondElement);
                _field.GetCell(cell.X, cell.Y - 1).SetElement(firstElement);
                break;

            case MovementDirection.Left:
                if (!_exchange.CheckSwap(MovementDirection.Left))
                {
                    return;
                }
                if (cell.X - 1 < 0)
                {
                    return;
                }
                firstElement  = cell.Element;
                secondElement = _field.GetCell(cell.X - 1, cell.Y).Element;
                cell.SetElement(secondElement);
                _field.GetCell(cell.X - 1, cell.Y).SetElement(firstElement);
                break;

            default:
                throw new ArgumentOutOfRangeException("direction", direction, null);
            }
            if (firstElement != null && secondElement != null)
            {
                WaitFinishMovementElements = 2;
                firstElement.Swap(direction);
                secondElement.Swap(direction.InvertDirection());
            }
        }